Sobes.tech
Middle+

Kas yra agregatas?

sobes.tech AI

Atsakymas iš AI

Objektų grupė objektinio projektavimo (DDD) srityje yra susijusių objektų rinkinys, kuris laikomas kaip vienetas duomenų vientisumo požiūriu. Kiekvienas agregatas turi šaknies objektą-entity (Aggregate Root), kuris yra vienintelis prieigos taškas prie kitų objektų agregato viduje. Visi pokyčiai agregate turi būti atliekami per šaknies objektą, siekiant išlaikyti invariants (integriteto taisykles).

Pagrindinės savybės:

  • Šaknies objektas (Aggregate Root): Vienintelis prieigos taškas prie agregato komponentų.
  • Kapsuliacija: Vidiniai agregato objektai neturi būti tiesiogiai pasiekiami išorėje.
  • Sutarimo riba: Agregatas apibrėžia ribą, kurioje palaikomi invariants. Pokyčiai agregate yra transakciniu būdu suderinti.
  • Izoliacija: Tiesiogiai su kitų agregatų objektais bendrauti negalima, tik per jų šaknies objektus arba per domeno paslaugas.

Pavyzdys:

<?php

// Agregato "Užsakymas" šaknies objektas
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
    {
        // Invariancų patikrinimas, pvz., kiekis > 0
        if ($quantity <= 0) {
            throw new InvalidArgumentException("Kiekis turi būti didesnis už nulį.");
        }

        $this->items[] = new OrderItem($productId, $quantity, $price);
    }

    public function confirm(): void
    {
        // Invariancų patikrinimas prieš keisti būseną
        if ($this->status !== OrderStatus::Pending) {
            throw new DomainException("Užsakymas jau nėra 'Laukiama' būsenoje.");
        }

        // Patvirtinimo logika, pvz., patikrinimas prekių prieinamumo
        $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;
    }
}

// Vidinis agregato "Užsakymo eilutė" objektas
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;
    }
}

// Vertingumo objektai (pvz.)
final class OrderId {}
final class CustomerId {}
final class ProductId {}
final class Money {}
enum OrderStatus { case Pending; case Confirmed; case Cancelled; }