Sobes.tech
Middle+

Was ist ein Aggregat?

sobes.tech KI

Antwort von AI

Das Aggregat im objektorientierten Design (DDD) ist ein Cluster von verbundenen Objekten, die als eine Einheit in Bezug auf Datenintegrität betrachtet werden. Jedes Aggregat hat eine Wurzel (Aggregatwurzel), die der einzige Zugriffspunkt auf andere Objekte innerhalb des Aggregats ist. Alle Änderungen innerhalb des Aggregats sollten über das Wurzelobjekt erfolgen, um die Invarianten (Integritätsregeln) aufrechtzuerhalten.

Wichtige Merkmale:

  • Wurzelobjekt (Aggregatwurzel): Der einzige Zugriffspunkt auf die Komponenten des Aggregats.
  • Kapselung: Die internen Objekte des Aggregats sollten von außen nicht direkt zugänglich sein.
  • Kohärenzgrenze: Das Aggregat definiert eine Grenze, innerhalb derer die Invarianten aufrechterhalten werden. Änderungen innerhalb des Aggregats sind transaktionell kohärent.
  • Isolation: Es ist nicht erlaubt, direkt mit Objekten eines anderen Aggregats zu interagieren, nur über ihre Wurzelobjekte oder durch Domänendienste.

Beispiel:

<?php

// Wurzelobjekt des Aggregats "Bestellung"
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
    {
        // Überprüfung der Invarianten, z.B. Menge > 0
        if ($quantity <= 0) {
            throw new InvalidArgumentException("Menge muss größer als null sein.");
        }

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

    public function confirm(): void
    {
        // Überprüfung der Invarianten vor Statusänderung
        if ($this->status !== OrderStatus::Pending) {
            throw new DomainException("Bestellung ist nicht mehr im Status 'Ausstehend'.");
        }

        // Bestätigungslogik, z.B. Verfügbarkeit der Artikel prüfen
        $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;
    }
}

// Inneres Objekt des Aggregats "Bestellposition"
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;
    }
}

// Wertobjekte (Beispiel)
final class OrderId {}
final class CustomerId {}
final class ProductId {}
final class Money {}
enum OrderStatus { case Pending; case Confirmed; case Cancelled; }