Понятие объектно-ориентированного программирования

Объектно-ориентированное программирование (ООП)

Объектно-ориентированное программирование (ООП) — методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определённого класса, а классы образуют иерархию наследования.

Идеологически ООП — подход к программированию как к моделированию информационных объектов, решающий основную задачу структурного программирования:

  • структурирование информации с точки зрения управляемости, что существенно улучшает управляемость самим процессом моделирования при реализации крупных проектов.

Целесообразность ООП предполагается в следующих случаях:

  1. сложная и (или) иерархическая структура объектов (предметов), подлежащих моделированию;
  2. большой объем (сложность) модели (проекта);
  3. значительное количество разработчиков, участвующих в проекте;
  4. высокая вероятность частых и (или) глубоких изменений модели.

Указанные выше задача и свойства достигаются с помощью основных принципов ООП.

Основные принципы ООП:

1) абстракция;

Абстракция - это использование только тех характеристик объекта, которые с достаточной точностью представляют его в данной системе; это выделение в моделируемом предмете сущностей, важных для решения конкретной задачи (выделение значимой информации и исключение из рассмотрения не значимой). Основная идея состоит в том, чтобы представить объект минимальным, но достаточным для решаемой задачи, набором полей (свойств) и методов.

Является основой объектно-ориентированного программирования и позволяет работать с объектами, не вдаваясь в особенности их реализации. 

Указанное выше контекстное понимание предмета в общем случае формализуется в виде класса.

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

Замечание: абстрагирование не является атрибутом исключительно ООП, да и вообще программирования.

[свернуть]
2) инкапсуляция;

Инкапсуляция — свойство системы, позволяющее объединить свойства (данные) и методы (поведение), работающие с ними, в классе. При этом инкапсуляция означает что класс должен защищать целостность данных, которые он инкапсулирует.

Пример свойств и методов

Возьмем человека как объект.

Рост, вес, возраст — свойства (или данные).

Ходить, спать, сидеть — методы (или поведение).

[свернуть]

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

Т. о. суть инкапсуляции - в быстрой и безопасной организации иерархической управляемости через сокрытие собственно реализации (чтобы было достаточно простой команды «что делать», без одновременного уточнения как именно делать).

[свернуть]
3) наследование;

Наследование — свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью.

Класс, от которого производится наследование, называется базовым, родительским или суперклассом.

Новый класс — потомком, наследником, дочерним или производным классом.

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

JavaScript вместо наследования использует прототипирование: если искомого свойства или вызванного метода в самом объекте нет, то запрос передаётся объекту-прототипу (свойство prototype всех объектов JavaScript).

Объект, от которого произошло наследование называется прототипом, и унаследованные свойства могут быть найдены в объекте prototype конструктора.

Поведение всех объектов класса можно поменять, заменив один из методов прототипа (например, добавив метода .toBASE64 для класса String).

[свернуть]
4) полиморфизм.

Полиморфизм подтипов (в ООП называемый просто «полиморфизмом») — свойство системы, позволяющее использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта; это способность объекта выбирать правильный метод в зависимости от типа данных, полученных в сообщении.

Цель полиморфизма (применительно к объектно-ориентированному программированию): использование одного имени для задания общих для класса действий, при этом выполнение каждого конкретного действия будет определяться типом данных.

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

[свернуть]

JavaScript вместо наследования использует прототипирование: если искомого свойства или вызванного метода в самом объекте нет, то запрос передаётся объекту-прототипу (свойство prototype всех объектов JavaScript).

Понятие "класс" в ООП

Класс — универсальный, комплексный тип данных, состоящий из тематически единого набора «полей» (переменных более элементарных типов) и «методов» (функций для работы с этими полями).

Класс является моделью информационной сущности с внутренним и внешним интерфейсами для оперирования своим содержимым (значениями полей).

В частности, в классах широко используются специальные блоки из одного или чаще двух спаренных методов, отвечающих за элементарные операции с определённым полем (интерфейс присваивания и считывания значения), которые имитируют непосредственный доступ к полю. Другим проявлением интерфейсной природы класса является то, что при копировании соответствующей переменной через присваивание копируется только интерфейс, но не сами данные, то есть класс — ссылочный тип данных.

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

В свою очередь, целостность предметной области объектов и их интерфейсов, а также удобство их проектирования, обеспечивается наследованием.

Понятие "объект" в ООП

Сущность в адресном пространстве вычислительной системы, появляющаяся при создании экземпляра класса (например, после запуска результатов компиляции и связывания исходного кода на выполнение).

