DDD Workshop

145
DDD workshop for Java developers Бибичев Андрей январь 2010 г.

description

Слайды к воркшопу "Domain-Driven Design for Java Developers", прочитанному на конференции AgileBaseCamp, прошедшей в Киеве в январе 2010 г.

Transcript of DDD Workshop

Page 1: DDD Workshop

DDD workshopfor Java developers

Бибичев Андрейянварь 2010 г.

Page 2: DDD Workshop

I. ВводнаяxDD / История DDD / Domain Model

Page 3: DDD Workshop
Page 4: DDD Workshop

ДЮДЮКИ:

TDD

DDDBDD

FDDVDD

Test-Driven Development

Domain-Driven Design

Behaviour-Driven Development

Feature-Driven Development

Value-Driven Development

Самая известнаяпрактика

Нынче очень модное направление проектирования

Сменщик TDD

Одна из самых навороченных

Agile-методологий Как затуманить заказчику мозги

Page 5: DDD Workshop

DDDDomain-Driven Design

Page 6: DDD Workshop

История

2004 годEric Evans

«Domain-Driven Design - Tackling Complexity in the Heart of Software»

Page 7: DDD Workshop
Page 9: DDD Workshop

Domain (словарь)

• наследственная собственность; имение, поместье; земли; владение

• территория, зона, область, район (отмеченные некоторыми физическими особенностями)

• сфера (интересов), поле (деятельности), область (знаний)

• область определения (мат.)

e.g. DNS

Домен поля таблицы в БД

В данном случае этот смысл

Page 10: DDD Workshop

Business Domain

Т.е. это о

и

Business Logic

Предметной области

Бизнес-логики

Page 11: DDD Workshop

«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

DDD

Центральная роль в мышлении,

проектировании, реализации

Page 13: DDD Workshop

Пример: есть сайт конференции, надо сделать голосование за доклад

Page 14: DDD Workshop

О чем вы прежде всегоначнете думать?

Page 15: DDD Workshop

О чем вы прежде всегоначнете думать?

votes

Page 16: DDD Workshop

О чем вы прежде всегоначнете думать?

Page 17: DDD Workshop

О чем вы прежде всегоначнете думать?

Page 18: DDD Workshop

/

Page 19: DDD Workshop

История из жизни или«Когда я был маленьким …»

Page 20: DDD Workshop

Три аспекта DDD

Page 21: DDD Workshop

II. МоделированиеМодель / Элементы UML / Пример

/ Интерактивный практикум

Page 22: DDD Workshop
Page 23: DDD Workshop

Модель –

это упрощенное

приближение реальности.

Максимально простое,

при условии достаточной

близости к действительности.

Пр

осто

та !=П

ри

ми

тивн

ость

Page 24: DDD Workshop

Нам это знакомосо школы

Page 25: DDD Workshop

Ньютон

Page 26: DDD Workshop

Эйнштейн

Page 27: DDD Workshop

Шредингер

Page 28: DDD Workshop

Дирак

Page 29: DDD Workshop

В физике в качестве

формализма для

моделей используют

мат.аппарат, а в

программировании

уже лет 20 – ООП:

Page 30: DDD Workshop

Гради Буч

Page 31: DDD Workshop

А в качестве

граф. нотации –

UML

в режиме эскизного

проектирования:

Page 32: DDD Workshop

Способыиспользования

UML

ЭСКИЗИРОВАНИЕ

(набросок от руки)

Проектирование

(чертеж)

Программирование

(граф.представление кода)

Граф

ическая

нотация

Метам

одель

Executable UML, MDA, PIM

Page 33: DDD Workshop

/

Page 34: DDD Workshop
Page 35: DDD Workshop

Документирование

Бизнес-анализ

(анализ требований)

Системнаяархитектура

(проектирование)

Модель предметной области;Словарь терминов

Понятия изпредметной области

Модель программы;Понимание чужого кода

Представление конструкций языка.Ограничения по приемам проектирования

Движение слева направо по мере уточнения, детализации и реализации

Page 36: DDD Workshop

Класс(class)

Наследование(inheritance)

Свойство(property)

Метод(method)

Ссылка, связь(reference, link)

Сущность(entity)

Обобщение(generalization)

Атрибут(attribute)

Операция(operation)

Ассоциация(association)

Фун

кцио

нальн

ость

(fea

ture

)

ПО Предметнаяобласть

Нюансы терминологии:

Page 37: DDD Workshop

Упражнение 1(разминка)

Page 38: DDD Workshop

Система продажи

билетов на самолет

Page 39: DDD Workshop

•Эксперт: Есть аэропорты. Для каждого известны:название на местом языке,уникальный латинский коди GPS-координаты.

