Il Domain-Driven Design (DDD) è un approccio alla progettazione di sistemi software che si concentra sul dominio e sulla sua logica. DDD suddivide domini complessi in contesti limitati (bounded contexts) collegati ma indipendenti. All'interno di ciascun contesto viene sviluppato un linguaggio proprio (Ubiquitous Language), concordato con gli esperti del dominio. I principali blocchi costitutivi del DDD:
I contesti limitati rappresentano spesso microservizi separati che interagiscono tramite API o eventi esplicitamente descritti.
Esempio di codice in Java (Spring):
// Esempio di Value Object @Embeddable public class Address { private String city; private String street; // ... costruttori, equals, hashCode } // Esempio di Entity con Aggregate Root @Entity public class Order { @Id private Long id; @Embedded private Address deliveryAddress; // ... metodi di business }
Caratteristiche chiave:
Tutti gli oggetti nel DDD sono Entity?
No, ci sono anche i Value Objects: non hanno unicità, il loro stato definisce completamente l'identità.
Address a1 = new Address("Mosca", "Arbat"); Address a2 = new Address("Mosca", "Arbat"); System.out.println(a1.equals(a2)); // true
Significa che suddividere in microservizi applica DDD?
No, è possibile applicare DDD anche all'interno di un'applicazione monolitica, costruendo confini interni dei contesti.
È sempre necessario un repository per ogni aggregato?
Di solito sì, ma a volte un aggregato può essere completamente memorizzato come parte di un altro aggregato, se non è la radice di una transazione di business separata.