Middle+
Wat is een aggregaat?
sobes.tech AI
Antwoord van AI
De aggregaat in objectgeoriënteerd ontwerp (DDD) is een cluster van gerelateerde objecten die worden beschouwd als één eenheid in termen van gegevensintegriteit. Elk aggregaat heeft een root-object (Aggregaat Root), dat het enige toegangspunt is tot andere objecten binnen het aggregaat. Alle wijzigingen binnen het aggregaat moeten via het root-object worden gedaan om invariants (integriteitsregels) te behouden.
Belangrijke kenmerken:
- Root-object (Aggregaat Root): Het enige toegangspunt tot de componenten van het aggregaat.
- Encapsulatie: De interne objecten van het aggregaat mogen niet direct toegankelijk zijn van buitenaf.
- Grens van consistentie: Het aggregaat definieert een grens waarbinnen invariants worden gehandhaafd. Wijzigingen binnen het aggregaat zijn transactie-constistent.
- Isolatie: Het is niet toegestaan om direct te communiceren met objecten van een ander aggregaat, alleen via hun root-objecten of via domeindiensten.
Voorbeeld:
<?php
// Root-object van het "Order" aggregaat
class Order
{
private OrderId $id;
private CustomerId $customerId;
/** @var OrderItem[] */
private array $items = [];
private OrderStatus $status;
public function __construct(OrderId $id, CustomerId $customerId)
{
$this->id = $id;
$this->customerId = $customerId;
$this->status = OrderStatus::Pending;
}
public function addItem(ProductId $productId, int $quantity, Money $price): void
{
// Controle van invariants, bijvoorbeeld hoeveelheid > 0
if ($quantity <= 0) {
throw new InvalidArgumentException("Hoeveelheid moet groter dan nul zijn.");
}
$this->items[] = new OrderItem($productId, $quantity, $price);
}
public function confirm(): void
{
// Controle van invariants voordat de status wordt gewijzigd
if ($this->status !== OrderStatus::Pending) {
throw new DomainException("Order is niet meer in de status 'In afwachting'.");
}
// Bevestigingslogica, bijvoorbeeld controle op beschikbaarheid van producten
$this->status = OrderStatus::Confirmed;
}
public function getId(): OrderId
{
return $this->id;
}
public function getStatus(): OrderStatus
{
return $this->status;
}
/** @return OrderItem[] */
public function getItems(): array
{
return $this->items;
}
}
// Innerlijk object van het aggregaat "Orderregel"
class OrderItem
{
private ProductId $productId;
private int $quantity;
private Money $price;
public function __construct(ProductId $productId, int $quantity, Money $price)
{
$this->productId = $productId;
$this->quantity = $quantity;
$this->price = $price;
}
public function getProductId(): ProductId
{
return $this->productId;
}
public function getQuantity(): int
{
return $this->quantity;
}
public function getPrice(): Money
{
return $this->price;
}
}
// Waarde-objecten (voorbeeld)
final class OrderId {}
final class CustomerId {}
final class ProductId {}
final class Money {}
enum OrderStatus { case Pending; case Confirmed; case Cancelled; }