Что, по отношению к DDD, является ограниченным контекстом?

40

Работая с книгой Вона Вернона «Внедрение доменного дизайна», я не смог понять, что такое ограниченный контекст на самом деле.

Книга определяет ограниченный контекст как «концептуальную границу, к которой применима модель предметной области. Она предоставляет повсеместный язык, на котором говорит команда и который выражен в его тщательно разработанной программной модели» (раздел «Руководство к этой книге»). Это определение будет звучать так, как если бы ограниченный контекст являлся моделью и языком субдомена, где этот субдомен может оказаться основным доменом (что, по-видимому, следует называть «основным субдоменом», но это другое обсуждение ...). Это все еще оставляет некоторую двусмысленность относительно того, что обеспечивает ограниченный контекст. Это группа из одного или нескольких поддоменов? Если только один поддомен соответствует ограниченному контексту, что на самом деле говорит нам ограниченный контекст?

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

Мартин Фаулер кратко обсуждает идею ограниченного контекста ( http://martinfowler.com/bliki/BoundedContext.html ), но на самом деле не проясняет проблему.

В конце концов, что такое ограниченный контекст? Это группировка поддоменов? Модель и язык для поддоменов? Реализация поддоменов? Без этих ответов довольно сложно понять, как разложить реальное проблемное пространство на ограниченные контексты.

Майкл
источник
2
Этот пост на самом деле не дает четкого определения, по крайней мере, для меня. В нем обсуждается идея ограниченных контекстов, поскольку они могут применяться организационно, но на самом деле это никогда не связывает это с разработкой программного обеспечения.
Майкл
1
ХОРОШО. Ну, хотя я не эксперт DDD, я нашел это описание от Microsoft полезным (в параграфе Введение): msdn.microsoft.com/en-us/library/jj591572.aspx . Там написано: ...
Роберт Харви
1
Ограниченные контексты являются автономными компонентами со своими моделями доменов и собственным вездесущим языком. Они не должны иметь каких-либо зависимостей друг от друга во время выполнения и должны быть способны работать изолированно. Однако они являются частью одной и той же общей системы и должны обмениваться данными друг с другом ...
Роберт Харви
1
... Если вы реализуете шаблон CQRS в ограниченном контексте, вы должны использовать события для этого типа связи: ваш ограниченный контекст может реагировать на события, которые возникают вне ограниченного контекста, а ваш ограниченный контекст может публиковать события, которые другие ограниченные контексты могут подписаться на. События, позволяют вам поддерживать слабую связь между вашими ограниченными контекстами.
Роберт Харви

Ответы:

38

Ограниченные контексты и субдомены существуют на разных уровнях.

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

Контексты - это части пространства решений. Они модели . Было бы хорошо иметь их, отражать разделение доменов-поддоменов ... но жизнь не всегда так проста. И вы могли бы раздутый унаследованный домен, охватывающий все, или больше контекста в том же поддомене (то есть старое унаследованное приложение, которое заменяет кто-то).

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

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

ZioBrando
источник
1
Итак, в идеальном мире, между субдоменами и ограниченным контекстом будет связь 1: 1? (Понятно, очевидно, что то, что идеально, и то, что истинно, различаются).
Майкл
2
Не обязательно: главное, что BC, перекрывающий множество поддоменов, является неприятным запахом. Ну ... это не ограничено. В терминах DDD модель должна идеально соответствовать своему назначению, а разные поддомены имеют разные цели (и, возможно, даже разные боссы с разными целями). Но в одном и том же поддомене разные BC могут существовать по разным причинам. Веб и мобильное приложение могут иметь место, или разные модели для планирования или выполнения .
ZioBrando
Но главное - это понять, что есть два семейства проблем: 1) чтение существующего контекста (где вы можете только принять и классифицировать существующие модели и коллаборации), 2) разработать правильное программное обеспечение с учетом существующих ограничений, таким образом навязывая границы контекста между маленькими, ориентированными на цель моделями. Во втором сценарии вы не будете намеренно перекрывать границы поддоменов. ... в общем, поиск идеального программного обеспечения в неидеальной организации может быть трудным делом. Но решение этих несоответствий может стоить усилий.
ЗиоБрандо
8

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

Поскольку телепатия все еще находится в зачаточном состоянии, эти идеи передаются между людьми с использованием слов и фраз.

Слова и фразы могут быть неоднозначными в лучшие времена. Чтобы помочь нам уменьшить двусмысленность, мы используем «контекст», чтобы прояснить их значение.

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

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

Этот недавно примененный контекст будет направлять, как новые разработчики реорганизуют или разрабатывают код. Если они применяют неправильный контекст, они будут реорганизовывать и разрабатывать код в, возможно, даже немного, неправильном направлении. Неправильные направления, пусть и незначительные, могут вызвать гораздо большие проблемы в будущем.

На мой взгляд, «ограниченный контекст» - это просто «уточненный контекст», который предназначен для того, чтобы проектировать новичков, чтобы они не применяли свой произвольный контекст, чтобы испортить нашу прекрасно отточенную модель.

Это какое-то явное подтверждение со стороны команды, что именно this phraseв this part of the projectсредствах this thing(а не, как вы могли бы подумать that thing).

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

Вот и все. Это очень простая идея, которая так важна, что о ней написано много.

Так да. Ограниченный контекст - это буквально граница, «забор», которая отличает контекст одного субдомена от контекста другого субдомена в проекте.

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

Но да. Мир не так прост.

Вы и команда должны строго придерживаться определенного контекста. Действительно легко быть ленивым и переосмыслить контекст, чтобы срезать углы во время создания программного обеспечения.

Кроме того, вещи взаимодействуют с другими вещами, и ограниченные контексты также должны взаимодействовать друг с другом. Таким образом, существуют различные модели для описания того, как происходят эти взаимодействия. См. Книгу Эрика Эвана «Управление через домен», глава 14, по этим различным шаблонам: общее ядро, поставщик клиента, конформист, антикоррупционный уровень, отдельные пути, служба открытого хоста, опубликованный язык.

JW01
источник
1
В общем, это забор вокруг поддоменов.
Роберт Харви
1
Да. Насколько я вижу. Это забор.
JW01
0

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

В разных ситуациях я использую три разные точки зрения или метафоры концепции ограниченного контекста.

С точки зрения времени выполнения, он представляет логические границы, определенные контрактом службы, в которой реализована модель. Контракт может быть представлен как API этого сервиса или набор событий, которые он публикует и потребляет. Таким образом, с этой точки зрения ограниченный контекст не имеет ничего общего с физическими границами.

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

Для разработчика программного обеспечения, то есть с точки зрения статического кода, ограниченный контекст представляет собой способ, которым я разработал свои модели вокруг соответствующих поддоменов. Сколько кодовых баз реализовано в конкретном поддомене? Из каких концепций они состоят? Какие концепции применимы в каждом из них? Вот почему говорят, что ограниченные контексты принадлежат пространству решений.

Мне очень нравится этот пример концепции ограниченного контекста.

Другой важный вопрос (если не самый важный) заключается в том, как определить ограниченный контекст . Если вы сделаете это неправильно, вы получите болтливые, не поддерживаемые и тесно связанные сервисы , также известные как распределенный монолит .

Западло
источник