Sobes.tech
Middle+

Mis on agregaat?

sobes.tech AI

Vastus AI-lt

Aegreģāts priekšmetu orientētajā projektēšanā (DDD) ir saistītu objektu kopums, kas tiek uzskatīti par vienotu veselumu datu integritātes nolūkos. Katram aģentam ir saknes objekts (Aģentūras sakne), kas ir vienīgais piekļuves punkts uz citiem objektiem aģentūrā. Visas izmaiņas aģentūrā jāveic caur saknes objektu, lai saglabātu invariants (integritātes noteikumus).

Galvenās īpašības:

  • Saknes objekts (Aģentūras sakne): Vienīgais piekļuves punkts uz aģentūras komponentiem.
  • Intraprotēšana: Iekšējie aģentūras objekti nedrīkst būt pieejami tieši no ārpuses.
  • Saskaņošanas robeža: Aģentūra nosaka robežu, kurā tiek uzturēti invarianti. Izmaiņas aģentūrā ir transakcijas saskaņotas.
  • Izolācija: Tieša sadarbība ar cita aģentūras objektiem nav atļauta, tikai caur to saknes objektiem vai domēna pakalpojumiem.

Piemērs:

<?php

// Aģentūras saknes objekts "Pasūtījums"
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
    {
        // Invariantu pārbaude, piemēram, daudzums > 0
        if ($quantity <= 0) {
            throw new InvalidArgumentException("Daudzums jābūt lielāks par nulli.");
        }

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

    public function confirm(): void
    {
        // Invariantu pārbaude pirms statusa maiņas
        if ($this->status !== OrderStatus::Pending) {
            throw new DomainException("Pasūtījums vairs nav statusā 'Gaidošs'.");
        }

        // Apstiprināšanas loģika, piemēram, preču pieejamības pārbaude
        $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;
    }
}

// Iekšējais aģentūras objekts "Pasūtījuma vienums"
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;
    }
}

// Vērtību objekti (piemēram)
final class OrderId {}
final class CustomerId {}
final class ProductId {}
final class Money {}
enum OrderStatus { case Pending; case Confirmed; case Cancelled; }