Middle+
Kas ir agregāts?
sobes.tech AI
Atbilde no AI
Apgabals priekšmetu orientētā projektēšanā (DDD) ir saistītu objektu kopums, kas tiek uzskatīti par vienotu veselumu datu integritātes nolūkos. Katram apgabalam ir saknes objekts-essence (Apgabala sakne), kas ir vienīgais piekļuves punkts uz citiem objektiem apgabalā. Visas izmaiņas apgabalā jāveic caur saknes objektu, lai saglabātu invariants (integritātes noteikumus).
Galvenās īpašības:
- Saknes objekts (Apgabala sakne): Vienīgais piekļuves punkts uz apgabala komponentiem.
- Intraprotēšana: Iekšējie apgabala objekti nedrīkst būt pieejami tieši no ārpuses.
- Saskaņošanas robeža: Apgabals nosaka robežu, kurā tiek uzturēti invarianti. Izmaiņas apgabalā ir transakcijas saskaņotas.
- Izolācija: Tieša sadarbība ar cita apgabala objektiem nav atļauta, tikai caur to saknes objektiem vai domēna pakalpojumiem.
Piemērs:
<?php
// Apgabala saknes objekts "Pasūtījums"
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
{
// Invariantu pārbaude, piemēram, daudzums > 0
if ($quantity <= 0) {
throw new InvalidArgumentException("Daudzums jābūt lielāks par nulli.");
}
$this->items[] = new OrderItem($productId, $quantity, $price);
}
public function confirm(): void
{
// Invariantu pārbaude pirms statusa maiņas
if ($this->status !== OrderStatus::Pending) {
throw new DomainException("Pasūtījums vairs nav statusā 'Gaidošs'.");
}
// Apstiprināšanas loģika, piemēram, preču pieejamības pārbaude
$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;
}
}
// Iekšējais apgabala objekts "Pasūtījuma vienums"
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;
}
}
// Vērtību objekti (piemēram)
final class OrderId {}
final class CustomerId {}
final class ProductId {}
final class Money {}
enum OrderStatus { case Pending; case Confirmed; case Cancelled; }