Middle+
Агрегат чист?
sobes.tech AI
Ҷавоб аз AI
Агрегат дар тарҳи объектӣ-равона (DDD) як кластер аз объектҳои пайвастшуда мебошад, ки ҳамчун як умумӣ дар назарияи муттаҳидии маълумот баррасӣ мешаванд. Ҳар як агрегат дорои объект-роҳбари асосӣ (Aggregate Root) мебошад, ки ягона нуқтаи дастрасӣ ба дигар объектҳо дар дохили агрегат мебошад. Ҳамаи тағйиротҳо дар дохили агрегат бояд тавассути объект-роҳбар анҷом дода шаванд, то invariants (қоидаҳои муттаҳидӣ) нигоҳ дошта шаванд.
Хусусиятҳои асосӣ:
- Объект-роҳбар (Aggregate Root): ягона нуқтаи дастрасӣ ба компонентҳои агрегат.
- Капсулация: объектҳои дохилии агрегат бояд мустақиман дастрас набошанд.
- Ҳудуди мувофиқат: агрегат ҳудудро муайян мекунад, дар дохили он invariants нигоҳ дошта мешаванд. Тағйиротҳо дар дохили агрегат транзаксионӣ мувофиқат мекунанд.
- Изоляция: мустақиман бо объектҳои дигар агрегат муошират кардан мумкин нест, танҳо тавассути объект-роҳбарон ё хизматрасониҳои домен.
Масалан:
<?php
// Объект-роҳбар дар агрегат "Таҳ order"
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("Таҳ order аллакай дар статус 'Чекор' нест.");
}
// Логикаи тасдиқ, масалан, санҷиши мавҷудияти молҳо
$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;
}
}
// Объект дар дохили агрегат "Рақами таҳ order"
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; }