DDD: Domain-Driven Design
Ako navrhovať softvér okolo biznisu, nie okolo technológie
Domain-Driven Design (DDD) je prístup k vývoju softvéru, ktorý kladie dôraz na dôkladné pochopenie domény – teda problémovej oblasti, ktorú softvér rieši. DDD prepája vývojárov, analytikov a biznis jedným spoločným jazykom a pomáha tvoriť aplikácie, ktoré sú prehľadné, stabilné a dobre škálovateľné.
Čo je doména?
Doména predstavuje oblasť, ktorú softvér rieši. Môže to byť napríklad bankovníctvo, logistika, e-commerce, zdravotníctvo či rezervačné systémy. DDD hovorí, že najprv musí vývojár pochopiť biznis, až potom môže navrhnúť vhodný softvér.
Ubiquitous Language – spoločný jazyk
Všetky tímy (biznis, analytici, vývojári) používajú rovnaké pomenovania. Tento jazyk sa premieta priamo do kódu.
public class Order { }
public class OrderSubmittedEvent { }
public interface IOrderRepository { }
DDD Building Blocks
1. Entity
Entity je objekt, ktorý má identitu – je unikátne identifikovateľný.
public class Device
{
public Guid Id { get; }
public string Name { get; private set; }
}
2. Value Object
Value object nemá identitu a reprezentuje hodnotu. Je nemenný.
public record Temperature(double Value, string Unit);
3. Aggregate
Aggregate je skupina entít a value objektov, ktorá tvorí logický celok. Každý aggregate má svoj Aggregate Root, ktorý zodpovedá za konzistenciu.
4. Repository
Repository je abstrakcia nad úložiskom dát. Poskytuje metódy na načítanie a uloženie agregátov.
public interface IDeviceRepository
{
Task GetByIdAsync(Guid id);
Task SaveAsync(Device device);
}
5. Domain Events
Udalosti, ktoré reprezentujú dianie v doméne, napríklad: OrderSubmitted, ThresholdExceeded a iné.
Bounded Context – kľúčový koncept DDD
Veľké systémy sa rozdeľujú na viac menších, jasne ohraničených kontextov. Každý kontext má:
- vlastný model,
- vlastný jazyk,
- vlastnú logiku domény.
Tieto kontexty spolu komunikujú cez udalosti alebo dobre definované API.
Architektúra podľa DDD
DDD prirodzene smeruje k architektonickým prístupom ako:
- Clean Architecture,
- Onion Architecture,
- Hexagonal Architecture.
Všetky majú spoločnú myšlienku: doména je v centre projektu a infraštruktúra je až okolo nej.
Praktický príklad DDD
public class Order : AggregateRoot
{
private readonly List<OrderItem> _items = new();
public void AddItem(Product product, int quantity)
{
_items.Add(new OrderItem(product.Id, quantity));
AddDomainEvent(new OrderItemAddedEvent(product.Id, quantity));
}
}
Tento príklad ukazuje agregát, internú doménovú logiku aj domain event. Logika sa nenachádza v kontroléri, ale priamo v doméne.
Prečo používať DDD?
- Čitateľnejší a organizovaný kód
- Oddelenie biznis logiky od infraštruktúry
- Jednoduchá údržba aj pri veľkých aplikáciách
- Prirodzená podpora mikroservisov a modulárnych monolitov
- Nižšia chybovosť v kritických častiach
Záver
Domain-Driven Design pomáha vytvárať softvér, ktorý odráža skutočný svet a potreby biznisu. Ak pochopíte entity, value objekty, agregáty, domain events a bounded contexty, budete schopní vytvárať architektúry, ktoré sú robustné, flexibilné a dlhodobo udržateľné.