Skip to content
IRC-CodingIRC-Coding
Layered ArchitectureArchitektur sloyevDTOService LayerSecurity Layer

Layered Architecture: слои, DTO, правила

Архитектура слоев: UI, Business, Data Access, Security. DTO, правила, преимущества и экзаменационные вопросы.

S

schutzgeist

9 min read
Layered Architecture: слои, DTO, правила

Архитектура ПО: Слойная архитектура

Этот материал объясняет концепцию слойной архитектуры с примерами экзаменационных вопросов, основными компонентами и практическими примерами.

При разработке приложения, которое должно оставаться поддерживаемым и расширяемым долгие годы, нужна четкая структура. Слойная архитектура, также известная как Layered Architecture, это один из самых популярных архитектурных паттернов. Она разделяет приложение на расположенные друг над другом слои, каждый из которых решает конкретную задачу. На экзаменах и в повседневной работе часто спрашивают о составе слоев, их функциях и правилах взаимодействия.

In a Nutshell

Layered Architecture организует систему в отдельные уровни с четкой ответственностью. Каждый слой отвечает за определенный аспект приложения и взаимодействует только с расположенным непосредственно под ним слоем. Такой подход способствует разделению ответственности, улучшает поддерживаемость, тестируемость и масштабируемость.

Краткое описание

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

Типичные слои:

  • Слой представления (UI): Отображает данные и обрабатывает пользовательский ввод. Не содержит бизнес-логики.
  • Слой бизнес-логики (Business Layer): Содержит логику предметной области, правила и процессы. Здесь проводится валидация.
  • Слой доступа к данным (Data Access Layer): Отвечает за чтение и запись данных, часто через репозитории или DAOs.
  • Инфраструктурный слой: Предоставляет кросс-функциональные возможности вроде логирования, безопасности, кеширования и конфигурации.

Во многих вариантах добавляют Service Layer, который служит фасадом между UI и бизнес-логикой, или Domain Layer, который особенно строго защищает основную логику.

Ключевые моменты для экзаменов

  • Четкая ответственность в каждом слое: Каждый слой имеет определенную функцию и содержит только относящийся к ней код.
  • Взаимодействие только с соседним слоем: Слой не должен перепрыгивать через другие слои, а общаться только с расположенным непосредственно под ним.
  • Разделение ответственности: UI, логика и доступ к данным отделены друг от друга. Это повышает поддерживаемость.
  • Способствует тестируемости: Каждый слой можно тестировать изолированно, если он подключен через интерфейсы.
  • Взаимозаменяемость: Слои можно заменять, не изменяя другие, при условии сохранения стабильных интерфейсов.
  • Часто встречается в проектах: Слойная архитектура классический экзаменационный материал и часто требуется в документации проекта.
  • Безопасность: Валидация, аутентификация и авторизация должны находиться в средних слоях, а не в UI.
  • DTOs: Data Transfer Objects доставляют данные между слоями, не раскрывая внутренние сущности.
  • Обработка ошибок: Ошибки обрабатываются в том слое, где их проще всего разрешить, или передаются в слой выше.
  • Документация: Диаграмма слоев с описанием каждого слоя важна в документации проекта.
  • Экономичность: Четкие слои снижают затраты на обслуживание и упрощают адаптацию новых членов команды.

Основные компоненты

  1. UI (Слой представления) Слой UI это интерфейс пользователя. Он отображает данные, принимает введенные данные и передает их в слой ниже. Не содержит бизнес-логики, только логику представления и навигации.

  2. Business (Слой бизнес-логики) Слой Business содержит основную логику приложения. Здесь реализуются бизнес-правила, вычисления и принятие решений. Валидация обычно происходит здесь, перед передачей данных в слой доступа к данным.

  3. Data Access (Слой доступа к данным) Слой доступа к данным отвечает за чтение и запись данных. Он абстрагирует базу данных или другие источники данных, например, через репозитории или DAOs. Слой выше не знает деталей технологии базы данных.

  4. Infrastructure (Инфраструктура) Компоненты инфраструктуры кросс-функциональны: логирование, конфигурация, кеширование, шифрование, обмен сообщениями и технические утилиты. Они могут использоваться во всех слоях без смешивания с бизнес-логикой.

  5. DTOs (Data Transfer Objects) DTOs это простые объекты, которые доставляют данные между слоями. Они не содержат логики и предотвращают передачу внутренних сущностей или моделей базы данных в UI.

  6. Валидация Валидация проверяет, соответствуют ли входные данные бизнес-правилам. Обычно происходит в слое Business, дополняясь базовыми проверками формата в UI-слое.

  7. Обработка ошибок Каждый слой обрабатывает ошибки в своей зоне ответственности. Технические ошибки часто обрабатываются в слое доступа к данным или инфраструктурном слое, бизнес-ошибки в слое Business. Понятные для пользователя сообщения формируются в UI-слое.

  8. Service Layer Service Layer предоставляет фасад для бизнес-логики. Он координирует несколько Domain-объектов и предоставляет UI-слою четко определенный интерфейс.

  9. Auth/AuthZ Аутентификация и авторизация должны находиться в средних слоях. UI показывает только то, что разрешено пользователю, но решение о допустимости операции принимается в слое Business или Service.

  10. Build/Deploy Structure Слои могут отражаться в физической структуре проекта. Четкие проекты или пакеты для каждого слоя облегчают понимание и соблюдение архитектурных правил.

