OOP Flashcards
Базовые принципы ООП
ООП начинается с построения абстракции.
Принципы:
- наследование;
- инкапсуляцию;
- полиморфизм.
Наследование в ООП
Это механизм, позволяющий описать новый класс на основе уже существующего с добавлением новых свойств и методов.
Если мы создали модель пассажирского самолета на 120 мест, а потом чуть-чуть доработали увеличив количество мест до 130, нам не потребуется создавать новый чертеж, достаточно лишь указать изменения. Так мы не делаем копию чертежей, мы только описываем, что изменилось в проекте. Это наследование.
class newClass extends oldClass {
constructor(name){
super(name);
}
super - ссылка на родительский property, которая присутствует в каждом методе. С ее помощью мы имеем доступ к методам из базового класса.
У стрелочных функций нет super, при обращении он берется из внешней функции.
Инкапсуляция в ООП
Это скрытие каких-то реализаций (от прямого обращения к ним), то есть использование этих реализаций, не думая о том, как именно оно реализовано. Данные в таком случае можно посмотреть, но обратиться к ним - нет. Это контролируемый доступ.
Полиморфизм в ООП
Это возможность применения в данном контексте свойств и методов, которые внутри отдельной сущности могут меняться, при этом работая по одному правилу.
Также это возможность иметь множество реализаций одного интерфейса в классах-наследниках в зависимости от выполняемых задач.
Если мы сделали унифицированную модель самолет с определенным размахом крыльев и 2 реактивными двигателями, мы можем быть уверены, что любой из наших самолетов по этой модели сможет сесть на ВПП, предназначенную для данного типа самолета (не зависимо от того как они будут садиться).
Ассоциация в ООП
Один объект становится составной частью другого объекта.
Если мы разрабатываем трап, подходящий под этот тип самолета (и, возможно, другие подробные самолеты), пилот самолета при приземлении просит подать именно этот трап.
Бывает 2х видов:
1. Композиция - жизненный цикл дочернего объекта совпадает с жизненным циклом родительского объекта.
Если мы делаем самолет, но двигатель разрабатывает другая команда, нам проще не указывать его на самом чертеже самолета (тем более что один двигатель может использовать на большом количестве самолетов), а только указать «смотри чертеж такого-то двигателя».
- Агрегация - жизненный цикл дочернего объекта не зависит от жизненного цикла родительского и может использоваться другими объектами.
SRP - single responsible principle
Один класс должен отвечать только за какую-то одну задачу.
Класс в ООП
Это описание того какими свойствами и поведением будет обладать объект.
В классе нельзя писать переменные.
- Класс не может быть вызван как функция, обязательно слово new в начале.
- В классе не может быть больше одного constructor.
- Нельзя сначала создать инстанс, а потом объявить класс, т.к. классы не хойстятся. Поэтому хороший тон описывать каждый класс в отдельном файле.
Объект (инстанс) класса
Это экземпляр класса, с собственными состояниями свойств, прописанных в классе.
Это не упорядоченная, динамическая коллекция некоторых свойств.
Если мы произведем реальный самолет это будет инстанс (объект) класса. Он построен по конкретным чертежам, но его параметры изменяются со временем, например, его максимальная и крейсерская скорость может чуть уменьшиться после определенных лет налета.
Свойства класса
= переменные = атрибуты объекта = поля объекта
У каждой модели самолета есть общие параметры, например, процент аварийности. Каждое происшествие с любым самолетом этой модели его может изменить. Это статические методы и переменные класса.
Методы класса
= поведение = функции = атрибуты объекта
Мы должны определить как наш будущий самолет будет садиться, взлетать, как он будет летать.
this в ООП
Это локальная переменная для обращения объекта из своих методов к своим переменным.
constructor
Метод, который автоматически вызывается при создании объекта, может принимать любые аргументы. Он производит первоначальную инициацию объекта и заполняет нужные поля.
В него мы кладем то, что необходимо для создания объекта + начальные его значения.
В constructor обязательно использование this.
При наследовали в constructor желательно всегда вызывать метод родителя, иначе не понятно зачем делать наследованные.
Как выбрать между наследованием и композицией?
Если сущность А является сущностью Б, то это наследованные. Если является частью сущности Б, то это композиция.
Абстрактный класс
От абстрактного класса нельзя создавать объекты, но можно создавать потомки - обычные классы, а от них уже создавать объекты.
Абстрактный класс помогает установить контракт, который обязывает имплиментировать набор методов в классах потомках.
Некоторый общий чертеж для всех моделей самолетов. По этому чертежу еще нельзя построить реальный самолет, но он уже содержит общие детали реализации.
Интерфейс
Это как абстрактный класс, но не класс, а перечисление абстрактных методов (без имплементации).
Задача интерфейса снизить уровень зависимости сущностей друг от друга и добавить больше абстракции.
Нам нужно описать требования для унифицированного самолета, у него должны быть определены такие параметры как грузоподъемность, крейсерская и максимальная скорость, практический потолок (они могут отличаться у разных моделей, но они должны быть), он должен уметь взлетать и, крайне желательно, уметь садиться. Эти требования это интерфейс.