Similar presentations:
Архитектурные стили
1.
Архитектурные стили2.
Архитектура3.
При использовании DDD подхода мыфокусируемся на смысловом ядре
предметной области
Архитектура должна поддерживать эту
возможность, защищая содержимое
смыслового ядра от посторонней логики
4.
Основной метод построения архитектуры– декомпозиция, т.е. разбиение на
компоненты
Разбиение на классы
Разбиение на модули
Каждая компонента должна решать
определенный круг проблем
5.
Я хочу иметь возможностьсосредоточиться на сложных
аспектах системы по отдельности,
поэтому когда мне становится
сложно это делать, я начинаю
разбивать классы и выделять новые
Дядюшка Боб
6.
Если мы выбрали DDD то само собойразумеется одним из самых узких мест в
нашем проекте является сложность бизнес
логики
Соответственно, выносим бизнес логику в
отдельные компоненты
7.
Классическая многоуровневаяархитектура
Архитектуры ориентированные
на домен
Основа – слой работы с данными
Основа – бизнес логика
8.
12
Business Logic (BLL)
1
Data Access (DAL)
Infrastructure
Presentation
1. Нижние уровни не взаимодействуют с верхними
2. Проход через слой (не)допустим
9.
Невозможно предотвратитьраспределение кода модели между
уровнями
Соответственно бизнес логика
привязывается к коду не относящемуся
к доменному слою
10.
Бизнес слой должен бытьТестируемым
Бизнес правила могут быть протестированы напрямую
(не через UI, DB, веб-сервис и т.п.)
Независимым от используемого каркаса (Frameworks)
Каркас это инструмент, который не должен накладывать
ограничения на ко доменной модели
Независимым от UI
UI может быть заменен без изменения доменной модели
Независимым от способа хранения данных (Database)
Вы можете переключаться между реляционными и NoSQL
базами данных без изменения в коде бизнес логики
Независимым от внешних служб
Ваша бизнес логика вообще не должна знать о существовании
внешних сервисов
11.
The Clean ArchitectureUncle Bob
Hexagonal Architecture (a.k.a. Ports and Adapters)
Alistair Cockburn
Адаптировано Steve Freeman, Nat Pryce
Growing Object Oriented Software
Onion Architecture
Jeffrey Palermo
Screaming Architecture
blog of Uncle Bob
DCI
James Coplien, Trygve Reenskaug
BCE
Ivar Jacobson from
Object Oriented Software Engineering:
A Use-Case Driven Approach
12.
13.
FrameworkApplication
Domain
Core
Domain
14.
Под различные внешние ресурсы заводимпорты, которые могут быть использованы
(адаптированы) для использования другими
слоями
Примеры внешних ресурсов
файловая система,
сетевые хранилища
API третьих систем
база данных
пользовательский интерфейс
15.
1. С помощью тестов и заглушек(in-memory database)
прорабатываем бизнес слой
2. Дописываем GUI продолжая
работать с заглушкой DB
3. Используя интеграционные
тесты (под CI) добавляем
реальную базу данных с
тестовыми данными
4. Передаем на приемку
Проверяем
работоспособность всех
компонент системы
16.
1. Приложение строится вокругнезависимой объектной модели
2. Внутренние слои закрыты
интерфейсами
Внешние слои реализуют интерфейс
3. Ассоциации направлены всегда к центру
4. Код ядра приложения может быть
скомпилирован и запущен отдельно от
инфраструктуры
Jeffrey Palermo
2008
17.
18.
Модуль таблицы (Table Module)представляет собой объект, в единственном экземпляре,
обрабатывающий бизнес логику для всех записей в
таблице базы данных, либо представления
Сценарий транзакции (Transaction script)
организует взаимодействие с бизнес-логикой
посредствам процедур, принимающих запросы с уровня
представления
Модель предметной области (Domain Model)
непосредственно, объектная модель предметной
области, включающая в себя как поведение, так и данные
«Архитектура корпоративных программных приложений»
Patterns of Enterprise Application Architecture (P of EAA)
Мартин Фаулер
19.
Логика простаяСценарий транзакции
Логика сложная
Модель предметной области
Логика средней сложности
Среда разработки позволяет
манипулировать множеством записей
Модуль таблицы
20.
На уровне приложения реализуются сервисыприложения (Application Service) управляющие
логикой приложения
Логика приложения представляет собой реализацию
прецедента использования (Use Case)
Не должна сводиться к банальному CRUD
подвержена изменению в меньшей степени, чем бизнес
логика (изменяется при изменении контракта)
Сервис приложения является фасадом для доменного
слоя
Сервис приложения трансформирует бизнес модель в
модель представления
21.
Интерфейс доступа к доменуdomain façade
Сценарий операции
operation script
Разделение моделей команд и запросов
CQRS
Модель чтения (Read Model)
Модель записи (Write Model)
22.
Содержит службы которые представляютсобою
Порты для подключения к внешним ресурсам
Адаптеры для подключения к слою логики
приложения
23.
Бизнес логика не должна размазываться послоям приложения
Smart UI
Бизнес логика описывается на слое представления
FSUC (Fat Stupid Ugly Controller)
Анти-паттерн характерный для MVC стиля, бизнес
логика формируется на контролерах
Логика не относящаяся к бизнес логике не
должна засорять доменную модель
Active Record
Логика взаимодействия с базой данных
формируется в доменной модели
24.
Интеллектуальный пользовательский интерфейсSmart UI
1. Он позволяет получить видимый результат
исключительно быстро
2. Если проект очень мал (и не будет расти), т.е. сложность
никогда не станет проблемой, то стоимость более
изощренной архитектуры перевешивает ее преимущества
3. Имеется наиболее очевидная ассоциация между
элементами графического пользовательского интерфейса и
подпрограммами в коде
25.
Толстые тупые уродливые контроллерыFat Stupid Ugly Controllers
Pádraic Brady (Zend Framework)
FSUC получает данные из БД (используя
уровень абстракции базы данных, делая вид,
что это модель) или манипулирует, валидирует,
записывает, а также передает данные в
представление
Контроллер - Модель мутант
26.
Толстый (содержащий модель) контроллерпрактически не поддается переносу и тестированию
(TDD)
мы не можем создать экземпляр класса
контроллера вне Фреймворка, контроллер жестко
привязан к определенному Фреймворку
Вид должен по возможности избегать контакта с
Контроллером и получать данные напрямую из
модели
Мне не нужно думать куда разместить бизнес
логику
27.
Активная запись (Active Record)активная запись используется наиболее
очевидный подход, при котором логика
доступа к данным включается в объект
домена
28.
Слой представления (UI)Стиль MVC (Model View Controller)
Может быть представлен различными паттернами
(MVC, MVP, MVVC и т.п.)
DCI
Слой взаимодействия с базой данных (DAL)
Неявное сохранение (Persistence Ignorant)
Доменные объекты недолжны быть связаны с
объектами DAL слоя (ни наследование, ни
дополнительные атрибуты не допускаются)
Паттерны O/R преобразования
в частности Unit of Work
29.
ВызовСинхронный
▪ Прямой вызов методов (Control-Freak)
▪ Сервис-локатор (Service Locator)
▪ Обращение зависимости (DI)
▪ Параметры
▪ Dependency Injection + IoC
Асинхронный
▪ Очереди сообщений
Данные
Передача доменных объектов
Объекты передачи данных (DTO)
30.
Должен базироваться на POJO (POCO,PORO)
Должен поддерживать «из коробки»
Dependency Injection (DI)
Аспект-ориентированное программирование
(АОП)
Интеграция с каркасами модульного
тестирования (JUnit, TestNG, Unitils и т.д.)
Хорошая интеграция с другими каркасами
(JPA, Hibernate, TopLink и т.д).
31.
Монолитное приложениеSOA архитектура
Микросервисы
Интеграция
Удаленный вызов процедур (RPC)
REST
Очереди сообщений
32.
Самое простое решение разместить веськод системы в одном модуле
33.
Несколькоограниченных
контекстов в одном
компоненте
Риск
возникновения
зависимостей
между
контекстами
34.
Несколько контекстовразделяют одну и туже
схему данных
Нарушение SRP
Изменения схемы
данных
необходимые
одному из
контекстов
сказываются на всех
35.
Все контексты находятся в едином репозиторииМного одновременно выполняемой работы
по проекту (Work In Progress (WIP))
Как реализовать новую опцию, если предыдущая
еще не завершена ? Ветвиться ?
Размытие модели (Models Blur)
Код диффундирует из одного контекста в другой
Стремясь избежать дублирования (Don’t Repeat
Yourself (DRY)) программисты смешивают
контексты
▪ Не пытайтесь устранить дублирование. Следите за
изоляцией контекстов
36.
Разделяем систему по вертикали37.
Для поддержки унаследованного кодаиспользуем концепт пузыря (bubble context)
Bubble Context
Autonomous Bubble Context
38.
Унаследованный код можно выделить какотдельный сервис
39.
Через разделение данныхБаза данных
Файловая система
Синхронное взаимодействие
RPC
Simple Object Access Protocol (SOAP)
REST
Асинхронное взаимодействие
Очереди сообщений
40.
41.
42.
Синхронный вызов блокирует вызывающегоклиента
Сбои сети приводят к отказам в
обслуживании
Высокая стоимость масштабирования
Высокий уровень связанности
Логическая связанность (Logical Coupling)
▪ Изменения вызываемого сервиса ломают вызывающий
Временная связанность (Temporal Coupling)
▪ Задержки выполнения на вызываемом сервисе
сказываются на времени ожидания на вызывающем
сервисе
43.
CAP теоремаРаспределенные ограниченные контексты
не могут все время находится в
согласованном состоянии
Возможна только эвентуальная
согласованность (Eventual Consistency)
Basically Available, Soft state, Eventual
consistency (BASE)
44.
45.
Технологически сложнее чем RPCДороже в реализации
Сложнее найти/подготовить
квалифицированного разработчика
Решение часто зависит от платформы
Большинство внешних систем
поддерживают PRC (SOAP) и/или REST
протоколы взаимодействия
Для интеграции с ними потребуются
дополнительные усилия
46.
МасштабируемостьДоступность
Отказоустойчивость
47.
Основное преимущество – низкая степеньсвязанности
Декомпозиция контекста на несколько
бизнес компонент
Декомпозиция бизнес компонент
на несколько компонент
48.
49.
Единый транспортный протоколчаще всего REST
Хореография вместо оркестровки
Преимущества
Быстрая реализация опций
от заказа до рынка