Домен-ориентированный дизайн - Domain-driven design
Разработка программного обеспечения |
---|
Активность ядер |
Парадигмы и модели |
Методологии и рамки |
Вспомогательные дисциплины |
Практики |
инструменты |
Стандарты и свод знаний |
Глоссарии |
Контуры |
эта статья нужны дополнительные цитаты для проверка.Июль 2019) (Узнайте, как и когда удалить этот шаблон сообщения) ( |
Эта статья тон или стиль могут не отражать энциклопедический тон используется в Википедии.Февраль 2020 г.) (Узнайте, как и когда удалить этот шаблон сообщения) ( |
Домен-ориентированный дизайн (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 из модели предметной области, используя отражение.
Смотрите также
- Событие штурм
- Представление знаний
- Онтология (информатика)
- Семантический анализ (представление знаний)
- Семантические сети
- Семантика
Рекомендации
- ^ Домен-ориентированный дизайн.
- ^ а б Эванс, Эрик (2004). Доменно-ориентированный дизайн: преодоление сложности в самой основе программного обеспечения. Эддисон-Уэсли. ISBN 978-032-112521-7. Получено 2012-08-12..
- ^ Руководство по архитектуре приложений Microsoft, 2-е издание. Полученное из http://msdn.microsoft.com/en-us/library/ee658117.aspx#DomainModelStyle.
- ^ Хейвуд, Дэн (2009), Доменно-ориентированный дизайн с использованием обнаженных объектов, Программисты-прагматики.
- ^ инструмент поиска ошибок MS
внешние ссылки
- Домен-ориентированный дизайн, определения и резюме шаблонов (PDF), Эрик Эванс, 2015
- Реализация агрегированного корня на языке C #
- Введение в предметно-ориентированный дизайн, Методы и инструменты