ru
Feedback
HowProgrammingWorks - JavaScript and Node.js Programming

HowProgrammingWorks - JavaScript and Node.js Programming

Открыть в Telegram

Программная инжененрия для JavaScript, TypeScrip, Node.js 👉 Group: https://t.me/How_Programming_Works 👉 Node.js channel: https://t.me/metarhia 👉 Node.js group: https://t.me/nodeua

Больше
6 542
Подписчики
-124 часа
-57 дней
+4430 день
Архив постов
В этом плейлисте будет весь SOLID к новому году: https://youtube.com/playlist?list=PLHhi8ymDMrQZxZuGbkJai8M-0qu8iui2R&si=XCm1BaWBtYDc5hc9

Что думают функциональщики про GoF паттерны: (GoF)(x) = G(F(x))

🧩 Тут две простейшие реализации языка LISP на JavaScript, одна ООП + паттерн Interpreter, а вторая на мультипарадигменном программировании, с тем же паттерном: https://github.com/HowProgrammingWorks/Interpreter/tree/main/JavaScript

— AI сможет создавать сложные кодовые базы с нуля // Дарио Амадей CEO Anthripic — Мы бы волновались, если бы он смог создавать простой код и не с нуля, а через рефакторинг, а так... Сложные и с нуля все могут.

— AI сможет создавать сложные кодовые базы с нуля // Дарио Амадей CEO Anthripic — Мы бы волновались, если бы он смог создавать простой код и не с нуля, а через рефакторинг, а так... Сложные и с нуля все могут.

🧩 Можете ли вы предложить пример кода для иллюстрации принципов? (если спросят коллеки на собеседовании)
Anonymous voting

— Почему вы не избавляетесь от сложности и технического долга? — Вы что, мы столько сил потратили на этот крутой код, он нам очень дорог!

💡 И немного о структурах данных: список со списками, это как массив с массивами, как кулек с кульками, как коробка с коробками: List<List<T>>

💡 Способы создания более сложных абстракций из простых в ООП и функциональном программировании сильно пересекаются: ∙ Наследование - для ООП тут все понятно, но что можно считать наследованием для функционального программирования? Для аналогичного наследованию эффекта можно использовать функции высшего порядка или частичное применение. ∙ Композиция - в ФП композиция везде, а вот в ООП обычно недооценена, реализуется через создание экземпляра одного класса внутри конструктора другого, композиция создает меньше зацепления и зависимости, проще тестировать, когнитивная нагрузка меньше. ∙ Агрегация - похожа на композицию, но ответственность за инстанцирование не на классе-владельце, т.е. создание экземпляров, вынесено в другие абстракции, а агрегирующий класс получает их уже готовые, чаще всего через конструктор и объединяет. ∙ Миксины - примешивать к готовым экземплярам ссылки на другие, это полный хаос, и три предыдущие способа гораздо предпочтительнее, но если нет никакого более красивого выхода, то можно применить, как временное решение, создающее техдолг. ∙ Ассоциация - иногда под этим термином понимают взаимодействие абстракций, это нормально, но иногда это значит внешнюю агрегацию, в худшем случае - через миксин, в лучшем - через сеттер, так что, это тоже создает зацепление и технический долг. ∙ Делегирование - это подвид композиции, когда интерфейс скомпозированного класса (внутреннего) полностью реализуется наружным классом, по сути это прямая замена наследования, без использования наследования и проблем, связанных с ним.

Functional programmers also can do nodejs
Functional programmers also can do nodejs

⭐️ Good and bad cases for TypeScript union types based on JavaScript V8 optimizations 👍 Good cases for union types: - Union of strings instead of enum: type Direction = 'north' | 'south' | 'east' | 'west'; - Union of numeric as status or result code: type StatusCode = 200 | 201 | 204 | 400 | 500; - Union with shared properties: type MailTarget = User | Company; (both with email) - Union with common method: type Thenable = Promise | Query; (both with then method) 👎 Bad cases for union types: - Polymorphic object shapes causing depots: type Something = User | Socket | string; - Requiring extensive "if"-logic and type checking: type Input = string | number | boolean; - Inconsistent return types: function getData(id: number): string | string[]; - Mixed primitives and objects: type Value = number | { value: number }; - Сontradictory members: type Person = { name: string; } | { name: number[] }; - Union types that include any: type FlexibleType = number | any; - Incompatible contracts: type Handler = (() => string) | ((event: Event, data: any) => void); 🎁 Empty value for primitive types and reference types: - Use null for empty reference types: Object, Function, Array, etc... - Use undefined for empty primitive types: string, number, boolean, bigint - Avoid mixing symbols with other types in unions