Postagens

Mostrando postagens de outubro, 2024

Crenças Fundamentais de algumas das lendas da computação: Robert C. Martin, Eric Evans, Kent Beck e Martin Fowler

Imagem
Robert C. Martin (Uncle Bob) Robert C. Martin, mais conhecido como Uncle Bob, é uma figura central no mundo do desenvolvimento de software. Sua crença principal gira em torno da importância do código limpo . Para Uncle Bob, código limpo não é apenas uma boa prática, é um imperativo ético. Ele defende que o código deve ser escrito de maneira que seja fácil de entender e manter, pois isso reduz a complexidade e os erros a longo prazo. Uncle Bob acredita firmemente na simplicidade e clareza, pregando que a única maneira de ir rápido é ir bem, e que a responsabilidade profissional deve guiar todas as ações de um desenvolvedor. Eric Evans Eric Evans é o pioneiro do Domain-Driven Design (DDD), uma abordagem que enfatiza a importância de entender o domínio do problema ao desenvolver software. Para Evans, modelar o domínio corretamente é crucial para criar soluções eficazes. Ele acredita que a comunicação clara entre desenvolvedores e especialistas no domínio é essencial para capturar a compl...

A importância da linguagem ubíqua na modelagem do domínio de um software

No universo do desenvolvimento de software, especialmente quando se trata de sistemas complexos, a comunicação eficaz entre todas as partes envolvidas é crucial. É neste contexto que a linguagem ubíqua, um conceito fundamental do Domain-Driven Design (DDD), ganha destaque. Este artigo explorará a importância da linguagem ubíqua na modelagem de domínio e como ela pode transformar a maneira como criamos e mantemos software. O que é Linguagem Ubíqua? A linguagem ubíqua é um vocabulário compartilhado entre todos os membros de uma equipe envolvida em um projeto de software. Este vocabulário inclui termos, frases e conceitos específicos do domínio do negócio que o software está destinado a servir. O termo "ubíqua" significa que esta linguagem deve ser onipresente - usada não apenas nas discussões, mas também no código, nos diagramas e na documentação. A Importância da Linguagem Ubíqua 1. Alinhamento entre Negócio e Tecnologia Uma das principai...

Como construir um software flexível e alinhado ao negócio?

Para construir um software bem estruturado e que atenda aos principais requisitos de design de código difundidos na Arquitetura Limpa, Hexagonal e Domain-Driven Design (DDD), você deve se concentrar nos seguintes princípios e fundamentos: Separação de Preocupações: Divida seu software em camadas distintas com responsabilidades bem definidas. Isole a lógica de negócios do código de infraestrutura e interface do usuário. Inversão de Dependência: Faça com que as camadas de alto nível (regras de negócio) não dependam das camadas de baixo nível (detalhes de implementação). Use interfaces e abstrações para definir contratos entre as camadas. Regra de Dependência: As dependências no código devem apontar apenas para dentro, em direção às políticas de alto nível. Entidades e Casos de Uso: Identifique as entidades centrais do seu domínio e os casos de uso que as manipulam. Mantenha as regras de negócio no núcleo da aplicação. Modelagem de Domínio: Use a linguagem ubíqua par...

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 Integridade Consistente : Aggregates garantem que todas as alterações dentro de um conjunto de entidades sejam feitas de forma consistente. Isolamento : Operações fora do Aggregate não podem modificar diretamente seus componentes internos. Toda a interação deve passar pela raiz do agregamento. Regra de Negócio Centralizada : A lógica de negócio é centralizada no Aggregate Root, assegurando qu...

O que são Entidades?

No Domain-Driven Design (DDD), Entidades e Value-Objects são conceitos fundamentais. Entidades possuem uma identidade única que as distingue de outras instâncias, mesmo que seus atributos sejam iguais, e podem mudar de estado ao longo do tempo. Value-Objects, por outro lado, são definidos pelos seus atributos, são imutáveis e comparados por valor. Neste artigo, vamos explorar o que são Entidades e seu papel na camada de domínio. Características das Entidades Identidade Única : Cada Entidade deve ter um identificador único que a distingue de outras Entidades. Esse identificador pode ser uma propriedade como um ID, um número de série, etc. Estado Mutável : As Entidades podem mudar seu estado ao longo do tempo. Suas propriedades podem ser modificadas durante seu ciclo de vida. Ciclo de Vida Próprio : As Entidades têm seu próprio ciclo de vida, desde a criação até a exclusão. Elas podem ser persistidas em um banco de dados, modificadas e eventualmente excluídas. Exemplo de Implementação de...

O que são os Domain Services?

Domain Services são um conceito central no Domain-Driven Design (DDD), encapsulando lógica de negócios que não se encaixa em Entidades ou Value Objects. Tratam operações envolvendo múltiplas Entidades ou comportamentos específicos do domínio, promovendo um design de software coeso e organizado. São classes que contêm essa lógica de negócios, mantendo o modelo de domínio puro e evitando que Entidades e Value Objects assumam responsabilidades inadequadas. Exemplos de Domain Services 1. Serviço de Transferência de Dinheiro Imagine um sistema bancário onde precisamos transferir dinheiro entre duas contas. Essa operação envolve duas Entidades ( Conta ) e uma lógica que não pertence a nenhuma delas individualmente. class Conta { constructor ( public id : string , public saldo : number ) {} debitar ( valor : number ) { if ( this . saldo >= valor) { this . saldo -= valor; } else { throw new Error ( "Saldo insuficiente" ); } } creditar ( ...