•Мы:

Page 40: DDD Workshop

•Эксперт: Аэропорты расположены в городах.Для каждого города известно егоназвание (на местном и англ. языках). Причем известно расстояние от аэропортадо центра города, к которому он «приписан».

•Мы:

Page 41: DDD Workshop

•Эксперт: Для каждого города есть информацияо стране, в которой он находится.

•Мы:

Page 42: DDD Workshop

Шаг 4

• Есть информация по рейсам самолетов: номер рейса (уникален), аэропорты вылета и прилета

• Время вылета по местному времени города, из которого производится вылет

• Время прилета по местному времени города, из которого производится вылет

Page 43: DDD Workshop
Page 44: DDD Workshop

Шаг 5

• Можно ли реализовать вычислимые атрибуты:

– Время вылета по гринвичу

– Время прилета по гринвичу

– Время в пути

• Если нет, то чего для этого не хватает (добавьте это на диаграмму вместе с вычислимыми атрибутами)

Page 45: DDD Workshop
Page 46: DDD Workshop

Шаг 6

• Рейсы делятся на регулярные и чартерные

• Для регулярных рейсов известно расписание их полетов в днях недели (по каким дням недели осуществляется рейс)

• Для чартерных рейсов расписание задается как просто конкретные даты, по которым выполняется рейс

Page 47: DDD Workshop
Page 48: DDD Workshop

Шаг 7

• Для всех рейсов есть информация по модели самолета, на которой осуществляется перелет, со следующими характеристиками:

– Название модели

– Количество мест эконом-класса

– Количество мест бизнес-класса

– Наличие курящего салона и количество мест в нём

Page 49: DDD Workshop

Шаг 8

• Кроме того, для всех рейсов известна компания-перевозчик

• А у каждого перевозчика есть свой набор тарифов, каждый из которых определяет:– Цену билета на соответствующий вид места (бизнес-

класс, эконом-класс, курящий салон)– Причем цена зависит от степени наполнения самолета

(в каком диапазоне лежит количество проданных билетов на данный вид мест)

• Тарифы действуют определенный промежуток времени

• Для рейса известен тариф, по которому продаются билеты в настоящее время

Page 50: DDD Workshop

Шаг 9

• В системе есть информация по наличию свободных мест (для каждого класса) с учетом возможной брони

• Причем необходимо показывать текущую цену, по которой в данный момент продаются билеты заданного класса на данный рейс (на дату)

Page 51: DDD Workshop

Шаг 10

• Дальше можно вспомнить что еще бывают всякие скидки, детские билеты, перенос рейсов, отмена и т.д.

• НО МЫ ЭТОГО ДЕЛАТЬ НЕ БУДЕМ

Page 52: DDD Workshop
Page 53: DDD Workshop

А где методы?

Page 54: DDD Workshop

Упражнение 2(интерактив)

Page 55: DDD Workshop
Page 56: DDD Workshop

Итого

Page 57: DDD Workshop
Page 58: DDD Workshop

Feature-Driven Development (FDD):

Разработка общей модели

Составление списка функций

Планирование

Build by featureDesign by feature

Список функций(Feature list)

План разработки(A development plan)

Диаграмма классовпредметной области

Отгрузка!

1 – 3 недели

Page 59: DDD Workshop

История из жизни или«Когда я был маленьким …»

Page 60: DDD Workshop

III. Реализация в коде

Шаблоны / Варианты архитектур / Распределенные дилеммы

Page 61: DDD Workshop

СУБД Модель ОО-язык

таблица сущность класс

поле атрибут свойство

FK cвязь ссылка

хранимаяпроцедура

действие метод

Page 62: DDD Workshop
Page 63: DDD Workshop
Page 64: DDD Workshop
Page 65: DDD Workshop

Идентификация:- два объекта, один и тот же аэропорт

Жизненный цикл объекта:- создание /модификация / удаление

СозданиеОтражение в хранилище

Модификация

Удаление из хранилища

Чтение из хранилища

Page 66: DDD Workshop
Page 67: DDD Workshop
Page 68: DDD Workshop
Page 69: DDD Workshop
Page 70: DDD Workshop
Page 71: DDD Workshop
Page 72: DDD Workshop
Page 73: DDD Workshop
Page 74: DDD Workshop
Page 75: DDD Workshop
Page 76: DDD Workshop

Базовые классы – опционально!Альтернатива: интерфейс.

Page 77: DDD Workshop
Page 78: DDD Workshop

Самый известный

Value-object

Page 79: DDD Workshop

Value object

• Неизменность объекта (Immutable)– можно безопасно передавать

• Сравнение объектов = сравнение данных– позволяет распознавать одинаковые значения,

представленные в виде разных объектов

