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; }