DI в TypeScript без декораторов: почему это будущее

Каждый, кто пишет на TypeScript хотя бы пару лет, отлично знаком со стандартным DI-сценарием: класс, декоратор @Injectable() , флаг emitDecoratorMetadata в конфиге и рантайм-магия фреймворка. Этот подход казался прорывным в 2015 году, но современный TypeScript ушел далеко вперед. У нас появились мощнейший статический анализ и продвинутый вывод типов, в то время как популярные DI-контейнеры вроде NestJS, InversifyJS или TSyringe будто законсервировались в прошлом. Слепая приверженность старым паттернам начинает откровенно тормозить индустрию. Из-за legacy-декораторов мы оказываемся заперты в рамках медленного tsc без возможности безболезненно уйти на сверхбыстрые сборщики вроде esbuild или SWC. Наша бизнес-логика намертво заражается инфраструктурными импортами сторонних библиотек, а ошибки в графе зависимостей и скрытые утечки памяти обнаруживаются не на этапе компиляции, а уже в рантайме под нагрузкой на проде. Но что, если заставить компилятор TypeScript проверять валидность всего графа зависимостей еще до запуска кода? Без декораторов, reflect-metadata , кастомных трансформеров и тяжелой кодогенерации. В этой статье мы разберем концепцию «экстремальной типизации» на примере InferDI — первого DI-контейнера, где сам граф зависимостей вместе с lifetime-правилами перенесен напрямую в систему типов. Мы поговорим о фундаментальных вещах: почему полный отказ от «удобной» магии аннотаций в пользу 100% ванильного TypeScript — это лучшая инвестиция в архитектуру, безопасность, скорость сборки и долговечность вашего проекта на годы вперед.

https://habr.com/ru/articles/1042290/

#typescript #dependency_injection #dicontainer #reflectmetadata #внедрение_зависимостей #inversifyjs #tsyringe #awilix #Typed_Inject #inferdi

DI в TypeScript без декораторов: почему это будущее

Если вы пишете на TypeScript больше пары лет, то наверняка привыкли к классическому паттерну внедрения зависимостей. Вы создаете класс, помечаете его декоратором @Injectable() , прописываете токеновые...

Хабр

Почему проекты превращаются в спагетти даже у хороших программистов

Когда программист впервые слышит слово «архитектура», он обычно представляет что-то скучное: диаграммы, стрелочки, коробочки, совещания на три часа и человека, который запрещает писать код. А потом проходит несколько лет. И внезапно оказывается, что проект, который «быстро накидали», начинает разваливаться от любого изменения. Добавили одну кнопку — сломался импорт. Поменяли отчёт — умерла авторизация. Обновили библиотеку — перестала открываться половина форм. И начинается археология. Почему так происходит? Потому что почти любой проект без нормальной архитектуры рано или поздно превращается в спагетти. Причём даже если его пишут хорошие программисты.

https://habr.com/ru/articles/1035696/

#архитектура_по #модульный_монолит #микросервисы #clean_architecture #legacy #спагеттикод #инженерия #backend #software_architecture #dependency_injection

Почему проекты превращаются в спагетти даже у хороших программистов

Когда программист впервые слышит слово «архитектура», он обычно представляет что-то скучное: диаграммы, стрелочки, коробочки, совещания на три часа и человека, который запрещает писать код. А потом...

Хабр

Типобезопасный HTTP API на TypeScript без кодогенерации: @cleverbrush/server и @cleverbrush/client

Статья о том, как единый типизированный контракт позволяет получить проверяемые на этапе компиляции сервер, клиент и React-хуки — без кодогенерации и без дублирования типов. Дисклеймер: все описываемые библиотеки носят экспериментальный характер — они созданы в рамках эксперимента. Несмотря на это, покрытие тестами у них достаточно хорошее.

https://habr.com/ru/articles/1030342/

#TypeScript #HTTP_API #type_safety #dependency_injection #OpenAPI #TanStack_Query #WebSocket #кодогенерация #schema_validation #монорепозиторий

Типобезопасный HTTP API на TypeScript без кодогенерации: @cleverbrush/server и @cleverbrush/client

Статья о том, как единый типизированный контракт позволяет получить проверяемые на этапе компиляции сервер, клиент и React-хуки — без кодогенерации и без дублирования типов. Дисклеймер: все...

Хабр

