summaryrefslogtreecommitdiff
path: root/content/digarden/pages/20210425152343-ооп.org
diff options
context:
space:
mode:
Diffstat (limited to 'content/digarden/pages/20210425152343-ооп.org')
-rw-r--r--content/digarden/pages/20210425152343-ооп.org161
1 files changed, 161 insertions, 0 deletions
diff --git a/content/digarden/pages/20210425152343-ооп.org b/content/digarden/pages/20210425152343-ооп.org
new file mode 100644
index 0000000..b2eb29e
--- /dev/null
+++ b/content/digarden/pages/20210425152343-ооп.org
@@ -0,0 +1,161 @@
+:PROPERTIES:
+:ID: d59ae5ab-7189-4d37-ab8b-259eaaa57995
+:END:
+#+title: ООП
+
+* ООП
+** Термины
+- Абстрактный класс :: класс, не предполагающий создание
+ экземпляров. Используется только для наследования другими классами.
+- Сервис :: класс, который структуризирует некоторую функциональность и
+ даёт её использовать другим классам. Что-то вроде файлов utils из
+ других языков, но в ООП мире.
+
+ Подробнее о сервисах: [[[https://en.wikipedia.org/wiki/Service-oriented_programming][Wikipedia: Service-Oriented Programming]]]
+** Отношения
+- Наследование :: отношение "является". Легковой автомобиль является
+ автомобилем, значит легковой автомобиль наследуется от класса
+ автомобиля.
+#+begin_src c-sharp
+class Vehicle
+{
+ bool hasWheels;
+}
+
+class Car : Vehicle
+{
+ string model = "Porshe";
+ int numberOfWheels = 4
+}
+#+end_src
+
+- Ассоциация :: отношение "имеет". Автомобиль имеет двигатель, двигатель
+ не является автомобилем, соответственно двигатель не будет являться
+ наследником класса автомобиль.
+#+begin_src c-sharp
+class Engine
+{
+ int power;
+ public Engine(int p)
+ {
+ power = p;
+ }
+}
+
+class Car
+{
+ string model = "Porshe";
+ Engine engine;
+ public Car()
+ {
+ this.engine = new Engine(360);
+ }
+}
+#+end_src
+
+ - Композиция :: двигатель создаётся внутри автомобиля и не является
+ отдельной сущностью.
+#+begin_src c-sharp
+class Engine
+{
+ int power;
+ public Engine(int p)
+ {
+ power = p;
+ }
+}
+
+class Car
+{
+ string model = "Porshe";
+ Engine engine;
+ public Car()
+ {
+ this.engine = new Engine(360);
+ }
+}
+#+end_src
+
+ - Агрегация :: двигатель является отдельной сущностью и включается в
+ класс автомобиля, путём передачи в конструктор.
+#+begin_src c-sharp
+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);
+#+end_src
+
+
+Подробнее об этих отношениях в [[https://habr.com/ru/post/354046/][статье "Наследование, композиция,
+агрегация"]].
+** Модификаторы доступа
+- *public* -- доступно всем
+- *private* -- доступно только классу, недоступно экземпляру и наследнику
+- *protected* -- доступно классу и наследнику, недоступно экземпляру
+
+- *final* -- нельзя отнаследоваться никому
+- *static* -- метод принадлежит классу, а не экземпляру
+*** Статьи
+- [[https://habr.com/ru/post/482154/][Зачем ограничивать наследование при помощи final]]
+** Интерфейсы
+Это что-то вроде типов данных, которые обязывают классы при их
+реализации иметь те или иные поля и методы.
+** Dependency Injection
+Частный случай инверсии зависимостей.
+
+[[https://habr.com/ru/post/321344/][Инверсия зависимостей на Хабре]]
+*** Service Locator
+Дав интерфейс Service Locator'у, он возвращает экземпляр конкретного
+класса, реализующий переданный ему интерфейс.
+** Хорошие вещи
+*** Интерфейсы
+*** Композиция классов, mixin'ы, trait'ы и т.д.
+** Критика
+http://smashcompany.com/technology/object-oriented-programming-is-an-expensive-disaster-which-must-end
+*** Геттеры и Сеттеры используются не по назначению
+Часто они нужны лишь чтобы засетить тоже значение что и при прямом
+обращении к свойству. А геттер возвращает ровно то же значение, что и у
+свойства.
+
+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
+
+[[id:bfb12d94-bef4-4e20-bc3a-67881e050ca1][Metaobject Protocol]]
+** ООП в разных языках
+- [[id:3df0aee3-71c5-4c3e-8833-85bd9db7093c][ООП в Javascript]]
+- PHP
+- Java
+- C++
+** Видео
+- [[https://youtube.com/watch?v=lbXsrHGhBAU][Object-Oriented Programming]]
+- [[https://www.youtube.com/watch?v=QM1iUe6IofM][Object-Oriented Programming is Bad]]
+- [[https://youtube.com/watch?v=0iyB0_qPvWk][Object-Oriented Programming is Good*]] \ No newline at end of file