Middle+
Τι είναι το άθροισμα;
sobes.tech AI
Απάντηση από AI
Ο συγκεντρωτής στον σχεδιασμό προσανατολισμένο στα αντικείμενα (DDD) είναι ένα σύνολο συσχετισμένων αντικειμένων που θεωρούνται ως ενιαίο σύνολο όσον αφορά την ακεραιότητα των δεδομένων. Κάθε συγκεντρωτής έχει ένα ριζικό αντικείμενο-οντότητα (Aggregate Root), το οποίο αποτελεί το μοναδικό σημείο πρόσβασης σε άλλα αντικείμενα εντός του συγκεντρωτή. Όλες οι αλλαγές εντός του συγκεντρωτή πρέπει να πραγματοποιούνται μέσω του ριζικού αντικειμένου για τη διατήρηση των invariants (κανόνων ακεραιότητας).
Βασικά χαρακτηριστικά:
- Ριζικό αντικείμενο (Aggregate Root): Το μοναδικό σημείο πρόσβασης στα συστατικά του συγκεντρωτή.
- Εν encapsulation: Τα εσωτερικά αντικείμενα του συγκεντρωτή δεν πρέπει να είναι άμεσα προσβάσιμα από έξω.
- Όριο συμφωνίας: Ο συγκεντρωτής ορίζει ένα όριο εντός του οποίου διατηρούνται τα invariants. Οι αλλαγές εντός του συγκεντρωτή είναι συναλλακτικά συμφωνημένες.
- Απομόνωση: Δεν είναι δυνατή η άμεση αλληλεπίδραση με αντικείμενα άλλου συγκεντρωτή, μόνο μέσω των ριζικών αντικειμένων τους ή μέσω υπηρεσιών του domain.
Παράδειγμα:
<?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; }