Middle+
O que é um agregado?
sobes.tech IA
Resposta da IA
O agregado no design orientado a objetos (DDD) é um agrupamento de objetos relacionados considerados como uma unidade em termos de integridade de dados. Cada agregado possui uma raiz (Raiz do Agregado), que é o único ponto de acesso a outros objetos dentro do agregado. Todas as alterações dentro do agregado devem ser feitas através do objeto raiz para manter os invariantes (regras de integridade).
Características principais:
- Objeto raiz (Raiz do Agregado): O único ponto de acesso aos componentes do agregado.
- Encapsulamento: Os objetos internos do agregado não devem ser acessíveis diretamente de fora.
- Limite de consistência: O agregado define um limite dentro do qual os invariantes são mantidos. As alterações dentro do agregado são transacionalmente consistentes.
- Isolamento: Não se pode interagir diretamente com objetos de outro agregado, apenas através de seus objetos raiz ou por serviços do domínio.
Exemplo:
<?php
// Objeto raiz do agregado "Pedido"
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
{
// Verificação de invariantes, por exemplo, quantidade > 0
if ($quantity <= 0) {
throw new InvalidArgumentException("A quantidade deve ser maior que zero.");
}
$this->items[] = new OrderItem($productId, $quantity, $price);
}
public function confirm(): void
{
// Verificação de invariantes antes de alterar o status
if ($this->status !== OrderStatus::Pending) {
throw new DomainException("Pedido já não está no estado 'Pendente'.");
}
// Lógica de confirmação, por exemplo, verificar disponibilidade de produtos
$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;
}
}
// Objeto interno do agregado "Linha de pedido"
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;
}
}
// Objetos de valor (como exemplo)
final class OrderId {}
final class CustomerId {}
final class ProductId {}
final class Money {}
enum OrderStatus { case Pending; case Confirmed; case Cancelled; }