(04.12.2025 in LOG)
Главное!
Все эти понятия самостоятельны и их нельзя обобщать.
Dependency rule предлагает подход к решению вопросов separation of concerns, а three-layered architecture (при использовании DI) удачно реализует dependency rule в GO.
“Separation of concerns. They all (architectures of systems) achieve this separation by dividing the software into layers”. Разделение обязанностей достигаемое (архитектурами систем) путём деления программного обеспечения на слои.
Это цель при создании программы.1️⃣
Each of these architectures produce systems that are (каждая из этих (перечисленных в статье) архитектур создаёт системы, которые):
Independent of Frameworks (независимы от фреймворков).
Testable.
Independent of UI (независимы от пользовательского интерфейса)
Independent of Database.
Independent of any external agency. Независимы от каких-либо внешних факторов. Фактически, ваши бизнес-правила просто ничего не знают о внешнем мире.
Dependency Rule (правило зависимости, это о круговой диаграмме дяди Боба).
Это правило помогает достичь цели из п.1️⃣,
предлагая выделить определенные слои (на диаграмме) и соблюдать определенные подходы.
Оно гласит, что зависимости исходного кода могут указывать только внутрь . Ничто во внутреннем круге не может знать ничего о чём-либо во внешнем круге. В частности, имя объекта, объявленного во внешнем круге, не должно упоминаться в коде во внутреннем круге. Это включает функции, классы, переменные и любые другие именованные программные сущности.
Dependency Injection (DI) это шаблон проектирования позволяющий реализовать в GO правило из п.2️⃣
Three-layered architecture (N-tier architecture) это популярный архитектурный подход к проектированию приложений, который обеспечивает четкое разделение обязанностей (separation of concerns1️⃣), масштабируемость и простоту поддержки. В GO этот подход широко использует DI3️⃣.
В контексте Go, эта архитектура обычно делится на три логических слоя:
Уровень обработчиков/представления (Handler/Presentation Layer)
Этот слой отвечает за взаимодействие с внешним миром и является точкой входа в приложение.
“Обязанности”:
Прием входящих запросов (например, HTTP-запросов).
Парсинг и валидация входящих данных (JSON, параметры URL и т.д.).
Преобразование данных запроса в формат, понятный для уровня сервисов.
Маршрутизация запросов к соответствующему сервису.
Подготовка и отправка ответа клиенту.
В Go: Обычно реализуется с помощью функций HTTP-обработчиков (handlers) из стандартной библиотеки net/http или сторонних фреймворков/маршрутизаторов.
Уровень сервисов/бизнес-логики (Service/Business Logic Layer)
Этот слой содержит основную бизнес-логику приложения и управляет потоком операций.
“Обязанности”:
Реализация бизнес-правил и логики предметной области.
Оркестрация процессов и координация между различными компонентами.
Выполнение операций, которые могут потребовать взаимодействия с несколькими репозиториями или внешними сервисами.
Применение дополнительной логики до или после взаимодействия с уровнем данных.
В Go: Представляется в виде структур (structs) с методами, которые принимают интерфейсы репозиториев в качестве зависимостей (Dependency Injection) для обеспечения тестируемости и слабой связанности.
Уровень доступа к данным/хранилища (Data Access/Repository Layer)
Этот слой отвечает исключительно за взаимодействие с источниками данных, такими как базы данных, файловые системы или внешние API.
“Обязанности”:
Выполнение операций CRUD (Create, Read, Update, Delete).
Работа с SQL-запросами или ORM.
Абстрагирование бизнес-логики от деталей конкретной базы данных.
В Go: Обычно реализуется через интерфейсы репозиториев (Repository interfaces), а конкретные реализации этих интерфейсов отвечают за фактическое хранение или извлечение данных.
Типичная организация файлов и папок в проекте Go, использующем трехслойную архитектуру, может выглядеть так:
/go-service/
├── cmd/ # Точки входа приложения (main функции)
├── internal/
│ ├── handler/ # Обработчики HTTP (презентационный слой)
│ ├── service/ # Бизнес-логика (слой сервисов)
│ └── repository/ # Доступ к данным (слой хранилища)
├── model/ # Общие структуры данных/модели предметной области
└── pkg/ # Переиспользуемые утилиты (логирование, конфиг и т.д.)
