Рубрики
Без рубрики

Понимание объектов из перспективы самообслуживания

При изучении Python или JavaScript вам можно сказать, что «все объект», с небольшим количеством … Помечено OOP, Python, C ++, JavaScript.

При обучении Python или JavaScript вам можно сказать, что «все объект», с небольшим, без разработки. Учебные пособия по программному архитектуру сосредоточены почти полностью на объекте ориентированного на программирование, но никогда не говорите о том, что эти вещи или почему мы все их используем. Особенно приходит с более высокого уровня языка, такого как Python, он может быть очень неприятным, что вы делаете, когда вы создаете класс, а затем используете этот класс для создания объекта. Поэтому я решил написать краткое описание того, какие объекты являются, что они не являются, и когда я думаю, что это хорошая идея, чтобы их использовать.

Что такое объект?

Нижний уровень – Организация памяти

Одним из недостатков начинания с высоким уровнем языка, такого как Python – это компьютерное оборудование, полностью расстраивается, включая фактические данные, хранящиеся в памяти. Но чтобы понять, какой это объект, вам нужно сначала знать, как хранится данные (и если вы хотите, чтобы приятное забавное, чтобы проверить Нанда игра ). Все данные в памяти хранятся как 1s и 0s, в дискретных блоках. Обычно эти блоки составляют 32 или 64 бита, каждый бит является одним из 1 или 0 («укус» компьютера). Все данные всех типов хранятся таким образом, и это имеет решающее значение для понимания. На языках высокого уровня вы никогда не получаете работу с такими видами данных, но на языках низкого уровня, такими как C ++, это встроенные типы, такие как int, float, или char. Когда вы создаете новую переменную, компьютер захватывает блок памяти и заполняет его этими данными. На рисунке выше код слева приводит к выделению памяти, выделенного справа. Важно отметить, что эти переменные могут быть сохранены рядом друг с другом или нет, нет никакой гарантии, где они будут в конечном итоге. Расположение этого блока в памяти является его адрес, и этот адрес сам хранится как фундаментальный тип данных, называемый указателем. Теперь мы добираемся до важной части, поскольку компьютер может хранить только одну вещь в одном блоке, и адреса наполняют целый блок самостоятельно, как компьютер может хранить более сложные структуры данных? Позвольте сказать, что мы хотим хранить массив из 3 int, как в коде выше. На языке высокого уровня вы создаете объект списка и работаете с этим, но на языках более низкого уровня вы вместо этого задали компьютеру на 3 блока данных и получите указатель на первый из 3 блоков. Теперь вы вышли за рамки одного блока, и вы можете сделать это, потому что вы знаете, что компьютер зарезервировал 3 блока для вас. В отличие от ранее, три блока гарантированно могут быть рядом друг с другом. Это «карта» от того места, где есть ваши данные, и довольно просты. Пересекание через ваши данные так же просто, как и перемещение одного блока данных за раз. Теперь, скажем, у вас есть больше вещей, которые вы хотите хранить. Не просто int, но, может быть, int и char и float. Ну, вы можете задать компьютер для трех блоков, прилегающих друг к другу, а затем пройти через него. Это, по сути, какой класс является карта того, как добраться до данных в памяти из указанной отправной точки. В приведенном выше примере все данные являются фундаментальными типами, поэтому компилятор может создать это с тремя блоками соседних данных, но ему не нужно. Когда вы пишете класс, то, что вы делаете, выкладывают какие типы данных, которые вы хотите получить доступ при работе с этим объектом. Когда вы создаете экземпляр объекта, компьютер выключается и захватывает несколько блоков данных, зарезервирует их для вас, а затем дает вам указатель, чтобы получить эти данные. То, как он выложен, может стать очень сложным, возможно, вместо данных оно просто сохраняет список адресов. Это зависит от того, как реализуется язык программирования, но в конце концов это все равно. Это план для того, чтобы как хранить данные в памяти, и каждый раз, когда вы создаете объект, компьютер будет хранить данные точно так же, и, следовательно, он будет знать, как вообще получать данные, просто данные указатель на начало и карта.

Эти части данных называются атрибутами, а в Python, JavaScript и C ++ их доступ к Отказ Оператор (в C ++ их можно получить доступ к оператору -> при использовании указателей). Что делает программа позади сцен, идет на начальное местоположение этого объекта, проверка того, где этот атрибут должен быть расположен по сравнению с этим начальным местоположением на основе класса, а затем возвращать все, что в этом месте в памяти. Возможно, вы слышали C ++ – это «небезопасный», что означает, что вы можете напрямую манипулировать указателями и может случайно оказаться за пределами данных объекта и возиться с данными разных объектов. Python не позволяет вам сделать это, вы можете использовать логику Python для прохождения памяти, которая очень прочная.

Когда все является объектом