Объект — это появляющийся при создании экземпляра класса набор свойств и их значений в памяти,  на которые можно сослаться с помощью идентификатора:

  • каждое свойство состоит из имени и значения, ассоциированного с этим именем;
  • значением свойства может быть функция, которую можно назвать методом объекта

JavaScript спроектирован на основе простой концепции, в основе которой лежат простые объекты. В дополнение к встроенным в браузер объектам, вы можете определить свои собственные объекты.

Свойства объекта в JavaScript

В JavaScript объект имеет свойства, ассоциированные с ним. Свойство объекта:

  • можно понимать как переменную, закрепленную за объектом;
  • определяют характеристики объекта.

Получение доступа к свойству объекта:

Примеры:

Неопределенные свойства объекта являются undefined (а не null).

Как и все переменные JavaScript, имя объекта (которое тоже может быть переменной) и имя свойства являются чувствительными к регистру.

Все ключи с квадратными скобками преобразуются в тип String, поскольку объекты в JavaScript могут иметь в качестве ключа только тип String.

Имена свойств объекта могут быть строками JavaScript, или тем, что может быть сконвертировано в строку, включая пустую строку. Как бы то ни было, доступ к любому имени свойства, которое содержит невалидный JavaScript идентификатор (например, имя свойства содержит в себе пробел и тире или начинается с цифры), может быть получен с использованием квадратных скобок. Этот способ записи также полезен, когда имена свойств должны быть динамически определены (когда имя свойства не определено до момента исполнения).

Примеры

Отсюда

Обратите внимание, что все ключи с квадратными скобками преобразуются в тип String, поскольку объекты в JavaScript могут иметь в качестве ключа только тип String. Например, в приведенном выше коде, когда ключ obj добавляется в myObj, JavaScript вызывает метод obj.toString () и использует эту результирующую строку в качестве нового ключа.

[свернуть]

Создание объекта в JavaScript

В общем случае, в JavaScript новые объекты могут создаваться следующими способами:

  1. пустой объект:
    • с помощью фигурных скобок {…} с необязательным списком свойств (литеральная нотация);
    • методом Object.create(null);
  2. с помощью функции-"конструктора" объекта (через new Object(nameKlass), где nameKlass - функция-конструктор);
  3. клонировать существующий объект и расширить его:
    • делегированием через прототипы (объект ссылается или делегирует другому объекту):
      1. с помощью метода Object.create(nameKlass) (создание объекта из прототипа nameKlass);
      2. с использованием constructor;
    • конкатенацией объектов (объект формируется путем добавления новых свойств к объекту из других существующих объектов).

Особенности создания объектов различными способами

Особенности создания пустого объекта:

Создание объектов различными способами с передачей объекта в качестве аргумента:

[свернуть]
C помощью метода Object.create(nameKlass) (создание объекта из прототипа)

Метод Object.create() создаёт новый объект с указанными объектом прототипа и свойствами.

Параметры:

  • proto -  объект, который станет прототипом вновь созданного объекта;
  • propertiesObject -  (необязательный параметр) объект, чьи собственные перечисляемые свойства (то есть такие, которые определены на самом объекте, а не унаследованы по цепочке прототипов) указывают дескрипторы свойств, добавляемых в новый объект.

Метод Object.create() возвращает новый объект (не копию по ссылке) с заданным прототипом и свойствами.

[свернуть]

Обычно используют вариант с фигурными скобками {...}. Такое объявление называют литералом объекта (литеральной нотацией).

Литеральная инициализация объекта сразу задаёт определённое количество начальных свойств (полей), но в процессе работы приложения свойства (поля) объекта могут добавляться и (или) удаляться.

Таким образом, при использовании литерального синтаксиса {...} мы сразу можем:

  • сразу поместить в объект несколько свойств в виде пар «ключ: значение»;
  • создать пустой объект и добавить в него свойства позже.
Примеры

[свернуть]

Объект, объявленный через const, может быть изменён. Объявление const защищает от изменений только само именование объекта (в примере выше - nameObject), но не его свойства. 

В реальном коде часто необходимо использовать существующие переменные как значения для свойств с тем же именем.

Например:

В примере выше название свойств name и age совпадают с названиями переменных, которые мы подставляем в качестве значений этих свойств.  Вместо name:name мы можем написать просто name:

Замечание: Зарезервированные слова разрешено использовать как имена свойств (в отличие от имён переменных, которые не могут совпадать с зарезервированными словами, такими как «for», «let», «return» и т.д.)

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.