Вынесение бизнес‑логики из BLoC в use‑cases: прагматичный взгляд на архитектуру Flutter

Начиная писать Flutter-приложение, для стейт-менеджмента часто хватает простого setState или простого решения, по типу BLoC/Cubit без излишеств. Но с течением жизни проекта ваши блоки могут начать превращаться в god objects. Внутри хендлеров могут находиться и запросы в сервисы, и валидация, и эмиттеры состояния, а для крупной страницы точно одним ивентом не обойдешься. В таких условиях разработка сильно затрудняется, становится сложно поддерживать и масштабировать проект, снижается тестируемость. Это не субъективный опыт — строгая разделенная архитектура повышает гибкость, переиспользуемость и тестируемость кода. BLoC сам по себе — паттерн с отличной дисциплиной потока данных и строгим отделением бизнес‑логики от UI, но стоит немного расслабиться, и он разрастается до god объекта. Цель этой статьи — продемонстрировать, как вынесение бизнес логики в use-cases может помочь вернуть контроль над ViewModel слоем. Это не попытка навязать единственный вариант реализации, а материал про технический компромисс, подтвержденный цифрами и опытом.

https://habr.com/ru/articles/1022838/

#flutter #dart #bloc #чистая_архитектура #use_cases #state_management #архитектура #мобильная_разработка #тестирование #dependency_injection

10 причин попробовать Effect TS/Основы Effect TS

Effect -фреймворк, который никого не может оставить равнодушным. Читая комментарии к другим постам, я заметил, что добрая часть хабра считает, что эффект это избыточно сложная и не особо нужная технология. В своей статье я обозначаю 10 причин, почему эту технологию стоит попробовать, даже если вы дико предвзятый разработчик, а также даю экскурс по базам фреймворка.

https://habr.com/ru/articles/1009458/

#Effect #Effect_TS #TypeScript #functional_programming #функциональное_программирование #dependency_injection #AI

10 причин попробовать Effect TS/Основы Effect TS

Введение Effect -фреймворк, который не может не вызвать эмоции у разбирающего с ней разработчика: либо неподдельный восторг, либо отвращение от синтаксиса, ненужного бойлерплейта и неоправданной...

Хабр

Все паттерны в автоматизации тестирования

Когда я только начинал свой путь в автоматизации, мне отчаянно не хватало толкового и структурированного материала по паттернам проектирования именно для автотестов. Хороших статей про паттерны в целом — вагон, а вот с привязкой к тестированию — днём с огнём не сыщешь. Паттерны — это та вещь, которая моментально выдает уровень культуры кода и понимание инженерных практик. Неудивительно, что на собеседованиях на позицию Automation QA любят покопаться в этой теме. В этой статье я решил закрыть этот пробел. Вы найдете не только продуманную классификацию основных паттернов автоматизации, но и самый подробный, на мой взгляд, разбор каждого из них с примерами. А в конце поговорим про антипаттерны. Добро пожаловать в обсуждение! Буду рад конструктивной критике и дополнениям.

https://habr.com/ru/articles/1004628/

#автоматизация_тестирования #паттерны_проектирования #page_object #builder_pattern #factory_pattern #dependency_injection #contract_testing #snapshot_testing #visual_testing #антипаттерны

Все паттерны в автоматизации тестирования

Когда я только начинал свой путь в автоматизации, мне отчаянно не хватало толкового и структурированного материала по паттернам проектирования именно для автотестов. Хороших статей про паттерны в...

Хабр

Алгоритм резолва зависимостей в Angular Ivy: Математика Блум-фильтров и битовые маски

Как Angular Ivy находит зависимости за O(1)? Глубокое погружение в алгоритм резолва: от генерации уникальных ID токенов до битовой магии Блум-фильтров. Разбираем, почему строковые токены замедляют ваше приложение и как работает наследование кумулятивных масок в LView. Разложить на биты

https://habr.com/ru/articles/988606/

#Angular #Ivy #Dependency_Injection #Bloom_Filter #Web_Internals #Блумфильтр #Оптимизация_производительности #Frontend_Architecture #Битовые_маски #reverse_engineering

Алгоритм резолва зависимостей в Angular Ivy: Математика Блум-фильтров и битовые маски

В своей прошлой статье я рассмотрел, как работает Dependency Injection в Ангуляре, но остался один интересный вопрос, как Ангуляр находит и резолвит сервисы в иерархиях почти моментально? Чтобы...