Практический пример: Система бронирования

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

Что здесь показывается?

  • UI-слой принимает бронирование от пользователя и показывает результаты.
  • Слой Business проверяет корректность бронирования, наличие свободных мест и рассчитывает цену.
  • Слой доступа к данным сохраняет бронирование в базе данных и читает информацию о доступных местах.
  • Инфраструктурный слой протоколирует операцию и гарантирует, что только авторизованные пользователи могут бронировать.

Почему это показывается?

Пример иллюстрирует, как данные и ответственность протекают через слои. Он показывает, почему UI не должен напрямую обращаться к базе данных и почему валидация происходит в слое Business. Демонстрирует также, как использовать DTOs для передачи только необходимых данных между слоями.

Система бронирования:

┌─────────────────────────────────────┐
│ UI-слой (React)                    │
│ → Ввод: создание бронирования      │
└──────────────┬──────────────────────┘
               │ DTO (BuchungRequest)

┌─────────────────────────────────────┐
│ Service-слой (Java Spring)          │
│ → Координация, проверка Auth        │
└──────────────┬──────────────────────┘


┌─────────────────────────────────────┐
│ Слой Business (Java)                │
│ → Валидация, расчет цены            │
└──────────────┬──────────────────────┘
               │ DTO (BuchungEntity)

┌─────────────────────────────────────┐
│ Data Access слой (JPA/Repository)   │
│ → Сохранение и чтение бронирования  │
└─────────────────────────────────────┘

Преимущества и недостатки

Преимущества

  • Хорошая тестируемость: Каждый слой можно тестировать отдельно, если он имеет стабильные интерфейсы.
  • Четкое разделение ответственности: UI, логика, данные и инфраструктура отделены друг от друга. Код становится понятнее.
  • Лучшее сотрудничество в команде: Разные команды могут параллельно работать над разными слоями, например фронтенд, бэкенд и база данных.
  • Взаимозаменяемость: Один слой можно заменить другим, не трогая остальные, если интерфейсы остаются неизменными.
  • Переиспользование: Слой бизнес-логики можно применять для разных UI-технологий или клиентов.
  • Удобство в поддержке: Изменения обычно касаются только одного слоя, что упрощает адаптацию и поиск ошибок.

Недостатки

  • Излишние затраты на маленьких проектах: Для простых приложений слоистая архитектура может требовать слишком много структуры и boilerplate кода.
  • Потери производительности: Каждый дополнительный слой может добавить задержку и затраты на преобразование, особенно если преобразуется много DTO.
  • Жесткость: При слишком строгом применении сложно реализовать сквозные функции чистым способом.
  • Сложность: Правила слоев нужно соблюдать и контролировать, иначе быстро получится каша.
  • Неправильное распределение: Если логика попадает не в тот слой, модель теряет свои преимущества.

Открытый вопрос

В проектах IHK выбирай слоистую архитектуру, когда нужно документировать приложение с четко разделенной ответственностью. Покажи диаграмму слоев, опиши каждый слой одним предложением и объясни, почему это разделение имеет смысл. Укажи, где происходит валидация, аутентификация и обработка ошибок. Для очень маленьких инструментов или прототипов слоистая архитектура может быть избыточной.

Стратегия обучения

1. Набросай диаграмму слоев

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

2. Разработай свой пример

Возьми пример из своей повседневной жизни: интернет-магазин или систему бронирования. Подумай, какие классы в какой слой должны попасть и какие DTO передаются между ними.

3. Отработай правила

Сформулируй основные правила слоистой архитектуры своими словами: “Один слой общается только с соседним снизу.” “UI не содержит бизнес-логику.” “Валидация принадлежит слою бизнес-логики.”

4. Проанализируй ошибочные примеры

Найди примеры кода, где слои смешаны, например SQL-запросы прямо в UI. Подумай, как переделать код по правилам слоистой архитектуры.

5. Пройди через сценарий экзамена

Представь себе вопрос на экзамене: “Обоснуйте выбор слоистой архитектуры для системы бронирования.” Сформулируй ответ, охватывающий разделение ответственности, тестируемость и удобство в поддержке.

Анализ темы

  • Технический стержень: Слои, DTO, интерфейсы, валидация, обработка ошибок, Service Layer
  • Вызовы: Избежание смешивания слоев, правильный баланс между строгостью и гибкостью, лишние затраты на маленьких проектах
  • Безопасность: Аутентификация, авторизация и валидация в средних слоях
  • Документация: Диаграмма слоев, описание каждого слоя, обоснование выбора архитектуры
  • Экономика: Удобство в поддержке, параллельная разработка, взаимозаменяемость, снижение стоимости при изменениях

