Middle+
Šta je agregat?
sobes.tech АИ
Одговор од АИ
Агрегат у објектно оријентисаном пројектовању (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, npr. količina > 0
if ($quantity <= 0) {
throw new InvalidArgumentException("Količina mora biti veća od nule.");
}
$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; }