Middle+
Ce este un agregat?
sobes.tech AI
Răspuns de la AI
Agregatul în proiectarea orientată pe obiect (DDD) este un cluster de obiecte legate, considerate ca o unitate în ceea ce privește integritatea datelor. Fiecare agregat are un obiect rădăcină (Root-ul agregatului), care este singurul punct de acces la alte obiecte din interiorul agregatului. Toate modificările din interiorul agregatului trebuie să se facă prin intermediul obiectului rădăcină pentru a menține invariabilele (regulile de integritate).
Caracteristici cheie:
- Obiect rădăcină (Root-ul agregatului): Singurul punct de acces la componentele agregatului.
- Încapsulare: Obiectele interne ale agregatului nu trebuie să fie accesibile direct din exterior.
- Limita de coerență: Agregatul definește o limită în interiorul căreia invariabilele sunt menținute. Modificările din interiorul agregatului sunt coerente tranzacțional.
- Izolare: Nu se poate interacționa direct cu obiectele altui agregat, doar prin obiectele lor rădăcină sau prin servicii de domeniu.
Exemplu:
<?php
// Obiect rădăcină al agregatului "Comandă"
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
{
// Verificarea invariabilor, de exemplu, cantitatea > 0
if ($quantity <= 0) {
throw new InvalidArgumentException("Cantitatea trebuie să fie mai mare decât zero.");
}
$this->items[] = new OrderItem($productId, $quantity, $price);
}
public function confirm(): void
{
// Verificarea invariabilor înainte de schimbarea stării
if ($this->status !== OrderStatus::Pending) {
throw new DomainException("Comanda nu mai este în starea 'În așteptare'.");
}
// Logica de confirmare, de exemplu, verificarea disponibilității produselor
$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;
}
}
// Obiect intern al agregatului "Linie de comandă"
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;
}
}
// Obiecte de valoare (exemplu)
final class OrderId {}
final class CustomerId {}
final class ProductId {}
final class Money {}
enum OrderStatus { case Pending; case Confirmed; case Cancelled; }