Sobes.tech
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; }