Домен-ориентированный дизайн - Domain-driven design

Разработка программного обеспечения
Активность ядер
Парадигмы и модели
Методологии и рамки
Вспомогательные дисциплины
Практики
инструменты
Стандарты и свод знаний
Глоссарии
Контуры

Домен-ориентированный дизайн (DDD) - это концепция, согласно которой структура и язык программного кода (имена классов, методы классов, переменные класса) должны соответствовать бизнес-домен. Например, если программное обеспечение обрабатывает заявки на получение ссуды, оно может иметь такие классы, как LoanApplication и Customer, и такие методы, как AcceptOffer и Withdraw.

DDD подключает реализация к развивающейся модели.[1]

Доменно-ориентированный дизайн основан на следующих целях:

  • сосредоточение основного внимания проекта на ядре домен и доменная логика;
  • построение сложных проектов на модели предметной области;
  • начало творческого сотрудничества между техническими специалистами и эксперты в предметной области итеративно уточнять концептуальную модель, которая обращается к конкретным проблемам предметной области.

Термин был придуман Эрик Эванс в одноименной книге.[2]

Концепции

В концепцию модели входят:

Контекст
Обстановка, в которой появляется слово или высказывание, определяющая его значение;
Домен
Сфера знаний (онтология ), влияние или активность. Предметная область, к которой пользователь применяет программу, является областью программного обеспечения;
Модель
Система абстракций, которая описывает выбранные аспекты домена и может использоваться для решения проблем, связанных с этим доменом;
Вездесущий язык
Язык, построенный вокруг модель предметной области и используется всеми членами команды, чтобы связать все действия команды с программным обеспечением.

Стратегический предметно-ориентированный дизайн

Семантическая сеть шаблонов в стратегическом предметно-ориентированном дизайне.

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

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

Ограниченный контекст

В любом крупном проекте задействовано несколько моделей. Тем не менее, когда код, основанный на различных моделях, объединяется, программное обеспечение становится неполноценным, ненадежным и трудным для понимания. Общение между членами команды становится запутанным. Часто неясно, в каком контексте модель не должна применяться.

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

Непрерывная интеграция

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

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

Контекстная карта

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

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

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

Строительные блоки

В книге Доменно-ориентированный дизайн,[2] сформулирован ряд концепций и практик высокого уровня, таких как вездесущий язык это означает, что модель предметной области должна формировать общий язык Предоставляется экспертами в предметной области для описания системных требований, который одинаково хорошо работает как для бизнес-пользователей или спонсоров, так и для разработчиков программного обеспечения. Книга очень сосредоточена на описании уровень домена как один из общие слои в объектно-ориентированный система с многослойная архитектура. В DDD есть артефакты для выражения, создания и извлечения моделей предметной области:

сущность
Объект, который определяется не его атрибутами, а скорее нитью непрерывности и ее личность.
Пример. Большинство авиакомпаний выделяют каждое место на каждом рейсе уникальным образом. В этом контексте каждое место является сущностью. Однако Southwest Airlines, EasyJet и Ryanair не различают места; все сиденья одинаковые. В этом контексте место - это фактически объект-значение.
Объект значения
Объект, содержащий атрибуты, но не имеющий концептуальной идентичности. Их следует рассматривать как неизменный.
Пример. Когда люди обмениваются визитными карточками, они обычно не различают каждую уникальную карточку; их интересует только информация, напечатанная на карте. В этом контексте визитные карточки являются объектами ценности.
Совокупный
Коллекция объектов, связанных вместе корневой сущностью, также известной как совокупный корень. Корень агрегата гарантирует согласованность изменений, вносимых в агрегат, запрещая внешним объектам хранить ссылки на его элементы.
Пример: когда вы ведете машину, вам не нужно беспокоиться о том, чтобы колеса двигались вперед, двигатель воспламенялся искрой и топливом и т. Д .; вы просто ведете машину. В этом контексте автомобиль представляет собой совокупность нескольких других объектов и служит совокупным корнем для всех других систем.
Событие домена
Объект домена, который определяет событие (то, что происходит). Событие предметной области - это событие, которое волнует экспертов предметной области.
обслуживание
Когда операция концептуально не принадлежит какому-либо объекту. Следуя естественным контурам проблемы, вы можете реализовать эти операции в сервисах. Смотрите также Сервис (системная архитектура).
Репозиторий
Методы получения объектов домена должны делегироваться специализированному объекту репозитория, чтобы альтернативные реализации хранилища можно было легко заменить.
Завод
Методы создания объектов домена следует делегировать специализированному Завод объект, так что альтернативные реализации могут быть легко заменены.

