Ранняя изоляция компонент vs Прагматизм: Когда жёсткие границы компонент убивают гибкость и скорость разработки

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Изоляция компонентов нужна для управления сложностью, особенно для больших команд и программ. Но её раннее применение часто противоречит целей по гибкости, особенно в начале, когда ещё не известны или не сложились бизнес процессы, когда программу ещё пишет небольшая команда.

Изменение границ компонент это сложно. В ООП это сложнее чем в ФП из-за более крупной гранулярности, класс сложнее чем отдельная функция. Изменение границ микросервисов сложнее чем в монолите.

Проблема ранней изоляции: -

Необходимость частого рефакторинга на раннем этапе

Тонкая прослойка как компромисс: - Например, обёртки над библиотечными классами добавляют функционал с минимальным вмешательством и без необходимости писать всё с нуля.

Гибридный подход: - Функциональный домен, императивная оболочка.

Домен — функциональное ядро: Бизнес-логика в чистых функциях, независимых от инфраструктуры.

Оболочка — императивная. Необходимость интеграции с ООП библиотеками (io, фреймворки) заставляет писать эту часть в ООП. Но можно использовать тонкие прослойки для интеграции для минимизации boilerplate.

Риски: - Скрытая привязка к библиотеке: Домен косвенно зависит от её типов. - Сложность замены: Если библиотека всё же потребует замены, придётся модифицировать методы расширения.

Итог: Ранняя изоляция через толстые адаптеры часто избыточна.

Методика

Как же тогда должна выглядеть методика обследования и проектирования на основе DDD, но оставляя гибкими границы доменов по bounded context до нужного момента?

Методика пригодна как для проектирования архитектуры доменных компонент, так и более мелкого уровня детализации (структуры данных и функции).

Определения (мои)

  1. Состояние - наблюдаемое явление, фиксированный набор значений параметров системы или её части в определённый момент времени, определяющий её поведение и доступные действия.

  2. Типы → Категории возможных состояний системы и их допустимых комбинаций.

  3. События → Факты о произошедших изменениях (прошлые состояния).

  4. Процессы → Механизмы перехода между состояниями (будущие изменения состояний).

Последовательность проектирования компонент (домена DDD либо более мелких сущностей):

1. Анализ домена:

- Event Storming → выявление ключевых событий и процессов.

- Определение Bounded Context → границы модулей. Домен должен быть такой чтобы помещался а голове одного доменного эксперта. Если говорить про модули кода, то принцип единственной ответственности не позволит вырасти когнитивной сложности компонента, так как не смешивает разные предметные области в одном коде.

2. Моделирование типами:

- Каждое доменное понятие → алгебраический тип данных, определяет набор возможных состояний и их комбинаций.

- Бизнес-правила → валидаторы как функции.

3. Чистые функции для логики:

  • Мелкая гранулярность в ФП позволит легко переносить функционал через границу компонент

  • Сервисы → композиция pure-функций

  • Обработка ошибок → Either/Result типы.

4. Изоляция эффектов и состояний:

IO-операции → отдельный слой (Http, БД).

Использование СУБД выноса состояний наружу или монад для отсутствия скрытых побочных эффектов / состояний. Если это сложно или не эффективно, то для реализации состояний можно использовать состояние объекта в ООП. Также ООП имеет преимущество если ООП библиотеки уже реализуют почти всю логику вашей предметной области и ваши добавления незначительны.

5. Оптимизация скорости (при необходимости)

Когда же тонкая и гибкая прослойка должна стать жёсткой и надёжно изолирующей?

Выбор между тонкой и толстой прослойкой между компонентами зависит от контекста:

1. Тонкая прослойка (быстро/минимализм) или даже вызовы библиотек напрямую, жертвуя гибкостью и принципом единственной ответственности.

- Подходит, если термины библиотеки на 80% совпадают с вашим доменным языком.

- Подходит когда граница компонент ещё не сложилась, она может и должна легко меняться.

- Риск: Привязка к библиотеке, но экономия времени на разработку.

2. Толстая прослойка (надёжность/изоляция):

- Нужны доменные модели, полностью абстрагированные от библиотек.

- Границы компонент не меняются.

- Нужно надёжно изолировать компоненты, чтобы изменения в одних не требовали цепочку изменений других. Особенно, если другими компонентами уже владеет другая группа разработки.

Компромисс:

Даже минимальные адаптеры (интерфейсы + базовые преобразования) лучше, чем прямое использование библиотеки в ядре. Это сохраняет путь к будущим изменениям без переписывания системы.

Правило выбора:

Чем критичнее компонент для бизнеса и чем более стабильны границы между компонентами, тем "толще" должна быть прослойка между компонентами.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Рефакторинг ООП это просто?
40% Конечно, написал фабрику фабрик и вперёд!2
60% Я лучше сначала сделаю как проще3
0% ООП? Паттерны проектирования? А что это?0
0% Рефакторинг? Зачем? И так сойдёт!0
Проголосовали 5 пользователей. Воздержавшихся нет.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Прототипы без статической типизации проще?
25% Сначала пишу без типов, а потом если нужно добавлю их1
0% Ерунда, всегда пишу без статических типов0
75% Сразу типы: продумать типы значит спроектировать3
Проголосовали 4 пользователя. Воздержавшихся нет.
Источник: https://habr.com/ru/articles/882826/


Интересные статьи

Интересные статьи

Microsoft опубликовала минимальные системные требования для ПК и список поддерживаемых процессоров для Windows 11 IoT Enterprise LTSC 2024 (Long-Term Servicing Channel, канал долгосрочного обслуживани...
Сложно ли потянуть коробку? В этой статье расскажу, в каких случаях пользователям облачного Битрикс24 стоит переезжать в коробочную версию и к чему надо быть готовым.Приветствую всех, это Сергей Михно...
Привет, Хабр! Это команда сервисной поддержки департамента телекоммуникаций КРОК. В прошлом году наши байки нашли отклик в сердцах хабровчан, и мы решили продолжить славную традицию. Вообще-то пр...
В 1С-Битрикс: Управление сайтом (как и в Битрикс24) десятки, если не сотни настраиваемых типов данных (или сущностей): инфоблоки, пользователи, заказы, склады, форумы, блоги и т.д. Стр...
Основанная в 1998 году компания «Битрикс» заявила о себе в 2001 году, запустив первый в России интернет-магазин программного обеспечения Softkey.ru.