Ik zit eigenlijk hiermee:
Stel, je hebt een 'probleem-domein' van bv een online shop. Die winkel heeft Customers. Een Customer kan Orders plaatsen, en een Order bestaat uit één of meer OrderLines.
Stel nu dat een Customer de ‘gold status’ verkrijgt als hij voor 10.000 euro orders heeft geplaatst. In een Domain Driven Design zou je dus logischerwijze dit gedrag in de Customer class definiëren. Dit zou je op deze manier kunnen doen:
Dit zou je dus in eerste instantie kunnen doen. Echter is dit niet echt de aangewezen manier. Om te bepalen of een klant ‘Gold’ is, zou je dus alle Orders en alle Orderlines voor die klant uit de DB moeten trekken. Als OrderLines lazy loaded is, betekent dit dus dat er voor ieder Order object een query moet uitgevoerd worden…. Niet echt bevorderend voor de performance als je zo een aantal Orders hebt voor een Customer, of als je dit moet doen voor een paar Customer objecten. Je trekt ook een aantal objecten uit de DB die je misschien enkel nodig hebt om deze test te doen.
Het is dus beter om deze logica uit het Customer object te halen, en het in een ‘Specification’ te stoppen.
Die ‘Specification’ kan gewoon gebruik maken van SQL om het totale order-bedrag voor die klant op te halen. De logica blijft ook binnen de domein-laag zitten.
Dit is heel wat beter. De customerRepository voert gewoon één query uit die het OrderTotaal voor de gewenste klant ophaalt. Geen verspilling van resources, geen n queries die moeten uitgevoerd worden.
Echter…. Als je alle logica die een beetje complex is, uit de domain entities haalt, wat blijft er dan nog over van die entities ? Worden het dan niet gewoon ‘domme’ entiteiten zonder logica, en zit al je logica dan niet in specifications ? Wat is het verschil dan tussen Domain Driven Design en de Entity aanpak van Yourdon ?
Stel, je hebt een 'probleem-domein' van bv een online shop. Die winkel heeft Customers. Een Customer kan Orders plaatsen, en een Order bestaat uit één of meer OrderLines.
Stel nu dat een Customer de ‘gold status’ verkrijgt als hij voor 10.000 euro orders heeft geplaatst. In een Domain Driven Design zou je dus logischerwijze dit gedrag in de Customer class definiëren. Dit zou je op deze manier kunnen doen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| public class Customer
{
public bool IsGoldCustomer()
{
Decimal total = 0;
foreach( Order o in _orderCollection )
{
total += o.OrderAmount;
}
return ( total > 10000);
}
} |
Dit zou je dus in eerste instantie kunnen doen. Echter is dit niet echt de aangewezen manier. Om te bepalen of een klant ‘Gold’ is, zou je dus alle Orders en alle Orderlines voor die klant uit de DB moeten trekken. Als OrderLines lazy loaded is, betekent dit dus dat er voor ieder Order object een query moet uitgevoerd worden…. Niet echt bevorderend voor de performance als je zo een aantal Orders hebt voor een Customer, of als je dit moet doen voor een paar Customer objecten. Je trekt ook een aantal objecten uit de DB die je misschien enkel nodig hebt om deze test te doen.
Het is dus beter om deze logica uit het Customer object te halen, en het in een ‘Specification’ te stoppen.
Die ‘Specification’ kan gewoon gebruik maken van SQL om het totale order-bedrag voor die klant op te halen. De logica blijft ook binnen de domein-laag zitten.
code:
1
2
3
4
5
6
7
8
9
| public class CustomerGoldStatusSpecification
{
public bool IsSatisfied( Customer c )
{
Decimal amount = customerRepository.GetOrderTotalForCustomer (c.Id);
return ( amount > 10000);
}
} |
Dit is heel wat beter. De customerRepository voert gewoon één query uit die het OrderTotaal voor de gewenste klant ophaalt. Geen verspilling van resources, geen n queries die moeten uitgevoerd worden.
Echter…. Als je alle logica die een beetje complex is, uit de domain entities haalt, wat blijft er dan nog over van die entities ? Worden het dan niet gewoon ‘domme’ entiteiten zonder logica, en zit al je logica dan niet in specifications ? Wat is het verschil dan tussen Domain Driven Design en de Entity aanpak van Yourdon ?
https://fgheysels.github.io/