<? phpukraine PHP-ПЛАТФОРМА
⌕Пошук по платформі
КОНЦЕПЦІЯ DDD · КРОК 6 З 10

Bounded contextsBounded context

Межа, всередині якої кожне слово моделі має одне значення. За межею те саме слово може означати інше, і кожен контекст тримає власну модель замість однієї спільної на всіх.

6 хв читання Middle → Senior
01 · ЩО ЦЕ

Одне слово, дві моделі

Слово «проєкт» на PHP Ukraine має два значення. У вітрині проєктів це робота розробника: посилання на сайт чи репозиторій, стек, роль автора, рівень довіри. У заявці для команди розробки це задача клієнта, про яку відомо лише стан («тільки ідея», «працює погано») і посилання. Один клас Project для обох мав би половину полів порожніми в кожному випадку. дозволяє тримати дві моделі, кожну у своїй межі.

СЛОВНИКBounded context. Явна межа, всередині якої модель і її слова мають одне значення. В іншому контексті те саме слово може означати інше.

Усередині контексту діє : ті самі слова в розмові, коді й інтерфейсі. На межі слова перекладають. Як контексти повʼязані між собою, хто від кого залежить і хто чию модель перекладає, показує .

СЛОВНИКUbiquitous language. Спільна мова команди й людей предметної області всередині одного контексту. Її видно в назвах класів і методів: Lead, withdraw(), ProjectState.
СЛОВНИККарта контекстів. Схема контекстів і звʼязків між ними: хто постачає дані, хто споживає, де стоїть переклад.

Межу контексту проводять там, де змінюються мова й правила. Часто контекст збігається з модулем у коді, як у PHP Ukraine, де кожна папка в src/ має свій простір імен. Якщо один контекст бере модель іншого як є, межа стирається. Шар, що перекладає чужу модель на свою, називають .

СЛОВНИКAnti-corruption layer. Шар на межі контексту, який перекладає чужу модель на власну, щоб чужі назви й правила не просочувалися всередину.
02 · МЕЖА

«Проєкт» у двох контекстах

ДІАГРАМА · УСЯ СХЕМА
Кроки: 3
PROJECTSпроєкт: робота розробникаDEVELOPMENTпроєкт: задача клієнтаSHAREDClock · Text · LlmагрегатProjectstack · role · trustTrustProjectLinkзаявкаLeadbrief · budget · timingenumProjectState
PROJECTSпроєкт: робота розробникаDEVELOPMENTпроєкт: задача клієнтаSHAREDClock · Text · LlmагрегатProjectstack · role · trustTrustProjectLinkзаявкаLeadbrief · budget · timingenumProjectState
Уся схема. Натисніть → або виберіть крок нижче, щоб пройти по ній частинами.
Ключовий учасник Домен Клієнт ✕ заборонено
  • Projects (проєкт: робота розробника) містить: Project, Trust, ProjectLink.
  • Development (проєкт: задача клієнта) містить: Lead, ProjectState.
  • Project використовує Trust.
  • Project використовує ProjectLink.
  • Lead використовує ProjectState.
  • Lead не може змінювати Project напряму, лише через корінь.
  1. 1Слово означає одне в межах контексту. Якщо значення змінилося, ви перетнули межу.
  2. 2Кожен контекст має власну модель, навіть коли назви збігаються.
  3. 3Між контекстами ходять ID і прості значення, а не сутності.
  4. 4Чужу модель перекладають на межі: публічний вхід, DTO чи anti-corruption layer.
03 · ЯК У PHP UKRAINE

Проєкт і компанія в заявці на розробку

Заявка в контексті Development згадує і проєкт, і компанію, але жодне з цих слів не означає тут того, що в інших контекстах. Проєкт клієнта зведено до стану й посилання, тоді як у Projects це агрегат Project з довірою й підтвердженням авторства. Компанія тут просто рядок з форми, а в Hiring це агрегат Company з верифікацією, тарифом і привʼязкою до вакансій. Development не імпортує класів ні з Projects, ні з Hiring.

