Изоляция модулей
В рамках методологии все модули распределены по зонам ответственности (layer, slice, segment)
Слои, в свою очередь, организованы вертикально:
- "Внизу" находятся переиспользуемые модули (ui-kit, внутренние библиотеки проекта), как наиболее абстрактные
- А по мере продвижения "вверх" располагаются более специфичные модули.
Независимо от принадлежности к какому-либо слайсу, каждый модуль обязан предоставлять публичный интерфейс доступа.
Требования
Взаимодействие каждого модуля с остальным приложением проектируется с учетом ряда требований:
- Слабое зацепление с другими модулями
- Изменение в одном модуле должно слабо и предсказуемо влиять на другие
- Высокая связность - обязанности каждого модуля "сфокусированы" на одной задаче
- Если модуль имеет слишком много ответственностей (начинает "делать слишком много") - это должно быть замечено как можно раньше
- Отсутствие циклических зависимостей на масштабе всего приложения
- Часто приводят к неожиданному, нежелательному поведению, лучше избегать их совсем
Правило
Для выполнения этих требований, в рамках методологии, необходимо соблюдать базовое правило:
Модуль может зависеть только от "нижележащих" модулей, но не от модулей с того же или более высокого слоя
features/auth
не может зависеть отfeatures/filters
и наоборотfeatures/auth
может зависеть отshared/ui/button
, но не наоборот
Следование этому правилу позволяет поддерживать зависимости "однонаправленными" - что автоматически исключает циклические импорты и значительно упрощает отслеживание зависимостей между модулями в приложении.
Выявление проблем
Нарушение этого правила является сигналом проблем:
- Модуль имеет импорт из другого модуля со своего слоя
- Возможно, модуль был излишне раздроблен или имеет лишнюю ответственность.
- Следует объединить его с импортируемым модулем или вынести его (частично или целиком) на слой ниже или перенести логику связей в модули на вышестоящих слоях.
- Модуль импортируется многими модулями со своего слоя
- Возможно, модуль имеет лишнюю ответственность.
- Следует вынести его (частично или целиком) на слой ниже, либо перенести логику связей в модули на вышестоящих слоях.
- Модуль имеет импорты из множества модулей со своего слоя
- Возможно, модуль принадлежит к другой области ответственности.
- Следует вынести его (частично или целиком) на слой выше.