Так что это значит, когда «все является объектом»? Ну, в статически типизированном языке, существует большая разница между фундаментальным типом и объектом. Когда вы создаете фундаментальный тип, он собирается указывать на один блок памяти. В принципе, вы могли бы поменять это любым другим фундаментальным типом, и есть методы для этого. Но когда вы создаете объект, компьютер будет схватить набор блоков для вас и заполнить их данные. Некоторые из этих блоков будут адреса, а некоторые будут фундаментальными типами. Некоторые из них будут адресами на другие объекты, которые компьютер также понадобится выделить. В Python и JavaScript вам не дают доступ к фундаментальным типам. Вы всегда создаете более сложный объект.

Методы

Пока я говорил об объектах, которые хранят только данные. Но есть еще одна половина к объектам, конечно, методы или функции членов. Позволяет использовать следующий пример код для класса, который сохраняет некоторые данные и соответствует функции для этих данных. Во-первых, реализован без каких-либо классов:

myDict = {"data": [], "fitParams": [], "fit": [], "res": []}
def data_function(x, *params):
    # The function we are trying to fit to a data set

def fit_data(myDict, data_function):
    # Run a fit routine, store parameters, fit, and 
    # residual data in fitParams, fit, and res

def calculate_val(myDict, data_function, x):
    # return the result at x for the predicted function

У нас есть словарь с некоторыми конкретно называемыми типами данных, у нас есть некоторые функции, которые принимают этот словарь и функцию в качестве аргументов. Теперь давайте сделаем то же самое с классом:

class myFitter():
    def __init__(self, data, func):
        data = data
        fitParams = []
        fit = []
        res = []
        data_function = func

    def fit_data(self):
        # Run a fit routine, store parameters, fit, and 
        # residual data in fitParams, fit, and res

    def calculate_val(self, x):
        # return the result at x for the predicted function

Посмотрите на аргументы в класс методах. Вы заметите, что главное отличие – Мидикт теперь заменяется на себя . По сути, эти два точно такие же. На самом деле, для языков, написанных без каких-либо классов, это довольно распространенный способ написать код. Сначала определите, как будут храниться данные, то напишите набор функций, которые все сгруппированы вместе их совместным использованием данных. В Python есть даже __dict__ Атрибут, который сам – это словарь, отслеживающий все атрибуты класса. Возвращаясь к нижнему уровню, информация, необходимая для создания объекта, является классом. Это говорит к компьютеру, какая память необходима и где программа ожидает, чтобы найти ее. Это также может включать указатели на функции, которые будут работать на эти данные. Отказ Оператор будет направлять компьютер к некоторому расположению в памяти на основе имени и получить некоторые данные или метод. Специальный аспект функций членов заключается в том, что они неявно или явно передали указатель на объект, который их называют. Другими словами, они знают, что они являются членами класса, а также знают, кто их называет. Это означает, что они могут получить доступ к всем другим функциям участника в классе, а также все данные, хранящиеся в объекте.

Наследование

Наследование, просто означает, что вместо того, чтобы рисовать вашу карту с нуля, вы начинаете с ранее нарисованной карты и расширяете ее. Нет никакой разницы между копией и вставлению всего кода из базового класса и наследование от нее, особенно на языках, таких как Python, который не хватает частных членов и атрибутов. Это хороший способ повторно использовать код или внести небольшие вариации на существующий класс.

Что не объект не?

Они не реальный мир объекты

Объекты часто вводятся, сравнивая их с реальными объектами жизни, таких как стулья или ведра. Проблема в том, что компьютеры на самом деле не хранят стулья и ведра, они хранят 1s и 0s. Это что-то совершенно блеск в учебных пособиях кодирования, но очень важно понять объекты – объекты являются удобными способами хранения данных. Помните, что объект – это только некоторые данные и некоторые методы, которые манипулируют этими данными. Я настоятельно рекомендую Это Лекция Екатериной Западом для более экспертов посмотреть, почему это плохой способ подумать об объектах, но в кратких реальных объектах мира взаимодействуют друг с другом, совершенно отличаются от того, как взаимодействуют компьютерные объекты. Если человек поднимает стекло, позиционные «данные» стекла были изменены. Но кто изменил эти данные? Не сам стакан. Но в Оопе вы ожидаете, что данные стекла будут частными, и стекло всегда будет нести ответственность за движение. И эта разбивка идет дальше, и даже имеет программы производительности компьютера.

Скорее всего, вы не будете заботиться о ударении производительности, но с точки зрения проектирования вашего кода можно проблематично подумать о них таким образом. Хорошо разработанный объект имеет атрибуты, которые все связаны друг с другом методами, которые все необходимы и связаны. Если вы сделаете объект «стула», он может иметь материал, положение, размер, вес, цену, стиль и возраст. Вам когда-нибудь понадобится все это сразу? Возможно, стиль и возраст получают вместе с ценой, но позиция влияет на цену? Вес влияет на возраст? В таком случае, Зачем вообще объединить все эти атрибуты?