Недостатки

Чтобы поддерживать модель как чистую и полезную языковую конструкцию, команда обычно должна реализовать большую часть изоляции и инкапсуляции в модели предметной области. Следовательно, система, основанная на доменно-ориентированном дизайне, может иметь относительно высокую стоимость. Хотя предметно-ориентированный дизайн обеспечивает множество технических преимуществ, таких как ремонтопригодность, Microsoft рекомендует применять его только к сложным доменам, где модель и лингвистические процессы обеспечивают явные преимущества в передаче сложной информации и в формулировании общего понимания домен.[3]

Отношение к другим идеям

Объектно-ориентированный анализ и дизайн
Хотя теоретически общая идея DDD не должна ограничиваться объектно-ориентированными подходами, на практике DDD стремится использовать преимущества, которые делают возможными объектно-ориентированные методы. К ним относятся сущности / агрегированные корни в качестве получателей вызовов команд / методов и инкапсуляция состояния в пределах основных агрегированных корней и на более высоком архитектурном уровне, в ограниченных контекстах.
Модельно-ориентированная инженерия (MDE) и Модельно-управляемая архитектура (MDA)
Хотя DDD совместим с MDA / MDE (где MDE можно рассматривать как надмножество MDA. ) смысл этих двух концепций несколько различается. MDA больше занимается средствами перевода модели в код для различных технологических платформ, чем практикой определения лучших моделей предметной области. Методы, предоставляемые MDE (для моделирования доменов, для создания DSL для облегчения связи между экспертами в предметной области и разработчиками, ...) облегчают применение DDD на практике и помогают практикам DDD получить больше от своих моделей. Благодаря методам преобразования модели и генерации кода в MDE модель предметной области можно использовать не только для представления предметной области, но и для создания реальной программной системы, которая будет использоваться для управления ею. На этом рисунке показано возможное представление DDD и MDE вместе.
Обычные старые объекты Java (POJO) и Обычные старые объекты CLR (POCO)
POJO и POCO - это технические концепции реализации, специфичные для Ява и .NET Framework соответственно. Однако появление терминов POJO и POCO отражает растущее мнение о том, что в контексте любой из этих технических платформ объекты домена должны определяться исключительно для реализации бизнес-поведения соответствующей концепции домена, а не определяться требованиями. более конкретной технологической структуры.
В голые предметы шаблон
Исходя из предпосылки, что если у вас есть достаточно хорошая модель предметной области, пользовательский интерфейс может просто быть отражением этой модели предметной области; и что если вам требуется, чтобы пользовательский интерфейс был прямым отражением модели предметной области, это потребует разработки лучшей модели предметной области.[4]
Доменно-ориентированное моделирование (DSM)
DSM - это DDD, применяемый с использованием Доменные языки.
Доменный язык (DSL)
DDD специально не требует использования DSL, хотя его можно использовать для определения DSL и поддержки таких методов, как многомодельное доменное моделирование.
Аспектно-ориентированное программирование (АОП)
АОП позволяет легко исключить технические проблемы (такие как безопасность, управление транзакциями, ведение журнала) из модели предметной области и, таким образом, упрощает проектирование и реализацию моделей предметной области, ориентированных исключительно на бизнес-логику.
Разделение ответственности за запросы команд (CQRS)
CQRS - это архитектурный шаблон для разделения операций чтения и записи, где первое - это запрос, а второе - это команда. Команды изменяют состояние и, следовательно, приблизительно эквивалентны вызову метода для совокупных корней / объектов. Запросы читают состояние, но не изменяют его. CQRS - это производный архитектурный шаблон от шаблона проектирования под названием Разделение команд и запросов (CQS), который был придуман Бертран Мейер. В то время как CQRS не требует DDD, доменно-ориентированный дизайн делает четкое различие между командами и запросами вокруг концепции агрегированного корня. Идея состоит в том, что данный агрегированный корень имеет метод, соответствующий команде, а обработчик команд вызывает метод для агрегированного корня. Совокупный корень отвечает за выполнение логики операции и выдачу либо количества событий, либо отказа (исключение или перечисление / количество результатов выполнения), ИЛИ (если источник событий (ES) не используется), просто изменяя его состояние для постоянная реализация, такая как ORM для записи в хранилище данных, в то время как обработчик команд отвечает за устранение проблем инфраструктуры, связанных с сохранением состояния или событий совокупного корня и созданием необходимых контекстов (например, транзакций).
Поиск событий (ES)
Архитектурный образец, который гарантирует, что ваши объекты (согласно Эрика Эванса определение) отслеживают свое внутреннее состояние не посредством прямой сериализации или отображения O / R, а посредством чтения и фиксации событий в магазин событий. Если ES сочетается с CQRS и DDD, агрегированные корни отвечают за тщательную проверку и применение команд (часто с помощью вызова их методов экземпляра из обработчика команд), а затем публикацию одного или набора событий, которые также являются основой для которые совокупные корни основывают свою логику для работы с вызовами методов. Следовательно, ввод - это команда, а вывод - одно или несколько событий, которые транзакционно (одиночная фиксация) сохраняются в хранилище событий, а затем часто публикуются в брокере сообщений в интересах заинтересованных лиц (часто интересуют представления; они затем запрашиваются с помощью сообщений-запросов). При моделировании совокупных корней для вывода событий вы можете изолировать внутреннее состояние даже дальше, чем это было бы возможно при проецировании считываемых данных из ваших сущностей, как это делается в стандартных n-уровневых архитектурах передачи данных. Одним из значительных преимуществ этого является то, что такие инструменты, как средства доказательства аксиоматических теорем (например, Microsoft Contracts и CHESS[5]) проще применять, так как совокупный корень полностью скрывает свое внутреннее состояние. События часто сохраняются на основе версии агрегированного корневого экземпляра, что дает модель предметной области, которая синхронизируется в распределенных системах на основе концепции оптимистичного параллелизма.

