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

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

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

Прагматичне DDD
DDD — це не про використання всіх патернів одночасно. Це про те, щоб бізнес-логіка керувала вашими технічними рішеннями.
Завдання
- З чого почати впровадження DDD в існуючий проєкт?
- В чому особливість патерна «Душитель» при роботі з БД?
- Чому не варто переходити від Active Record одразу до Event Sourcing?