В проектах по разработке программного обеспечения участвуют множество различных специалистов, у которых разные роли, разные специализации, своя терминология, свой жаргон. И часто в проекте люди не понимают друг друга. Заказчики не понимают, почему те или иные доработки стоят так дорого. Аналитики вынуждены выступать переводчиками между пользователями и разработчиками. А разработчики работают сразу с двумя моделями системы — с моделью представленной аналитиками и моделью реализованной в коде. Это приводит к тому, что основные усилия расходуются не на разработку полезного функционала, а на попытки удержать обе модели в голове и сопоставить их друг с другом.
Методология Domain Driven Design (проектирование на основе предметной области — далее DDD) для решения этой проблемы предлагает в качестве единой опорной точки использовать модель предметной области. Такая модель хорошо понятна заказчикам, служит отличным инструментом для аналитиков. Но важной особенностью такой модели является то, что она может быть напрямую реализована в коде, а значит, пригодна для использования разработчиками.
При принятии решения всегда встают вопросы:
– Что такое Domain Driven Design?
– На каких проектах можно применить DDD? Является ли мой проект таким?
– Какова цена и какие риски?
– Какие типичные ошибки ждут на пути?
19. Domain Driven Design
• Единый язык (модель)
• основанный на предметной области
• непосредственно воплощенный в исходном
коде (проектирование по модели, Model
Driven Development)
20. Единый язык
Модель
Переработка Единый
предметной
знаний язык
области
25. Основан на предметной области
• Понятия языка имеют смысл в предметной
области
• В основе модели лежит представление всех
участников проекта о предметной области
30. Воплощен в исходном коде
• Требование:
– Зачислить сотрудника в подразделение
начиная с заданной даты
31. Воплощен в исходном коде
DepartmentHistoryRepository.Remove(
from dh in DepartmentHistoryRepository
where dh.EmployeeId = employee.Id &&
dh.DateStart >= date
select dh);
var dhe =
from dh in DepartmentHistoryRepository
where dh.EmployeeId = employee.Id &&
dh.DateStart <= date &&
dh.DateEnd >= date
select dh;
dhe.DateEnd = date.AddDay(-1)
DepartmentHistoryRepository.CreateNew(
employee, date);
47. Распределение товаров по
магазинам
• Сложная предметная область
• Информационные потоки и бизнес-процесс
определяет заказчик
• Технические сложности преодолимы
49. Система обмена сообщениями с
высокой пропускной способностью
• Простая постановка задачи
• Информационные потоки и бизнес-процесс
(обмен сообщениями) определяет
исполнитель
• Высокая техническая сложность