Архитектура приложения - это способ структурирования программных компонентов приложения для управления сложностью
Задача состоит с том, чтобы качественно сделать декомпозицию компонентов, уменьшить их переиспользование, были низкое зацепление и высокая связность, а также существовала возможность расширять систему, добавляя реализации с минимальным эффектом на существующие решения
В итоге мы хотим разделить модули на роли: обрабатывающие данные согласно бизнес-логике, реализующие представление и посредник между ними
Простым решением является архитектура “Модель-Представление-Контроллер” (Model-View-Controller, MVC), состоящая из 3 компонентов:
Вместо контроллера может быть презентатор (тогда получается MVP, Model-View-Presenter) или другой компонент, выполняющий больше или меньше функций
Архитектура MVC соответствует принципу единственной ответственности и имеет высокую связность, но также имеет высокое зацепление: чтобы изменить, например, модуль представления, нужно изменить контроллер

Трехслойная архитектура (или трехуровневая, Three-tier architecture) делит программные модули на три слоя:
В трехслойной архитектуре разделяют 2 типа моделей данных:

В гексагональной (или шестиугольной) архитектуре (Hexagonal architecture) у компонента бизнес-логики есть порты двух типов:
Гексагональная архитектура позволяет сделать бизнес-логику независимой от вспомогательных реализаций

Важно подметить, что архитектура не имеет ничего общего с шестиугольниками
Луковая (также “чистая”, Clean Architecture) архитектура основывается на гексагональной, но в отличии от нее компонент с бизнес-логикой разделяется на части с доменными сервисами (Domain Services) и доменными моделями (Domain Model)
Архитектура выделяет слой приложения - связующее звено между инфраструктурными абстракциями и доменом
