Software Engineering

DDD на практиці

Ми розглянули інструменти предметно-орієнтованого проєктування (DDD), призначені для аналізу предметних областей, обміну знаннями та прийняття стратегічних і тактичних рішень. Але як все це працює в реальному світі?

DDD на практиці

Ми розглянули інструменти предметно-орієнтованого проєктування (DDD), призначені для аналізу предметних областей, обміну знаннями та прийняття стратегічних і тактичних рішень. Але як все це працює в реальному світі?

Навіть якщо ви не потрапили в ідеальні "лабораторні" умови нового проєкту (Greenfield), DDD може принести найбільшу вигоду саме в Legacy-системах, які вже довели свою бізнес-спроможність, але потерпають від технічного боргу.


Стратегічний аналіз

Першим кроком у впровадженні DDD є осмислення бізнес-стратегії та поточного стану архітектури.

1. Осмислення предметної області

items:

  • title: Сфера діяльності description: Яка основна предметна область компанії?
  • title: Клієнти та Цінність description: Хто клієнти організації та яку цінність вона надає?
  • title: Конкуренція description: З ким компанія конкурує і в чому її унікальність?

2. Визначення піддоменів

  • Основні (Core): Шукайте "унікальну особливість", патенти або ноу-хау.
  • Універсальні (Generic): Готові рішення, SaaS або Open Source.
  • Допоміжні (Supporting): Специфічні компоненти, що не дають конкурентних переваг.

Оцінка поточного проєкту

Тактичний задум

Для кожного компонента дайте відповідь:

  • Чи відповідає складність рішення (Transaction Script, Active Record, Domain Model) складності задачі?
  • Чи є області, де потрібні складніші патерни, або навпаки — де все можна спростити?

Стратегічний задум

Побудуйте карту контекстів (Context Map) для поточної системи. Шукайте неоптимальні рішення:

  • Над одним компонентом працює кілька команд.
  • Основний піддомен розробляється сторонньою компанією.
  • Зовнішні застарілі системи нав'язують незручні моделі.

Стратегія модернізації

"Велике переписування" рідко буває успішним. Краще поєднувати масштабний задум із малими починаннями.

Вирівнювання кордонів

Першим кроком є вирівнювання логічних меж (модулі, пакети) з кордонами піддоменів.

Перехід до фізичних меж

Коли логічні межі встановлені, можна перетворювати їх на фізичні (окремі сервіси або обмежені контексти).


Патерни інтеграції при модернізації

items:

  • title: Anti-Corruption Layer (ACL) description: Захистіть новий контекст від "бруду" застарілих моделей.
  • title: Open-Host Service (OHS) description: Відокремте модель реалізації від публічного API для споживачів.
  • title: Separate Ways description: Якщо команди конфліктують через некритичний функціонал — реалізуйте його окремо.

Тактична модернізація

Патерн «Душитель» (Strangler)

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

Використання Фасаду

Для плавного переходу використовується Фасад — тонкий рівень абстракції, що перенаправляє запити або в стару, або в нову систему.

Рефакторинг

Якщо повна заміна неможлива, проводьте рефакторинг поетапно:

  1. Виділіть Value Objects для спрощення коду.
  2. Зберіть розкидану бізнес-логіку в Aggregates.
  3. Проаналізуйте межі транзакцій.


Прагматичне DDD

DDD — це не про використання всіх патернів одночасно. Це про те, щоб бізнес-логіка керувала вашими технічними рішеннями.

Не апелюйте до авторитету книг. Використовуйте логіку. Замість "так написано в DDD", пояснюйте: "нам потрібна чітка межа транзакції, щоб гарантувати узгодженість даних".

Завдання

  1. З чого почати впровадження DDD в існуючий проєкт?
  1. В чому особливість патерна «Душитель» при роботі з БД?
  1. Чому не варто переходити від Active Record одразу до Event Sourcing?
Copyright © 2026