https://github.com/augustodevjs/ddd-typescript
Projeto de estudo sobre Domain Driven Design com Typescript
https://github.com/augustodevjs/ddd-typescript
ddd domain-events factories typescript
Last synced: 3 months ago
JSON representation
Projeto de estudo sobre Domain Driven Design com Typescript
- Host: GitHub
- URL: https://github.com/augustodevjs/ddd-typescript
- Owner: augustodevjs
- Created: 2023-10-22T15:49:23.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2023-11-06T16:44:26.000Z (over 1 year ago)
- Last Synced: 2025-01-02T11:44:18.592Z (5 months ago)
- Topics: ddd, domain-events, factories, typescript
- Language: TypeScript
- Homepage:
- Size: 277 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Domain Driven Design
## DDD:
É uma forma de desenvolver software com o foco no coração da aplicação - o que chamamos de domínio - tendo o objetivo de entender suas regras, processos e complexidades, separando-as assim de outros pontos complexos que normalmente são adicionados durante o processo de desenvolvimento.
- O DDD deve ser aplicado para casos de projetos de softwares complexos.
- Grandes projetos possuem muitas áreas, muitas regras de negócio, muitas pessoas com diferentes visões em diferentes contextos.
- Não há como não utilizar técnicas avançadas em projetos de alta complexidade.
- Grande parte da complexidade desse tipo de software não vem da tecnologia, mas sim da comunicação, separação de contextos, entendimento do negócio por diversos ângulos.### Como o DDD pode ajudar?
- Entender com profundidade o domínio e subdomínios da aplicação.
- Ter uma linguagem universal (linguagem ubíqua) entre todos os envolvidos.
- Criar o design estratégico utilizando Bounded Contexts.
- Criar o design tático para conseguir mapear e agregar as entidades e objetos de valor da aplicação, bem como os eventos de domínio.
- Clareza do que é complexidade de negócio e complexidade técnica.### Elementos táticos:
- Quando estamos falando sobre DDD e precisamos olhar mais a fundo um bounded context. Precisamos ser capazes de modelarmos de forma mais assertiva os seus principais componentes, comportamentos e individualidades, bem como suas relações.
### Entidades:
- Uma entidade é algo único que é capaz de ser alterado de forma contínua durante longo período de tempo.
- Uma entidade é algo que possui uma continuidade em seu ciclo de vida e pode ser distinguida independente dos atributos que são importantes para a aplicação do usuário. Pode ser uma pessoa, cidade, carro um ticket de loteria ou uma transição bancária.### Value Objects:
- Quando você se preocupa apenas com os atributos de um elemento de um model, classifique isso como um Value Object.
- Trate o value object como imutável.### Aggregate:
- Um agregado é um conjunto de objetos associados que tratamos como uma unidade para propósito de mudança de dados.
### Domain Services:
- Um serviço de domínio é uma operação sem estado que cumpre uma tarefa específica do domínio. Muitas vezes, a melhor indicação de que você deve criar um Serviço no modelo de domínio é quando a operação que você precisa executar parece não se encaixar como um método em um Agregado ou um Objeto de Valor.
### Repositórios:
- Um repositório comumente se refere a um local de armazenamento, geralmente considerado um local de segurança ou preservação dos itens nele armazenados. Quando você armazena algo em um repositório e depois retorna para recuperá-lo, você espera que ele esteja no mesmo estado que estava quando você o colocou lá. Em algum momento, você pode optar por remover o item armazenado do repositório.
- Esses objetos semelhantes a coleções são sobre persistência. Todo tipo Agregado existente terá um Repositório. De um modo geral, existe uma relação um-para-um entre um Agregado e um Repositório.### Domain Events:
- Use um evento de domínio para capturar uma ocorrência de algo que aconteceu no domínio.
- A essência de um evento de domínio é que você o usa para capturar coisas que podem desencadear uma mudança no estado do aplicativo que você está desenvolvendo. Esses objetos de evento são processados para causar alterações no sistema e armazenados para fornecer um AuditLog.
- Todo evento deve ser representado em uma ação realizada no passado:
- UserCreated
- OrderPlaced
- EmailSent
- Normalmente um Domain Event deve ser utilizado quando queremos notificar outros Bounded Contexts de uma mudança de estado.
- Components
- Event
- Handler: Executa o processamento quando um evento é chamado.
- Event Dispatcher: Responsável por armazenar e executar os handlers de um evento quando ele for disparado.
- Dinâmica
- Cria um “Event Dispatcher”
- Cria um “Event”
- Cria um “Handler” para o “Event”
- Registra o Evento, juntamente com o Handler no “Event Dispatcher”
- Agora para disparar um evento, basta executar o método “notify” do “Event Dispatcher”. Nesse momento, todos os handlers registrados no evento serão executados.### Módulos:
- Em um contexto DDD, Módulos em seu modelo servem como contêineres nomeados para classes de objetos de domínio que são altamente coesas entre si. O objetivo deve ser baixo acoplamento entre classes que estão em módulos diferentes. Como os Módulos usados no DDD não são compartimentos de armazenamento anêmicos ou genéricos, também é importante nomear adequadamente os Módulos.
- Respeitar a linguagem Universal
- Baixo acoplamento
- Um ou mais agregados devem estar juntos somente se fazem sentido.
- Organizado pelo domínio/subdomínio e não pelo tipo de objetos
- Devem respeitar a mesma divisão quando estão em camadas diferentes.### Factories:
- Desloque a responsabilidade de criar instâncias de objetos complexos e AGREGADOS para um objeto separado, que pode não ter responsabilidade no modelo de domínio, mas ainda faz parte do design do domínio. Forneça uma interface que encapsule toda a criação complexa que não exija que o cliente faça referência às classes concretas dos objetos que estão sendo instanciados. Crie Aggregates inteiros de uma única vez, reforçando suas invariantes.