Download - DDD Workshop
![Page 1: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/1.jpg)
DDD workshopfor Java developers
Бибичев Андрейянварь 2010 г.
![Page 2: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/2.jpg)
I. ВводнаяxDD / История DDD / Domain Model
![Page 3: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/3.jpg)
![Page 4: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/4.jpg)
ДЮДЮКИ:
TDD
DDDBDD
FDDVDD
Test-Driven Development
Domain-Driven Design
Behaviour-Driven Development
Feature-Driven Development
Value-Driven Development
Самая известнаяпрактика
Нынче очень модное направление проектирования
Сменщик TDD
Одна из самых навороченных
Agile-методологий Как затуманить заказчику мозги
![Page 5: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/5.jpg)
DDDDomain-Driven Design
![Page 6: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/6.jpg)
История
2004 годEric Evans
«Domain-Driven Design - Tackling Complexity in the Heart of Software»
![Page 7: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/7.jpg)
![Page 8: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/8.jpg)
http://www.infoq.com/domain-driven-design
. . .
![Page 9: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/9.jpg)
Domain (словарь)
• наследственная собственность; имение, поместье; земли; владение
• территория, зона, область, район (отмеченные некоторыми физическими особенностями)
• сфера (интересов), поле (деятельности), область (знаний)
• область определения (мат.)
e.g. DNS
Домен поля таблицы в БД
В данном случае этот смысл
![Page 10: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/10.jpg)
Business Domain
Т.е. это о
и
Business Logic
Предметной области
Бизнес-логики
![Page 11: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/11.jpg)
«Attention was diverted away from rich logic and deep solutions, because there was so much value in just getting data onto the web, along with very simple behavior.
But now that basic level of web usage has largely beenassimilated, and projects are starting to get more ambitious again about business logic.»
![Page 12: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/12.jpg)
DDD
Центральная роль в мышлении,
проектировании, реализации
![Page 13: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/13.jpg)
Пример: есть сайт конференции, надо сделать голосование за доклад
![Page 14: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/14.jpg)
О чем вы прежде всегоначнете думать?
![Page 15: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/15.jpg)
О чем вы прежде всегоначнете думать?
votes
![Page 16: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/16.jpg)
О чем вы прежде всегоначнете думать?
![Page 17: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/17.jpg)
О чем вы прежде всегоначнете думать?
![Page 18: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/18.jpg)
/
![Page 19: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/19.jpg)
История из жизни или«Когда я был маленьким …»
![Page 20: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/20.jpg)
Три аспекта DDD
![Page 21: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/21.jpg)
II. МоделированиеМодель / Элементы UML / Пример
/ Интерактивный практикум
![Page 22: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/22.jpg)
![Page 23: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/23.jpg)
Модель –
это упрощенное
приближение реальности.
Максимально простое,
при условии достаточной
близости к действительности.
Пр
осто
та !=П
ри
ми
тивн
ость
![Page 24: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/24.jpg)
Нам это знакомосо школы
![Page 25: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/25.jpg)
Ньютон
![Page 26: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/26.jpg)
Эйнштейн
![Page 27: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/27.jpg)
Шредингер
![Page 28: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/28.jpg)
Дирак
![Page 29: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/29.jpg)
В физике в качестве
формализма для
моделей используют
мат.аппарат, а в
программировании
уже лет 20 – ООП:
![Page 30: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/30.jpg)
Гради Буч
![Page 31: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/31.jpg)
А в качестве
граф. нотации –
UML
в режиме эскизного
проектирования:
![Page 32: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/32.jpg)
Способыиспользования
UML
ЭСКИЗИРОВАНИЕ
(набросок от руки)
Проектирование
(чертеж)
Программирование
(граф.представление кода)
Граф
ическая
нотация
Метам
одель
Executable UML, MDA, PIM
![Page 33: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/33.jpg)
/
![Page 34: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/34.jpg)
![Page 35: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/35.jpg)
Документирование
Бизнес-анализ
(анализ требований)
Системнаяархитектура
(проектирование)
Модель предметной области;Словарь терминов
Понятия изпредметной области
Модель программы;Понимание чужого кода
Представление конструкций языка.Ограничения по приемам проектирования
Движение слева направо по мере уточнения, детализации и реализации
![Page 36: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/36.jpg)
Класс(class)
Наследование(inheritance)
Свойство(property)
Метод(method)
Ссылка, связь(reference, link)
Сущность(entity)
Обобщение(generalization)
Атрибут(attribute)
Операция(operation)
Ассоциация(association)
Фун
кцио
нальн
ость
(fea
ture
)
ПО Предметнаяобласть
Нюансы терминологии:
![Page 37: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/37.jpg)
Упражнение 1(разминка)
![Page 38: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/38.jpg)
Система продажи
билетов на самолет
![Page 39: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/39.jpg)
•Эксперт: Есть аэропорты. Для каждого известны:название на местом языке,уникальный латинский коди GPS-координаты.
•Мы:
![Page 40: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/40.jpg)
•Эксперт: Аэропорты расположены в городах.Для каждого города известно егоназвание (на местном и англ. языках). Причем известно расстояние от аэропортадо центра города, к которому он «приписан».
•Мы:
![Page 41: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/41.jpg)
•Эксперт: Для каждого города есть информацияо стране, в которой он находится.
•Мы:
![Page 42: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/42.jpg)
Шаг 4
• Есть информация по рейсам самолетов: номер рейса (уникален), аэропорты вылета и прилета
• Время вылета по местному времени города, из которого производится вылет
• Время прилета по местному времени города, из которого производится вылет
![Page 43: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/43.jpg)
![Page 44: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/44.jpg)
Шаг 5
• Можно ли реализовать вычислимые атрибуты:
– Время вылета по гринвичу
– Время прилета по гринвичу
– Время в пути
• Если нет, то чего для этого не хватает (добавьте это на диаграмму вместе с вычислимыми атрибутами)
![Page 45: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/45.jpg)
![Page 46: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/46.jpg)
Шаг 6
• Рейсы делятся на регулярные и чартерные
• Для регулярных рейсов известно расписание их полетов в днях недели (по каким дням недели осуществляется рейс)
• Для чартерных рейсов расписание задается как просто конкретные даты, по которым выполняется рейс
![Page 47: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/47.jpg)
![Page 48: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/48.jpg)
Шаг 7
• Для всех рейсов есть информация по модели самолета, на которой осуществляется перелет, со следующими характеристиками:
– Название модели
– Количество мест эконом-класса
– Количество мест бизнес-класса
– Наличие курящего салона и количество мест в нём
![Page 49: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/49.jpg)
Шаг 8
• Кроме того, для всех рейсов известна компания-перевозчик
• А у каждого перевозчика есть свой набор тарифов, каждый из которых определяет:– Цену билета на соответствующий вид места (бизнес-
класс, эконом-класс, курящий салон)– Причем цена зависит от степени наполнения самолета
(в каком диапазоне лежит количество проданных билетов на данный вид мест)
• Тарифы действуют определенный промежуток времени
• Для рейса известен тариф, по которому продаются билеты в настоящее время
![Page 50: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/50.jpg)
Шаг 9
• В системе есть информация по наличию свободных мест (для каждого класса) с учетом возможной брони
• Причем необходимо показывать текущую цену, по которой в данный момент продаются билеты заданного класса на данный рейс (на дату)
![Page 51: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/51.jpg)
Шаг 10
• Дальше можно вспомнить что еще бывают всякие скидки, детские билеты, перенос рейсов, отмена и т.д.
• НО МЫ ЭТОГО ДЕЛАТЬ НЕ БУДЕМ
![Page 52: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/52.jpg)
![Page 53: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/53.jpg)
А где методы?
![Page 54: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/54.jpg)
Упражнение 2(интерактив)
![Page 55: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/55.jpg)
![Page 56: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/56.jpg)
Итого
![Page 57: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/57.jpg)
![Page 58: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/58.jpg)
Feature-Driven Development (FDD):
Разработка общей модели
Составление списка функций
Планирование
Build by featureDesign by feature
Список функций(Feature list)
План разработки(A development plan)
Диаграмма классовпредметной области
Отгрузка!
1 – 3 недели
![Page 59: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/59.jpg)
История из жизни или«Когда я был маленьким …»
![Page 60: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/60.jpg)
III. Реализация в коде
Шаблоны / Варианты архитектур / Распределенные дилеммы
![Page 61: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/61.jpg)
СУБД Модель ОО-язык
таблица сущность класс
поле атрибут свойство
FK cвязь ссылка
хранимаяпроцедура
действие метод
![Page 62: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/62.jpg)
![Page 63: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/63.jpg)
![Page 64: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/64.jpg)
![Page 65: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/65.jpg)
Идентификация:- два объекта, один и тот же аэропорт
Жизненный цикл объекта:- создание /модификация / удаление
СозданиеОтражение в хранилище
Модификация
Удаление из хранилища
Чтение из хранилища
![Page 66: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/66.jpg)
![Page 67: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/67.jpg)
![Page 68: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/68.jpg)
![Page 69: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/69.jpg)
![Page 70: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/70.jpg)
![Page 71: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/71.jpg)
![Page 72: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/72.jpg)
![Page 73: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/73.jpg)
![Page 74: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/74.jpg)
![Page 75: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/75.jpg)
![Page 76: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/76.jpg)
Базовые классы – опционально!Альтернатива: интерфейс.
![Page 77: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/77.jpg)
![Page 78: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/78.jpg)
Самый известный
Value-object
![Page 79: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/79.jpg)
Value object
• Неизменность объекта (Immutable)– можно безопасно передавать
• Сравнение объектов = сравнение данных– позволяет распознавать одинаковые значения,
представленные в виде разных объектов
• Инкапсулирует проверку корректности значения– «Build-in anticorruption layer»
• Обеспечивает строгую типизацию– случайно не передашь Code вместо Name и наоборот
![Page 80: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/80.jpg)
![Page 81: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/81.jpg)
![Page 82: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/82.jpg)
![Page 83: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/83.jpg)
![Page 84: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/84.jpg)
![Page 85: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/85.jpg)
![Page 86: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/86.jpg)
![Page 87: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/87.jpg)
Mapping этого хозяйства на БД
CODE (PK) NAME LATITUDE LONGITUDE
DME Домодедово 12345 67890
AIRPORTS
![Page 88: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/88.jpg)
![Page 89: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/89.jpg)
![Page 90: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/90.jpg)
ID (PK) NAME …
12345 Любимый
TARIFFS
TARIFF_ID (FK) SEAT_KIND PRICE
12345 Эконом 100
12345 Бизнес 1000
12345 Стоя 10
TARIFF_ITEMS
![Page 91: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/91.jpg)
![Page 92: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/92.jpg)
ЗадачаВо многих местах логики и тестовсоздавать рейс по:• Код аэропорта Откуда• Код аэропорта Куда• UN модели самолета• ИНН компании перевозчика
![Page 93: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/93.jpg)
![Page 94: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/94.jpg)
![Page 95: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/95.jpg)
Сервисы
• Уровня доменной модели (Domain Servicies)– Инфраструктурные (API к системе сообщений, API
для интеграции с внешними системами, …)
– Согласованная работа с несколькими объектами («уволить всех сотрудников на заданную букву», …)
– Комбинированная алгоритмика (прокладка маршрутов, подбор оптимальных вариантов, …)
• Уровня приложения (Application Servicies)– чуть позже
![Page 96: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/96.jpg)
![Page 97: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/97.jpg)
Используете ORM => У вас DDD!!!
![Page 98: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/98.jpg)
+ возня с value-типами+ возня с агрегатами
Но ORM может сильно облегчить работу:
![Page 99: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/99.jpg)
Дополнительные полезные шаблоны
1. Specification– http://www.martinfowler.com/apsupp/spec.pdf
2. DomainEvent– http://martinfowler.com/eaaDev/DomainEvent.html
3. NullObject– http://www.owlnet.rice.edu/~comp212/00-
spring/handouts/week06/null_object_revisited.htm
4. Builder– http://www.ddj.com/java/208403883?pgno=2
![Page 100: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/100.jpg)
Архитектура
![Page 101: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/101.jpg)
Кар
тин
ка и
з кн
иж
ки
![Page 102: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/102.jpg)
UI (User Interface):
the easiest to understand, this layer is the responsible of displaying information to the user, and accept new data. It could be implemented for web, desktop, or any presentation technology, present or future. For example, it could be a voice application, that interacts with the user via a phone. The acid test for our design is that a radical change in user interface should have minimal (or controlled, at least) impact in the rest of the system.
![Page 103: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/103.jpg)
Application Layer:
it’s in charge of coordinating the actions to be performed on the domain. There are no business rules or domain knowledge here. No business state resides in this layer. It delegates all domain actions to the domain. It could coordinate many actions (possibly in many domains). It could prepare the infrastructure to be ready to work with the domain for an specific action (for example, preparing transaction scopes).
![Page 104: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/104.jpg)
Domain Layer:
In this layer resides the heart of software, according to Evans. Business rules and logic lives inside this layer. Business entity state and behavior is defined and used here. Communication with other systems, persistence details, are forwarded to the infrastruсture layer. Patterns: Entities, Value Objects, Services, Repositories and Factories.
![Page 105: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/105.jpg)
Infrastructure Layer:
God and devil are in the details, and in the infrastructure layer. Its main responsability is the persistence of the business state, most frequently, using a relational database.
The infrastructure consists of everything that exists independently of our application: external libraries, database engine, application server, messaging backend and so on.
![Page 106: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/106.jpg)
Обратите внимание,
на направление
зависимостей
и наследования
![Page 108: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/108.jpg)
Interface:
This layer holds everything that interacts with other systems, such as web services, RMI interfaces or web applications, and batch processing frontends. It handles interpretation, validation and translation of incoming data. It also handles serialization of outgoing data, such as HTML or XML across HTTP to web browsers or web service clients, or DTO classes and distributed facade interfaces for remote Java clients.
![Page 109: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/109.jpg)
Infrastructure:
Infrastructure consists of everything that exists independently of our application: external libraries, database engine, application server, messaging backend and so on.
Also, we consider code and configuration files that glues the other layers to the infrastructure as part of the infrastructure layer. Looking for example at the persistence aspect, the database schema definition, Hibernate configuration and mapping files and implementations of the repository interfaces are part of the infrastructure layer.
![Page 110: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/110.jpg)
Persistance
Model
Infrastructure
Do
mai
nA
pp
licat
ion
?Framework
![Page 111: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/111.jpg)
RichDomain Model
PureDomain Model
Persistance
Model
Persistance
Model
IoC
![Page 112: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/112.jpg)
Model
Persistance
EnityBase RepositoryBase Utils
Airport AirportRepository Mapping
Metadata
Ric
hD
om
ain
Mo
del
![Page 113: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/113.jpg)
Model
Persistance
AirportRepository
ImplUtils
Airport AirportRepository
Mapping
Metadata
«implement»«depends»
Pu
reD
om
ain
Mo
del
![Page 114: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/114.jpg)
http://www.devx.com/vb2themax/Article/19892/0/page/1http://www.devx.com/vb2themax/Article/19892/0/page/2http://www.devx.com/vb2themax/Article/19892/0/page/3http://www.devx.com/vb2themax/Article/19892/0/page/4
A Pure Object-oriented Domain Model by a DB Guy
![Page 115: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/115.jpg)
А еще есть(анти?)паттерн
Anemic Domain Model
http://www.martinfowler.com/bliki/AnemicDomainModel.html
• Набор getter-ов и setter-ов == Typed Record
• Вся логика в сервисах в процедурном стиле
![Page 116: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/116.jpg)
В каких из сервисов?
![Page 117: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/117.jpg)
Постоянно себя спрашивайте:можно ли, используя public API доменной
модели, нарушить целостность, согласованность и консистентность данных?
![Page 118: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/118.jpg)
Распространенныедилеммы
![Page 119: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/119.jpg)
Pure
AnemicRich
![Page 120: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/120.jpg)
Unit of work
Explicit state
transition
Active Record
![Page 121: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/121.jpg)
![Page 122: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/122.jpg)
http://www.infoq.com/presentations/greg-young-unshackle-qcon08
![Page 123: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/123.jpg)
Simple Reference
Value of FK
Lazy Load Reference
![Page 124: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/124.jpg)
Happy
Day
Pessimistic Locking
Optimistic Locking
![Page 125: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/125.jpg)
IV. ЗаключениеРазмер моделей/ Современные
тенденции / Литература
![Page 126: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/126.jpg)
DDD дляпростых моделей
![Page 127: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/127.jpg)
По идее, всё нацелено на достаточно сложные модели:
Но на практике эффективно используетсяи для несложных предметных областей
![Page 128: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/128.jpg)
http://www.infoq.com/presentations/rebuild-guardian-ddd-wills
![Page 129: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/129.jpg)
http://www.infoq.com/presentations/rebuild-guardian-ddd-wills
![Page 130: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/130.jpg)
http://www.infoq.com/presentations/rebuild-guardian-ddd-wills
![Page 131: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/131.jpg)
Современныетенденции
![Page 132: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/132.jpg)
Хоцца «аналогов» SQL и xxxMyAdminно для компонентов DomainModel, а не СУБД
![Page 133: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/133.jpg)
Метаданныеи
метамодель
![Page 134: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/134.jpg)
![Page 135: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/135.jpg)
DSL
Domain Specific Language
![Page 136: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/136.jpg)
Литература&
Ресурсы
![Page 137: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/137.jpg)
![Page 138: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/138.jpg)
http://www.infoq.com/news/2006/12/domain-driven-design
![Page 139: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/139.jpg)
![Page 140: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/140.jpg)
![Page 141: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/141.jpg)
http://rsdn.ru/
Forum/MsgList.aspx?gid=17
![Page 142: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/142.jpg)
http://www.infoq.com/domain-driven-design
. . .
![Page 143: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/143.jpg)
http://domaindrivendesign.org/
![Page 144: DDD Workshop](https://reader036.vdocuments.site/reader036/viewer/2022081721/5480465eb37959582b8b5b06/html5/thumbnails/144.jpg)
http://dddsample.sourceforge.net/