Middle+
Mi az az aggregátum?
sobes.tech MI
Válasz az MI-től
Az aggregátum az objektum-orientált tervezésben (DDD) egy kapcsolódó objektumok klasztere, amelyeket egységként kezelnek az adatok integritásának szempontjából. Minden aggregátumnak van egy gyökér objektuma-entity (Aggregate Root), amely az egyetlen hozzáférési pont a többi objektumhoz az aggregátumon belül. Minden változás az aggregátumon belül a gyökér objektumon keresztül történik az invariánsok (integritási szabályok) fenntartása érdekében.
Fő jellemzők:
- Gyökér objektum (Aggregate Root): Az egyetlen hozzáférési pont az aggregátum összetevőihez.
- Encapsulation: Az aggregátum belső objektumai nem lehetnek közvetlenül elérhetők kívülről.
- Egyezmény határa: Az aggregátum határt határoz meg, amelyen belül az invariánsok fenntartottak. A változások tranzakciós módon egyeznek meg.
- Elszigeteltség: Nem lehet közvetlenül kommunikálni más aggregátum objektumaival, csak azok gyökér objektumain vagy domain szolgáltatásokon keresztül.
Példa:
<?php
// Az aggregátum "Rendelés" gyökér objektuma
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
{
// Invariáns ellenőrzése, pl. a mennyiség > 0
if ($quantity <= 0) {
throw new InvalidArgumentException("A mennyiségnek nagyobbnak kell lennie nullánál.");
}
$this->items[] = new OrderItem($productId, $quantity, $price);
}
public function confirm(): void
{
// Invariánsok ellenőrzése a státusz módosítása előtt
if ($this->status !== OrderStatus::Pending) {
throw new DomainException("A rendelés már nem 'Várakozik' státuszban.");
}
// Megerősítési logika, pl. termékek elérhetőségének ellenőrzése
$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;
}
}
// Az aggregátum "Rendelési sor" belső objektuma
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;
}
}
// Értékobjektumok (például)
final class OrderId {}
final class CustomerId {}
final class ProductId {}
final class Money {}
enum OrderStatus { case Pending; case Confirmed; case Cancelled; }