diff options
Diffstat (limited to 'content/digarden/pages/20210425152343-ооп.org')
-rw-r--r-- | content/digarden/pages/20210425152343-ооп.org | 161 |
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 |