ООП
Термины
- Абстрактный класс
- класс, не предполагающий создание экземпляров. Используется только для наследования другими классами.
- Сервис
класс, который структуризирует некоторую функциональность и даёт её использовать другим классам. Что-то вроде файлов utils из других языков, но в ООП мире.
Подробнее о сервисах: [Wikipedia: Service-Oriented Programming]
Отношения
- Наследование
- отношение "является". Легковой автомобиль является автомобилем, значит легковой автомобиль наследуется от класса автомобиля.
class Vehicle { bool hasWheels; } class Car : Vehicle { string model = "Porshe"; int numberOfWheels = 4 }
- Ассоциация
- отношение "имеет". Автомобиль имеет двигатель, двигатель не является автомобилем, соответственно двигатель не будет являться наследником класса автомобиль.
class Engine { int power; public Engine(int p) { power = p; } } class Car { string model = "Porshe"; Engine engine; public Car() { this.engine = new Engine(360); } }
- Композиция
- двигатель создаётся внутри автомобиля и не является отдельной сущностью.
class Engine { int power; public Engine(int p) { power = p; } } class Car { string model = "Porshe"; Engine engine; public Car() { this.engine = new Engine(360); } }
- Агрегация
- двигатель является отдельной сущностью и включается в класс автомобиля, путём передачи в конструктор.
class Engine { int power; public Engine(int p) { power = p; } } class Car { string model = "Porshe"; Engine engine; public Car(Engine someEngine) { this.engine = someEngine; } } Engine goodEngine = new Engine(360); Car porshe = new Car(goodEngine);
Подробнее об этих отношениях в статье "Наследование, композиция, агрегация".
Модификаторы доступа
- public – доступно всем
- private – доступно только классу, недоступно экземпляру и наследнику
- protected – доступно классу и наследнику, недоступно экземпляру
- final – нельзя отнаследоваться никому
- static – метод принадлежит классу, а не экземпляру
Интерфейсы
Это что-то вроде типов данных, которые обязывают классы при их реализации иметь те или иные поля и методы.
Dependency Injection
Частный случай инверсии зависимостей.
Service Locator
Дав интерфейс Service Locator'у, он возвращает экземпляр конкретного класса, реализующий переданный ему интерфейс.
Хорошие вещи
Интерфейсы
Композиция классов, mixin'ы, trait'ы и т.д.
Критика
Геттеры и Сеттеры используются не по назначению
Часто они нужны лишь чтобы засетить тоже значение что и при прямом обращении к свойству. А геттер возвращает ровно то же значение, что и у свойства.
https://lispcast.com/why-getters-and-setters-are-terrible/ https://www.infoworld.com/article/2073723/why-getter-and-setter-methods-are-evil.html
Аннотации
Наследование
Паттерн Синглтон
Зачем создавать класс, который плодит всего один объект, если возможно создать сразу объект как например в Javascript или Scala.
Классы используются ради единственной сущности, а не ради многих
Классы используют тогда, когда можно обойтись структурой
ООП нетрадиционное
- Lisp
- Smalltalk
- Erlang
- Ruby / Python
ООП в разных языках
- ООП в Javascript
- PHP
- Java
- C++