• Инкапсулирует проверку корректности значения– «Build-in anticorruption layer»

• Обеспечивает строгую типизацию– случайно не передашь Code вместо Name и наоборот

Page 80: DDD Workshop
Page 81: DDD Workshop
Page 82: DDD Workshop
Page 83: DDD Workshop
Page 84: DDD Workshop
Page 85: DDD Workshop
Page 86: DDD Workshop
Page 87: DDD Workshop

Mapping этого хозяйства на БД

CODE (PK) NAME LATITUDE LONGITUDE

DME Домодедово 12345 67890

AIRPORTS

Page 88: DDD Workshop
Page 89: DDD Workshop
Page 90: DDD Workshop

ID (PK) NAME …

12345 Любимый

TARIFFS

TARIFF_ID (FK) SEAT_KIND PRICE

12345 Эконом 100

12345 Бизнес 1000

12345 Стоя 10

TARIFF_ITEMS

Page 91: DDD Workshop
Page 92: DDD Workshop

ЗадачаВо многих местах логики и тестовсоздавать рейс по:• Код аэропорта Откуда• Код аэропорта Куда• UN модели самолета• ИНН компании перевозчика

Page 93: DDD Workshop
Page 94: DDD Workshop
Page 95: DDD Workshop

Сервисы

• Уровня доменной модели (Domain Servicies)– Инфраструктурные (API к системе сообщений, API

для интеграции с внешними системами, …)

– Согласованная работа с несколькими объектами («уволить всех сотрудников на заданную букву», …)

– Комбинированная алгоритмика (прокладка маршрутов, подбор оптимальных вариантов, …)

• Уровня приложения (Application Servicies)– чуть позже

Page 96: DDD Workshop
Page 97: DDD Workshop

Используете ORM => У вас DDD!!!

Page 98: DDD Workshop

+ возня с value-типами+ возня с агрегатами

Но ORM может сильно облегчить работу:

Page 99: DDD Workshop

Дополнительные полезные шаблоны

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

Архитектура

Page 102: DDD Workshop

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

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

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

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

Обратите внимание,

на направление

зависимостей

и наследования

Page 107: DDD Workshop

Уточненная картинка

Page 108: DDD Workshop

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

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

Persistance

Model

Infrastructure

Do

mai

nA

pp

licat

ion

?Framework

Page 111: DDD Workshop

RichDomain Model

PureDomain Model

Persistance

Model

Persistance

Model

IoC

Page 112: DDD Workshop

Model

Persistance

EnityBase RepositoryBase Utils

Airport AirportRepository Mapping

Metadata

Ric

hD

om

ain

Mo

del

Page 113: DDD Workshop

Model

Persistance

AirportRepository

ImplUtils

Airport AirportRepository

Mapping

Metadata

«implement»«depends»

Pu

reD

om

ain

Mo

del

Page 114: DDD Workshop

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

А еще есть(анти?)паттерн

Anemic Domain Model

http://www.martinfowler.com/bliki/AnemicDomainModel.html

• Набор getter-ов и setter-ов == Typed Record

• Вся логика в сервисах в процедурном стиле

Page 116: DDD Workshop

В каких из сервисов?

Page 117: DDD Workshop

Постоянно себя спрашивайте:можно ли, используя public API доменной

модели, нарушить целостность, согласованность и консистентность данных?

Page 118: DDD Workshop

Распространенныедилеммы

Page 119: DDD Workshop

Pure

AnemicRich

Page 120: DDD Workshop

Unit of work

Explicit state

transition

Active Record

Page 121: DDD Workshop
Page 123: DDD Workshop

Simple Reference

Value of FK

Lazy Load Reference

Page 124: DDD Workshop

Happy

Day

Pessimistic Locking

Optimistic Locking

Page 125: DDD Workshop

IV. ЗаключениеРазмер моделей/ Современные

тенденции / Литература

Page 126: DDD Workshop

DDD дляпростых моделей

Page 127: DDD Workshop

По идее, всё нацелено на достаточно сложные модели:

Но на практике эффективно используетсяи для несложных предметных областей

Page 131: DDD Workshop

Современныетенденции

Page 132: DDD Workshop

Хоцца «аналогов» SQL и xxxMyAdminно для компонентов DomainModel, а не СУБД

Page 133: DDD Workshop

Метаданныеи

метамодель

Page 134: DDD Workshop
Page 135: DDD Workshop

DSL

Domain Specific Language

Page 136: DDD Workshop

Литература&

Ресурсы

Page 137: DDD Workshop
Page 139: DDD Workshop
Page 140: DDD Workshop
Page 145: DDD Workshop

Спасибо за внимание!

[email protected]://www.google.com/profiles/biBIGone