Middle+
Nima agregat?
sobes.tech AI
AIdan javob
Obyektga asoslangan dizaynda (DDD) agregat, ma'lumotlarning yaxlitligini ta'minlash uchun birgalikda bog'langan ob'ektlar klasteridir. Har bir agregatning ildiz ob'ekti (Aggregat Root) bo'lib, u agregat ichidagi boshqa ob'ektlarga kirish uchun yagona nuqtadir. Agregat ichidagi barcha o'zgarishlar invariants (integrity qoidalari)ni saqlash uchun ildiz ob'ekti orqali amalga oshirilishi kerak.
Asosiy xususiyatlar:
- Ildiz ob'ekt (Aggregat Root): Agregat komponentlariga kirish uchun yagona nuqta.
- Kapsüllash: Agregat ichidagi ichki ob'ektlar tashqaridan to'g'ridan-to'g'ri kirish uchun mo'ljallanmagan.
- Barqarorlik chegarasi: Agregat invariantslarni saqlash uchun chegarani belgilaydi. Agregat ichidagi o'zgarishlar tranzaktsion ravishda barqarordir.
- Izolyatsiya: Boshqa agregat ob'ektlari bilan to'g'ridan-to'g'ri muloqot qilish mumkin emas, faqat ildiz ob'ektlari yoki domen xizmatlari orqali.
Misol:
<?php
// "Buyurtma" agregatining ildiz ob'ekti
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 tekshiruvi, masalan, miqdor > 0
if ($quantity <= 0) {
throw new InvalidArgumentException("Miqdor 0 dan katta bo'lishi kerak.");
}
$this->items[] = new OrderItem($productId, $quantity, $price);
}
public function confirm(): void
{
// Statusni o'zgartirishdan oldin invariantsni tekshirish
if ($this->status !== OrderStatus::Pending) {
throw new DomainException("Buyurtma 'Kutish' holatida emas.");
}
// Tasdiqlash logikasi, masalan, tovar mavjudligini tekshirish
$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;
}
}
// "Buyurtma satri" ichki ob'ekti
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;
}
}
// Qiymat ob'ektlari (misol uchun)
final class OrderId {}
final class CustomerId {}
final class ProductId {}
final class Money {}
enum OrderStatus { case Pending; case Confirmed; case Cancelled; }