php Lead.php фрагмент, скорочено
1final class Lead
2{
3 private function __construct(
4 public private(set) ?int $id,
5 public readonly LeadKind $kind,
6 public readonly ?ProjectState $projectState,← проєкт клієнта
7 public readonly ?BudgetRange $budget,
8 public readonly ?Timing $timing,
9 public readonly string $brief,
10 public readonly string $name,
11 public readonly ?string $company,← компанія як рядок
12 public readonly string $email,
13 public readonly ?string $contact,
14 public readonly ?string $projectUrl,← проєкт клієнта
15 public readonly string $locale,
16 public readonly ?string $source,
17 public readonly DateTimeImmutable $createdAt,
18 ) {}
19}
04 · ТИПОВІ ПОМИЛКИ

Як контексти зливаються

✕ 1

Одна модель на всю систему

Клас Company обслуговує каталог, найм, оплату й заявки. Поля множаться, половина з них null, а зміна правила для найму ламає оплату.

Натомість: кожен контекст тримає свою модель зі своїми полями. Спільним лишається ID.

✕ 2

Контексти за таблицями

Контекст на кожну сутність: UsersContext, OrdersContext, ProductsContext. Межі не збігаються з мовою, і кожна дія ходить через три контексти.

Натомість: шукайте місця, де змінюється значення слів і правила. Там проходить межа.

✕ 3

Чужа модель без перекладу

Модуль пошуку PHP Ukraine читає Eloquent-моделі вакансій, статей і проєктів напряму. Перейменування колонки в Hiring ламає пошук.

Натомість: беріть дані через публічний вхід іншого контексту чи будуйте власну проєкцію, переклавши чужу модель на межі.

05 · ДЕРЕВО РІШЕНЬ

Чи потрібен окремий контекст

1
Чи означає ключове слово тут інше, ніж у решті системи?
«Проєкт» у вітрині розробників і в заявці на розробку.
НІ →Це той самий контекст. Новий модуль лише додасть переклади без потреби.
2
Чи мають ці частини різні правила й різних людей, які про них говорять?
Розробники й модерація з одного боку, власник команди розробки й клієнти з іншого.
НІ →Лишіть в одному контексті й домовтеся про назви.
3
Чи можна сказати, які дані переходять межу і в який бік?
ID, кілька полів, подія.
НІ →Межа ще не ясна. Почніть з одного модуля й поділіть, коли побачите шов.
ТАК НА ВСІ →Вам потрібен окремий контекст. Своя модель, свої слова й явний перехід через межу.
06 · СЛОВНИК
Bounded context
Явна межа, всередині якої модель і її слова мають одне значення. В іншому контексті те саме слово може означати інше.
Ubiquitous language
Спільна мова команди й людей предметної області всередині одного контексту. Її видно в назвах класів і методів: Lead, withdraw(), ProjectState.
Карта контекстів
Схема контекстів і звʼязків між ними: хто постачає дані, хто споживає, де стоїть переклад.
Anti-corruption layer
Шар на межі контексту, який перекладає чужу модель на власну, щоб чужі назви й правила не просочувалися всередину.
07 · ПЕРЕВІР СЕБЕ

Питання зі співбесід

Усі питання з архітектури →

Контекст це межа мови й моделі, поняття з DDD. Модуль це спосіб організувати код. Зручно, коли вони збігаються, як у PHP Ukraine, але один контекст може займати кілька модулів або окремий сервіс.

У назвах класів, методів і значень: Lead, ProjectState::WorksBadly, withdraw(). Якщо в коді setStatus(3), а люди кажуть «кандидат відкликав відгук», мова розійшлася.

Через публічний вхід іншого контексту, який віддає власні DTO, через інтеграційні події або через anti-corruption layer, що перекладає чужу модель на свою. Межу перетинають ID і прості значення, а сутність одного контексту в іншому не живе.