Middle+
Yığın nedir?
sobes.tech yapay zeka
AI'dan gelen yanıt
Nesne yönelimli tasarımda (DDD) agregat, veri bütünlüğü açısından tek bir birim olarak kabul edilen ilişkili nesnelerin kümesidir. Her agregatın, agregat kökü (Aggregate Root) adında bir nesnesi vardır ve bu nesne, agregat içindeki diğer nesnelere erişimin tek noktasıdır. Agregat içindeki tüm değişiklikler, bütünlük kurallarını (invarians) korumak için kök nesne aracılığıyla yapılmalıdır.
Ana özellikler:
- Kök nesne (Aggregate Root): Agregat bileşenlerine erişimin tek noktasıdır.
- Kapsülleme: Agregat içindeki iç nesneler doğrudan dışarıdan erişilebilir olmamalıdır.
- Tutarlılık sınırı: Agregat, invariantların korunduğu sınırı tanımlar. Agregat içindeki değişiklikler, işlemlerle tutarlı olmalıdır.
- İzolasyon: Başka bir agregatın nesneleriyle doğrudan etkileşim yapılamaz, sadece kök nesneleri veya domain servisleri aracılığıyla.
Örnek:
<?php
// "Sipariş" agregat kökü nesnesi
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 kontrolü, örneğin, miktar > 0
if ($quantity <= 0) {
throw new InvalidArgumentException("Miktar sıfırdan büyük olmalı.");
}
$this->items[] = new OrderItem($productId, $quantity, $price);
}
public function confirm(): void
{
// Durum değişikliği öncesi invariansların kontrolü
if ($this->status !== OrderStatus::Pending) {
throw new DomainException("Sipariş zaten 'Beklemede' durumunda değil.");
}
// Onaylama mantığı, örneğin, ürünlerin stok durumu kontrolü
$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;
}
}
// "Sipariş Satırı" iç nesnesi
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;
}
}
// Değer nesneleri (örnek)
final class OrderId {}
final class CustomerId {}
final class ProductId {}
final class Money {}
enum OrderStatus { case Pending; case Confirmed; case Cancelled; }