Middle+
Какво е агрегат?
sobes.tech AI
Отговор от AI
Агрегатът в обектно-ориентираното проектиране (DDD) е клъстер от свързани обекти, които се разглеждат като единно цяло по отношение на цялостността на данните. Всеки агрегат има коренов обект-ентитет (Aggregate Root), който е единствената точка за достъп до другите обекти вътре в агрегата. Всички промени вътре в агрегата трябва да се извършват чрез кореновия обект, за да се поддържат invariants (правила за цялостност).
Ключови характеристики:
- Коренов обект (Aggregate Root): Единствената точка за достъп до компонентите на агрегата.
- Капсулация: Вътрешните обекти на агрегата не трябва да са достъпни директно отвън.
- Граница на съгласуваност: Агрегатът определя граница, вътре в която се поддържат invariants. Промените вътре в агрегата са транзакционно съгласувани.
- Изолация: Не може да се взаимодейства директно с обекти на друг агрегат, само чрез техните коренови обекти или чрез домейн услуги.
Пример:
<?php
// Коренов обект на агрегата "Поръчка"
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
{
// Проверка invariants, например, количество > 0
if ($quantity <= 0) {
throw new InvalidArgumentException("Количество должно быть повече от нула.");
}
$this->items[] = new OrderItem($productId, $quantity, $price);
}
public function confirm(): void
{
// Проверка invariants преди промяна на статуса
if ($this->status !== OrderStatus::Pending) {
throw new DomainException("Поръчката вече не е в статус 'Очакване'.");
}
// Логика за потвърждаване, например проверка за наличност на стоки
$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;
}
}
// Вътрешен обект на агрегата "Поръчкова позиция"
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;
}
}
// Стойностни обекти (например)
final class OrderId {}
final class CustomerId {}
final class ProductId {}
final class Money {}
enum OrderStatus { case Pending; case Confirmed; case Cancelled; }