Известные инструменты

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

  • Actifsource это плагин для Затмение что позволяет разрабатывать программное обеспечение, комбинируя DDD с модельно-ориентированная инженерия и генерация кода.
  • CubicWeb это платформа семантической сети с открытым исходным кодом, полностью управляемая моделью данных. Директивы высокого уровня позволяют итеративно уточнять модель данных, выпуск за выпуском. Определения модели данных достаточно, чтобы получить работающее веб-приложение. Требуется дополнительная работа, чтобы определить, как будут отображаться данные, когда представлений по умолчанию недостаточно.
  • OpenMDX: Открытый исходный код, на основе Java, поддержка MDA Framework Java SE, Java EE, и .СЕТЬ. OpenMDX отличается от типичных сред MDA тем, что «использовать модели для непосредственного управления поведением операционных систем во время выполнения».
  • OpenXava: Создает AJAX приложение от JPA сущности. Вам нужно всего лишь написать классы предметной области, чтобы получить готовое приложение.
  • Успокаивающие объекты является стандартом Restful API для объектной модели предметной области (где объекты предметной области могут представлять сущности, модели представления или службы). Две платформы с открытым исходным кодом (одна для Java, одна для .NET) могут автоматически создавать Restful Objects API из модели предметной области, используя отражение.

Смотрите также

Рекомендации

  1. ^ Домен-ориентированный дизайн.
  2. ^ а б Эванс, Эрик (2004). Доменно-ориентированный дизайн: преодоление сложности в самой основе программного обеспечения. Эддисон-Уэсли. ISBN  978-032-112521-7. Получено 2012-08-12..
  3. ^ Руководство по архитектуре приложений Microsoft, 2-е издание. Полученное из http://msdn.microsoft.com/en-us/library/ee658117.aspx#DomainModelStyle.
  4. ^ Хейвуд, Дэн (2009), Доменно-ориентированный дизайн с использованием обнаженных объектов, Программисты-прагматики.
  5. ^ инструмент поиска ошибок MS

внешние ссылки