Перейти к основному содержимому

Взаимодействие модулей приложения

В рамках методологии все модули распределены по зонам ответственности (layer, slice, segment)

Слои, в свою очередь, организованы вертикально:

  • "Внизу" находятся переиспользуемые модули (ui-kit, внутренние библиотеки проекта), как наиболее абстрактные
  • А по мере продвижения "вверх" располагаются более специфичные модули.

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

Требования#

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

  1. Слабое зацепление с другими модулями
    • Изменение в одном модуле должно слабо и предсказуемо влиять на другие
  2. Высокая связность - обязанности каждого модуля "сфокусированы" на одной задаче
    • Если модуль имеет слишком много ответственностей (начинает "делать слишком много") - это должно быть замечено как можно раньше
  3. Отстутствие циклических зависимостей на масштабе всего приложения
    • Часто приводят к неожиданному, нежелательному поведению, лучше избегать их совсем

Правило#

Для выполнения этих требований, в рамках методологии, необходимо соблюдать базовое правило:

Важно

Модуль может зависеть только от "нижележащих" модулей, но не от модулей с того же или более высокого слоя

  • features/auth не может зависеть от features/filters и наоборот
  • features/auth может зависеть от shared/ui/button, но не наоборот

Следование этому правилу позволяет поддерживать зависимости "однонаправленными" - что автоматически исключает циклические импорты и значительно упрощает отслеживание зависимостей между модулями в приложении.

Выявление проблем#

Нарушение этого правила является сигналом проблем:

  1. Модуль имеет импорт из другого модуля со своего слоя
    • Возможно, модуль был излишне раздроблен или имеет лишнюю ответственность.
    • Следует объединить его с импортируемым модулем или вынести его (частично или целиком) на слой ниже или перенести логику связей в модули на вышестоящих слоях.
  2. Модуль импортируется многими модулями со своего слоя
    • Возможно, модуль имеет лишнюю ответственность.
    • Следует вынести его (частично или целиком) на слой ниже, либо перенести логику связей в модули на вышестоящих слоях.
  3. Модуль имеет импорты из множества модулей со своего слоя
    • Возможно, модуль принадлежит к другой области ответственности.
    • Следует вынести его (частично или целиком) на слой выше.

См. также#