FAQ: слоистая архитектура и Layered Architecture

1. Что такое слоистая архитектура?

Слоистая архитектура разделяет приложение на расположенные друг над другом логически отделенные слои. Каждый слой несет свою ответственность и обычно общается только с расположенным прямо под ним слоем.

2. Что такое Layered Architecture?

Layered Architecture - архитектурный паттерн, разделяющий приложение на горизонтальные слои. Это один из наиболее часто используемых паттернов в разработке ПО.

3. Какие слои обычно выделяют?

Типичные слои: представление, бизнес-логика, доступ к данным и инфраструктура. В зависимости от варианта добавляют Service Layer или Domain Layer.

4. За что отвечает слой представления?

Слой представления отображает данные и получает ввод от пользователя. Он не содержит бизнес-логику, только логику отображения и навигации.

5. За что отвечает слой бизнес-логики?

Слой бизнес-логики содержит логику предметной области, бизнес-правила, вычисления и валидацию. Это сердце приложения.

6. За что отвечает слой доступа к данным?

Слой доступа к данным занимается чтением и записью данных. Он скрывает детали базы данных или других источников данных через репозитории или DAO.

7. За что отвечает слой инфраструктуры?

Слой инфраструктуры предоставляет сквозные функции: логирование, кэширование, конфигурацию, шифрование и обмен сообщениями.

8. Что такое Service Layer?

Service Layer - дополнительный слой между UI и бизнес-логикой. Он координирует несколько бизнес-процессов и предоставляет UI четко определенный интерфейс.

9. Что такое DTO?

DTO (Data Transfer Object) - простой объект, передающий данные между слоями. Он не содержит логики и предотвращает попадание внутренних сущностей в UI.

10. Что означает разделение ответственности?

Разделение ответственности означает, что разные аспекты приложения - представление, логика, доступ к данным - находятся в отдельных компонентах. Это снижает связанность и сложность.

11. С каким слоем может взаимодействовать слой?

В классической слоистой архитектуре слой общается только со своим непосредственным соседом снизу. Это предотвращает возникновение зависимостей по всей системе.

12. Что происходит, если смешать слои?

При смешивании слоев быстро образуется “спагетти-код”. Приложение становится сложнее тестировать, поддерживать и изменять.

13. Куда должна идти валидация?

Бизнес-валидация принадлежит слою бизнес-логики. UI может дополнительно выполнять базовые проверки формата, но не должна принимать решения о бизнес-правилах.

14. Куда должна идти аутентификация?

Аутентификация и авторизация принадлежат средним слоям, то есть Service или Business слою. UI только показывает, что пользователь может видеть, а проверка прав принимается централизованно.

15. Что такое Repository?

Repository - паттерн слоя доступа к данным. Он инкапсулирует доступ к источнику данных и предоставляет слою бизнес-логики чистый интерфейс для чтения и записи данных.

16. Что такое DAO?

DAO (Data Access Object) - объект, инкапсулирующий доступ к базе данных или другому источнику данных. Это паттерн, похожий на Repository.

17. Почему слоистая архитектура хорошо тестируется?

Каждый слой можно тестировать отдельно благодаря стабильным интерфейсам. Слой доступа к данным можно заменить на fake или mock для тестирования бизнес-логики.

18. Почему слоистая архитектура удобна в поддержке?

Изменения обычно касаются только одного слоя. Если менять UI, не нужно трогать бизнес-логику. Если менять базу данных, остаешься в слое доступа к данным.

19. Когда слоистая архитектура неуместна?

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

20. Что такое диаграмма слоев?

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

21. В чем разница между слоями и уровнями?

Слои описывают логическое разделение внутри приложения. Уровни описывают физическое распределение на разные машины или сети, например клиент, сервер и база данных.

22. Что такое Domain Layer?

Domain Layer - дополнительный слой, особо защищающий чистую бизнес-логику. Содержит сущности, объекты-значения и Domain Services независимо от технологии и UI.

23. Что такое гексагональная архитектура?

Гексагональная архитектура, или Ports and Adapters, - вариант слоистой архитектуры. Она отделяет логику приложения в центре от внешних адаптеров вроде UI, базы данных или обмена сообщениями.

24. Что такое Onion Model?

Onion Model - еще один вариант слоистой архитектуры. Логика предметной области находится в центре, а остальные слои как инфраструктура и UI - это внешние кольца, построенные на ней.

25. Что должно быть в документации проекта по слоистой архитектуре?

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

Keine Bücher für Kategorie "software-architektur" gefunden.

Дополнительные материалы

  1. https://learn.microsoft.com/en-us/azure/architecture/guide/architecture-styles/layered
  2. https://arc42.org/
Назад к блогу
Share:

Nächster Artikel in Архитектура программного обеспечения

Weiterlesen
Микросервисы: Bounded Context, Saga, Observability

Похожие статьи