Позвольте сказать, что у вас есть мебельный магазин, и вы хотите отслеживать мебель. Вы создаете класс стула, диван-класс и так далее. У каждого из них есть разные типы данных, а затем вы храните все запасы в одном крупном мастер-классе или массиве. За исключением того, что вы заботитесь о данных. Вы можете просто захотеть список цен, чтобы получить приблизительную оценку запасов. Или вы можете просто захотите узнать, сколько места у вас доступно для большего количества запасов. Вместо этого вы можете иметь массив данных положения, массив цен, массив типов и т. Д. Это дискуссия «Array of structs vs struct of Race», если вы хотите прочитать дальше, потому что есть случай для обоих. Однако в большинстве случаев вы захотите структуру подхода массивов.

Они не делают Code Cleaner или более Perfactive

Одной из причин, по которой я часто вижу, как с использованием объектов – избегать «спагетти». Предполагается, что при использовании объектов и наследования вы можете как-то избежать запутанного набора функций, которые зависят друг от друга по странным способам. Это вообще не правда. Классы могут очень легко стать спагетти, если ваши функции не совсем написаны, или если класс заканчивается с помощью 100 функций элементов и 20 атрибутов данных. Еще хуже, теперь вы вводите вопрос о сложных иерархиях наследования, где класс наследует класс, который унаследовал класс и так далее. Откуда вы знаете, какие методы безопасны переопределить? Как вы даже знаете, что вы переопределяете родительский метод без двойной проверки всего семейного дерева?

Итак, почему классы и объекты?

Организация данных

Иногда вы можете встретиться с кем-то, смягчительно со ссылкой на функцию языка программирования как «синтаксический сахар», означающий, что он просто изменяет синтаксис без основных последствий производительности. Но каждая особенность каждого языка программирования, вправо к использованию букв и цифр, является синтаксическим сахаром. Если вы не пишу код сборки, вы используете синтаксический сахар. И это все классы, синтаксический сахар. Возьмите следующий пример:

def func(a, b, c, d, e, f, g, h, i, j):
    # Do some stuff with lots of variables

myDict = {'a': 0, 'b': 2 ...

def func2(myDict):
    # Do the same stuff but with one dictionary

class Obj():
    def __init__(self, a, b, c, ...
        a = a
        b = b
        ...

    def func3(self):
        # Do the same stuff but now no arguments at all

Первым примером является чрезвычайно неуклюжем, никто не хочет ввести, что многие параметры каждый раз, когда вызывается функция, и иногда вам нужны много данных. Вторым примером группирует данные вместе, чтобы вы могли удобно передавать его на функцию. Это намного лучше, и помогает держать код более организованным. Окончательный пример вообще добавляет ничего, просто делает класс. Но если ФУНК Было особенно сложно, вы можете использовать класс, чтобы разбить функцию одного большого элемента в несколько разных функций элементов для улучшения ясности. Но важно не делать предметы слишком большими, в противном случае они быстро становится незаконным. Подумайте об объектах как удобных способах организовывать данные и построить их вокруг этого.

Вы можете реализовать сложные типы данных

Даже без проведения курса структур данных вы можете построить свой собственный тип данных. Может быть, у вас есть список дат, и вы хотите иметь возможность изменить все даты одновременно. Вы можете сделать класс, который обернут простой список и иметь set_new_start Метод, который устанавливает новую отправную точку, что все даты ссылки. Может быть, вы хотите хранить абсолютные и относительные даты. Объект помогает вам контролировать, как хранится данные и изменены.

Они помогают модулировать большие базы кода

Для простых задач объект должен храниться как можно меньше, но объекты имеют один случай, я знаю, где они будут очень большими и сложными. В больших базах кода с тысячами строк кода объекты являются удобными способами прохождения больших частей самого программного обеспечения. Например, давайте скажем, у вас есть графический интерфейс, вы строите, чтобы проанализировать данные. У вас может быть главное окно, некоторые входы и дисплей. Главное окно может быть объектом, который также обрабатывает хранилище данных и быть родителем к входам и отображению. Это может передавать сообщения между ними. И входы могут выполнять некоторые входные проверки перед передачей по сообщениям. Разрушение кода, этот путь позволяет назначить одного человека одному виджету или группу виджетов. Взаимодействие между объектами хорошо определено, поэтому отдельных разработчиков получают больше свободы в создании внутренних органов их кода, не беспокоясь о том, чтобы наступить на чьи-то пальцы.

Вывод

Объекты – отличный инструмент для написания кода, но не цель в и самих. Я очень рекомендую вам попробовать свой следующий проект хобби без классов.

Я надеюсь, что это было полезно, дайте мне знать, что вы думаете!

Оригинал: “https://dev.to/rwalroth/understanding-objects-from-a-self-taught-perspective-1546”