Sobes.tech
Middle+

Aqreqat nədir?

sobes.tech Süni İntellekt

AI-dan cavab

Obyekt yönümlü dizayn (DDD) daxilində, agregat məlumatların bütövlüyünü təmin etmək üçün əlaqəli obyektlərin klasteridir. Hər agregatın kök obyekti (Aggregate Root) var və bu, agregat daxilində digər obyektlərə giriş üçün yeganə nöqtədir. Agregat daxilindəki bütün dəyişikliklər invariants (bütövlük qaydaları) qorunması üçün kök obyekt vasitəsilə həyata keçirilməlidir.

Əsas xüsusiyyətlər:

  • Kök obyekt (Aggregate Root): Agregatın komponentlərinə giriş üçün yeganə nöqtə.
  • İnkapsulyasiya: Agregatın daxili obyektləri birbaşa xaricdən əlçatan olmamalıdır.
  • Uyğunluq sərhədi: Agregat, invariantsların qorunduğu sərhədi müəyyən edir. Agregat daxilindəki dəyişikliklər tranzaksiya ilə uyğun olur.
  • İzolasiya: Başqa agregatın obyektləri ilə birbaşa qarşılıqlı əlaqə qadağandır, yalnız onların kök obyektləri və ya domen xidmətləri vasitəsilə.

Nümunə:

<?php

// "Sifariş" agregatının kök obyekti
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
    {
        // İnvariansların yoxlanması, məsələn, miqdar > 0
        if ($quantity <= 0) {
            throw new InvalidArgumentException("Miqdar 0-dan böyük olmalıdır.");
        }

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

    public function confirm(): void
    {
        // Status dəyişmədən əvvəl invariants yoxlanır
        if ($this->status !== OrderStatus::Pending) {
            throw new DomainException("Sifariş artıq 'Gözləmə' vəziyyətində deyil.");
        }

        // Təsdiqləmə logikası, məsələn, məhsul mövcudluğunu yoxlamaq
        $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;
    }
}

// "Sifariş satırı" daxili obyekti
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;
    }
}

// Dəyər obyektləri (nümunə)
final class OrderId {}
final class CustomerId {}
final class ProductId {}
final class Money {}
enum OrderStatus { case Pending; case Confirmed; case Cancelled; }