Агрегаты в DDD (Domain-Driven Design) — это группы связанных между собой объектов, которые представляют целостную единицу бизнес-логики в предметной области. Агрегаты являются основными строительными блоками в доменной модели.
Агрегаты имеют корневой объект, называемый агрегатным корнем, который является точкой входа для доступа к объектам внутри агрегата. Все операции и изменения состояния агрегата должны выполняться через его корень. Агрегаты также определяют границы транзакций, что означает, что все изменения внутри агрегата должны быть атомарными и сохранять консистентность данных.
Пример агрегата на PHP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
```php class Order { private $id; private $customer; private $items; // Конструктор агрегата public function __construct(int $id, Customer $customer) { $this->id = $id; $this->customer = $customer; $this->items = []; } // Метод добавления товара к заказу public function addItem(Item $item) { $this->items[] = $item; } // Метод удаления товара из заказа public function removeItem(Item $item) { $index = array_search($item, $this->items); if ($index !== false) { unset($this->items[$index]); } } // Метод получения общей стоимости заказа public function getTotalCost() { $totalCost = 0; foreach ($this->items as $item) { $totalCost += $item->getPrice(); } return $totalCost; } } class Customer { private $id; private $name; // Конструктор корневого объекта агрегата public function __construct(int $id, string $name) { $this->id = $id; $this->name = $name; } } class Item { private $id; private $name; private $price; // Конструктор объекта внутри агрегата public function __construct(int $id, string $name, float $price) { $this->id = $id; $this->name = $name; $this->price = $price; } // Геттер для получения цены товара public function getPrice() { return $this->price; } } // Использование агрегата // Создание корневого объекта агрегата $customer = new Customer(1, "John Doe"); // Создание агрегата и добавление товаров $order = new Order(1, $customer); $order->addItem(new Item(1, "Product 1", 10.99)); $order->addItem(new Item(2, "Product 2", 20.99)); // Получение общей стоимости заказа $totalCost = $order->getTotalCost(); echo "Total cost: $totalCost"; ``` |
В этом примере у нас есть агрегат «Заказ» (Order), который состоит из корневого объекта «Клиент» (Customer) и объектов «Товар» (Item). Мы можем добавлять и удалять товары из заказа, а также получать общую стоимость заказа. Все операции проводятся через корень агрегата — объект «Заказ».