💡 Способы создания более сложных абстракций из простых в ООП и функциональном программировании сильно пересекаются:
∙ Наследование - для ООП кажется, что все понятно, но применять наследование нужно не для расширения абстракции, а для сужения, что в ФП достигается типами, а для построения более сложных абстракций из более простых в ФП используют композицию, замыкания, функции высшего порядка (обертки, декораторы).
∙ Композиция - в ФП композиция везде, а вот в ООП обычно недооценена, реализуется через создание экземпляра одного класса внутри конструктора другого, композиция создает меньше зацепления и зависимости, проще тестировать, когнитивная нагрузка меньше.
∙ Агрегация - похожа на композицию, но ответственность за инстанцирование не на классе-владельце, т.е. создание экземпляров, вынесено в другие абстракции, а агрегирующий класс получает их уже готовые, чаще всего через конструктор и объединяет.
∙ Миксины - примешивать к готовым экземплярам ссылки на другие, это хаос, в ФП такого нет, и три предыдущие способа гораздо предпочтительнее, но если нет никакого более красивого выхода, то можно применить, как временное решение, создающее техдолг.
∙ Ассоциация - иногда под этим термином понимают взаимодействие абстракций, это нормально, но иногда это значит внешнюю агрегацию, в худшем случае - через миксин, в лучшем - через сеттер, так что, это тоже создает зацепление и технический долг.
∙ Делегирование - это подвид композиции, когда интерфейс внутренней абстракции полностью реализуется наружной, по сути это прямая замена наследования, без использования наследования и проблем, связанных с ним.
∙ Наследование - для ООП кажется, что все понятно, но применять наследование нужно не для расширения абстракции, а для сужения, что в ФП достигается типами, а для построения более сложных абстракций из более простых в ФП используют композицию, замыкания, функции высшего порядка (обертки, декораторы).
∙ Композиция - в ФП композиция везде, а вот в ООП обычно недооценена, реализуется через создание экземпляра одного класса внутри конструктора другого, композиция создает меньше зацепления и зависимости, проще тестировать, когнитивная нагрузка меньше.
∙ Агрегация - похожа на композицию, но ответственность за инстанцирование не на классе-владельце, т.е. создание экземпляров, вынесено в другие абстракции, а агрегирующий класс получает их уже готовые, чаще всего через конструктор и объединяет.
∙ Миксины - примешивать к готовым экземплярам ссылки на другие, это хаос, в ФП такого нет, и три предыдущие способа гораздо предпочтительнее, но если нет никакого более красивого выхода, то можно применить, как временное решение, создающее техдолг.
∙ Ассоциация - иногда под этим термином понимают взаимодействие абстракций, это нормально, но иногда это значит внешнюю агрегацию, в худшем случае - через миксин, в лучшем - через сеттер, так что, это тоже создает зацепление и технический долг.
∙ Делегирование - это подвид композиции, когда интерфейс внутренней абстракции полностью реализуется наружной, по сути это прямая замена наследования, без использования наследования и проблем, связанных с ним.
List<List<T>>
Please open Telegram to view this post
VIEW IN TELEGRAM
— Почему вы не избавляетесь от сложности и технического долга?
— Вы что, мы столько сил потратили на этот крутой код, он нам очень дорог!
— Вы что, мы столько сил потратили на этот крутой код, он нам очень дорог!
🧩 Можете ли вы предложить пример кода для иллюстрации принципов? (если спросят коллеки на собеседовании)
Anonymous Poll
47%
Композиция классов
31%
Агрегация классов
27%
Делегирование
61%
Единственная ответственность
50%
Принцип открытости/закрытости
46%
Принцип подстановки Лисков
47%
Принцип разделения интерфейса
41%
Инверсия зависимостей
49%
Внедрение зависимости
24%
Инверсия управления
— AI сможет создавать сложные кодовые базы с нуля // Дарио Амадей CEO Anthripic
— Мы бы волновались, если бы он смог создавать простой код и не с нуля, а через рефакторинг, а так... Сложные и с нуля все могут.
— Мы бы волновались, если бы он смог создавать простой код и не с нуля, а через рефакторинг, а так... Сложные и с нуля все могут.
🧩 Тут две простейшие реализации языка LISP на JavaScript, одна ООП + паттерн Interpreter, а вторая на мультипарадигменном программировании, с тем же паттерном: https://github.com/HowProgrammingWorks/Interpreter/tree/main/JavaScript
Что думают функциональщики про GoF паттерны:
(GoF)(x) = G(F(x))
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
В этом плейлисте будет весь SOLID к новому году: https://youtube.com/playlist?list=PLHhi8ymDMrQZxZuGbkJai8M-0qu8iui2R&si=XCm1BaWBtYDc5hc9
YouTube
SOLID принципы для JavaScript и TypeScript
SOLID: SRP — Принцип единственной ответственности (Single responsibility), OCP — Принцип Открытости-закрытости (Open-Closed), LSP — Принцип подстановки Лиско...
Наш гость на завтра: Евгений Юхно
🎓 Более 30 лет в ИТ. Прошел длинный путь от обслуживания и ремонта компьютеров на ВЦ, которые в то время занимали по-здания. Через программирование до управления ИТ как в реальном секторе экономики, так и в ИТ компаниях.
👨💻 В программировании:
- для ПК: ASM Z80, MASM PDP11, MASM i286, MSX Basic, Fortran, Pascal / Object Pascal / Delphi, C / C++ / Borland C++ Builder, Lisp, dBaseIII, dBaseIV, Clipper87, Clipper 5, Java, PL/SQL, T-SQL, VisualBasic, C#, PHP, Perl, Python, JS
- для PLC и embedded: ASM для КР-580, ASM Z80, Step 4... 7 (DSL of Siemens), DSL Allen Bradley, C/C++
- для ERP: C#, AL (DSL of MS Nav / MS Business Central), C-- (DSL of MS Axapta и его приемников), 1С -- куда ж без него в Украине 90х
- под различне операционки: CP/M, IRIX, Xenix, IBM AIX, HP-UX, MS-DOS, Linux, Windows
🎯 В бизнесе:
- Программист / Инженер по внедрению ИС
- Системный аналитик / Бизнес-аналитик / IT консультант / Бизнес-консультант / CTO / CIO / CEO
- Организовывал бизнес-направления в Hardware и Software
- Организовывал ИТ-компании с нуля
Влияние основополагающих технологий на современные, и почему это хорошо на примере LISP и JS. Суперпозиция хорошо забытого и современного на примере персональной эффективности в Independent software development.
Please open Telegram to view this post
VIEW IN TELEGRAM
LISP to JavaScript compiler prototype https://github.com/metarhia/metalisp