Как компоненты располагаются друг относительно друга

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

В многокомпонентной системе положение каждого компонента относительно других может быть выше или ниже (A).

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

Под первичным вызовом следует понимать тот вызов, который был сделан первым. Хотя шина событий вызывает серверную часть, передавая ей события, она считается расположенной ниже, поскольку первым запросом был запрос на подписку, subscribe, который сделал сервер.

Понять расположение компонентов относительно друг друга можно и через зависимости между ними. У компонента серверной части в списке зависимостей будет и база данных, и шина событий; напротив, ни у базы данных, ни у шины событий не будет в зависимостях серверная часть.

Два компонента могут быть одновременно и верхними, и нижними друг к другу (B). Так, например, два компонента могут быть и публикаторами, и подписчиками друг друга.

Понимание расположения компонентов друг относительно друга позволяет правильно размещать классы внутри компонента. Например, контроллер, через который к серверной части будет обращаться клиент, будет расположен в слое презентации, в то время как контроллер callback’а/webhook’а платёжной системы должен располагаться в инфраструктурном слое (точнее, в слое презентации инфраструктурного слоя), поскольку компонент платёжного шлюза расположен ниже серверной части.