O que são Aggregates?

No Domain-Driven Design (DDD), Aggregates desempenham um papel crucial na definição e agrupamento de entidades e value objects sob uma única raiz de agregação, garantindo consistência e integridade dos dados em operações complexas. Um Aggregate é um conjunto de entidades e value objects tratados como uma única unidade de consistência, com uma raiz de agregação (Aggregate Root) que é a única entidade exposta ao mundo externo para manipulação e acesso. O Aggregate Root garante a integridade dos dados, aplicando regras de negócio e encapsulando toda a lógica necessária.

Características dos Aggregates

  1. Integridade Consistente: Aggregates garantem que todas as alterações dentro de um conjunto de entidades sejam feitas de forma consistente.

  2. Isolamento: Operações fora do Aggregate não podem modificar diretamente seus componentes internos. Toda a interação deve passar pela raiz do agregamento.

  3. Regra de Negócio Centralizada: A lógica de negócio é centralizada no Aggregate Root, assegurando que todas as regras sejam aplicadas de forma consistente.

Exemplo de Implementação de Aggregates em TypeScript

1. Definindo um Aggregate Root Pedido

Vamos criar um exemplo de Pedido como um Aggregate Root que contém várias Produto e Cliente.

import { v4 as uuidv4 } from "uuid";

class Produto {
  constructor(public readonly id: string, public nome: string, public preco: number) {}
}

class Cliente {
  constructor(public readonly id: string, public nome: string, public email: string) {}
}

class Pedido {
  public readonly id: string;
  private produtos: Produto[] = [];
  private cliente: Cliente;

  constructor(cliente: Cliente) {
    this.id = uuidv4();
    this.cliente = cliente;
  }

  adicionarProduto(produto: Produto) {
    this.produtos.push(produto);
  }

  removerProduto(produtoId: string) {
    this.produtos = this.produtos.filter(produto => produto.id !== produtoId);
  }

  calcularTotal(): number {
    return this.produtos.reduce((total, produto) => total + produto.preco, 0);
  }

  finalizarPedido() {
    if (this.produtos.length === 0) {
      throw new Error("O pedido deve conter pelo menos um produto.");
    }
    // Lógica adicional para finalizar o pedido
    console.log("Pedido finalizado com sucesso!");
  }
}

// Uso
const cliente = new Cliente("1", "João Silva", "joao@example.com");
const pedido = new Pedido(cliente);

const produto1 = new Produto("1", "Produto A", 50);
const produto2 = new Produto("2", "Produto B", 30);

pedido.adicionarProduto(produto1);
pedido.adicionarProduto(produto2);

console.log(`Total do Pedido: R$ ${pedido.calcularTotal()}`);

pedido.finalizarPedido();

Benefícios de Usar Aggregates

  1. Consistência de Dados: Garantem que todas as operações respeitem as regras de negócio e mantenham a consistência dos dados.

  2. Isolamento de Mudanças: Promovem o encapsulamento, isolando mudanças internas do Aggregate de outras partes do sistema.

  3. Simplificação de Lógica de Negócio: Centralizam a lógica de negócio no Aggregate Root, tornando o código mais fácil de entender e manter.

Conclusão

Aggregates são fundamentais para manter a integridade e a consistência dos dados em sistemas complexos. Eles agrupam entidades e value objects sob uma raiz de agregação, centralizando a lógica de negócio e garantindo que todas as operações sejam feitas de forma consistente. Com os exemplos em TypeScript, você pode ver como os Aggregates ajudam a manter o modelo de domínio organizado e robusto.

Comentários

Postagens mais visitadas deste blog

Um caso de uso não deve depender de outro caso de uso

Repositórios não devem ser disponibilizado para os clientes