Хабр

[Перевод] Гексагональная архитектура в Rust: отвязываем бизнес-логику от Solana

Представьте: вы строите сервис выдачи дипломов на Solana. Всё отлично, пока дело не доходит до тестов. Внезапно оказывается, что для проверки бизнес-логики нужно поднимать валидатор, искать тестовые токены и молиться на стабильность сети. Знакомая боль? В этой статье я покажу, как мы решили проблему, используя async-trait и dyn Trait. Мы превратили интеграционные тесты длиной в минуты в юнит-тесты, которые проходят за миллисекунды. Узнать решение

https://habr.com/ru/articles/983874/

#rust #solana #гексагональная_архитектура #блокчейн #unittesting #dependency_injection #axum #web3 #mocking #refactoring

Гексагональная архитектура в Rust: отвязываем бизнес-логику от Solana

Архитектура как конструктор LEGO: строим тестируемый Rust-сервис с абстракцией блокчейна Представьте, что вы строите сервис для выдачи цифровых дипломов, который записывает хеши документов в блокчейн...

Хабр

Field vs Constructor Injection в Java: ошибка объектного дизайна или вопрос синтаксиса?

Знаю, знаю... Прочитав заголовок, хочется голосом волка из мультфильма "Жил был пёс" сказать - "Шо, опять?" . Ведь битва этих подходов давно закончилась и разработчики Spring уже поставили точку. Но недавняя публикация в одном довольно крупном Telegram-канале заставила меня вернуться к этому вопросу. В качестве главных аргументов против field injection там приводились лишь сложность изоляции в тестах и неудобство создания экземпляров для unit-тестов. И хотя с этими пунктами не поспоришь, у многих разработчиков и не только начинающих, остаются вопросы: каковы реальные последствия для самого объекта? Можно ли считать его полноценным сразу после создания new ? И почему все современные рекомендации так настаивают на конструкторах? Поиск ответов показал мне, что аргумент о тестах лишь верхушка айсберга. В глубине, куда я Вас сегодня приглашаю заглянуть, скрываются куда более фундаментальные вопросы принципов объектно-ориентированного дизайна, гарантий Java Memory Model и уважения к жизненному циклу объекта.

https://habr.com/ru/articles/983344/

#field #injection #constructor #setter #Dependency_Injection #Spring_Framework #Java #ObjectOriented_Design #Invariants

Field vs Constructor Injection в Java: ошибка объектного дизайна или вопрос синтаксиса?

Знаю, знаю... Прочитав заголовок, хочется голосом волка из мультфильма "Жил был пёс" сказать - "Шо, опять?" . Ведь битва этих подходов давно закончилась и разработчики Spring уже поставили точку. Но...

Хабр

Field vs Constructor Injection в Java: ошибка объектного дизайна или вопрос синтаксиса?

Знаю, знаю... Прочитав заголовок, хочется голосом волка из мультфильма "Жил был пёс" сказать - "Шо, опять?" . Ведь битва этих подходов давно закончилась и разработчики Spring уже поставили точку. Но недавняя публикация в одном довольно крупном Telegram-канале заставила меня вернуться к этому вопросу. В качестве главных аргументов против field injection там приводились лишь сложность изоляции в тестах и неудобство создания экземпляров для unit-тестов. И хотя с этими пунктами не поспоришь, у многих разработчиков и не только начинающих, остаются вопросы: каковы реальные последствия для самого объекта? Можно ли считать его полноценным сразу после создания new ? И почему все современные рекомендации так настаивают на конструкторах? Поиск ответов показал мне, что аргумент о тестах лишь верхушка айсберга. В глубине, куда я Вас сегодня приглашаю заглянуть, скрываются куда более фундаментальные вопросы принципов объектно-ориентированного дизайна, гарантий Java Memory Model и уважения к жизненному циклу объекта.

https://habr.com/ru/articles/983340/

#field #injection #constructor #setter #Dependency_Injection #Spring_Framework #Java #ObjectOriented_Design #Invariants

Field vs Constructor Injection в Java: ошибка объектного дизайна или вопрос синтаксиса?

Знаю, знаю... Прочитав заголовок, хочется голосом волка из мультфильма "Жил был пёс" сказать - "Шо, опять?" . Ведь битва этих подходов давно закончилась и разработчики Spring уже поставили точку. Но...

Хабр