- Chamadas de enterprise Business Rules -> Entidades. São o inicio do desenvolvimento e é a camada central que engloba as regras cruciais de negócios, ou seja, são objetos que organizam essas regras permitindo que a gente acesse e processe essas informações.
- São identificáveis por uma informação única dentro de nosso sistema (id)
- É diferente de um padrão de entidade criado em ORMs, pois possuem expressividades dentro da aplicação pois possuem regras de negocios e são agnosticas a frameworks e a linguagens de programação.
- Possuem regras de negócios mais puristas.
- É considerado o coração da aplicação, pois provê os recursos sobre os a regra da aplicação é regida.
- Centralizam regras de negócios de acordo com a necessidade da aplicação como apontar operações que podem envolver banco de dados, ou realizar publicação em serviços de mensagerias, por exemplo...
- Se integram com as regras construídas na entidade da aplicação.
- Acesssam os casos de uso
- São pessoas que contém o conhecimento da regra de negócio, ou seja, são pessoas que detem o conhecimento de como a aplicação deve funcionar de acordo com seu dia a dia de trabalho. Ex: Em um setor administrativo temos rotinas, passo a passo relacionado gestão e arquivamento de documentos.
- As alterações em camadas mais externas não devem interferir nas camadas mais internas.
- As camadas precisam do que chamamos de limites arquiteturais.
- Ou seja, a camada de Entidade nunca deverá ser alterada
- A camada de useCase tende a mudar muito pouco relacionado as camadas mais externas.
- Linguagem Ubiqua -> é uma linguagem descritiva sobre as representações repassadas pelo domain expect
- Livre-se do FDD (Desenvolvimento orientado a framework)
- Expressividade é o mesmo que regra de negocios
- Padrão de pastas @seedwork representa uma pasta onde são criados objetos de valores, ou seja recursos que podem ser compartilhados entre os outros modulos da aplicação em uma especie de shared. A nomenclatura "@" diz que essa pasta sempre aparecerá na primeira posição no ordenamento de pastas.
- Objeto de valor nao possui identidade própria.
- Admin:
- Criar categoria
- Atualizar categoria
- Excluir categoria
- Consultar uma categoria
- Consultar categorias
-
Entity Category
- Category: id uuid
- name string
- description string
- is_active boolean
- created_at date
-
Category : Create()
-
Category : Update()
-
Category : Activate()
-
Category : Deactivate()
-
Category : delete()
Obs:
- trabalhar com sets em excesso pode tirar a expressividade da entidade tornando-a anemica.
- é importante pensar nas operações de forma agnostica a qualquer recurso externo. Uma boa arquitetura permite adiar decisões.
- Quando se constroi uma entidade com esses conceitos de arquitetura as props da entidade nem sempre serão obrigatórias. Ex: Imagine que na nossa entidade com name, description, is_active, created_at, description seja facultativo... obrigatóriamente todas as props seguintes tambem precisam ser facultativas, pois dentro de metodos e construtores não é possível que uma prop da metade do ordenamento seja opcional. Props opcionais devem ficar por ultimo nas suas declarações.
- Com isso utilizamos interfaces que permitem flexibilizar esse manuzeio
Clean Architecture: Criado por Uncle Bob Robert C Martin em 2012
Ponto focal de arquitetura limpa, consiste em
- Proteger o núcleo central e dominios da aplicação
- Cria contratos (intefaces) entre as camadas
- Baixo acoplamento entre as camadas
- Orientada a casos de uso (são intensões do usuario para com o sistema)
- Percepção sobre regras de negócios
Key Option Open
- Criar limites arquiteturais muito claros acaba por criar partes que não dependam diretamente uma da outr além de nos permitir postergar decisões.
Pontos importantes sobre arquitetura:
- Formato que o Software terá - Ligado ao design de software
- Divisão de componentes - Pensar a nível de arquitetura quais componentes ele terá
- Comunicação entre esses componentes
- Uma boa arquitetura vai facilitar o processo de desenvolvimento, deploy, operação e manutenção.
Regras vs Detalhes
- Regras de negocio trazem o real valor para o sistema
- Detalhes ajudam a suportar as regras
- Detalhes não devem imapctar nas regras de negócio
- Frameworks, banco de dados, apis, não devem imapactar as regras
- O Core da sua aplicação é o mais importante
DDD - Atacar a complexidade no coração do software
A importancia de casos de uso (UseCases)
- Representam uma intenção - Cada ação é uma intenção e cada intenção e um caso de uso
- Clareza de cada comportamento do software
- Detalhes não devem impactar nas regras de negocio
- Frameworks, banco de dados, apis não devem impactar nas regras de negócios
UseCases - SRP (Single responsability Principle)
- Temos a tendencia de "reaproveitar" use cases por serem muito parecidos.
- Ex: Alterar vs Inserir. Ambos consultam se o registro existe, persistem dados. MAS, são useCases diferentes. Porque?
- SRP - Mudam por razões diferentes Quando a alteração naquele código é diferente, muda quando voce faz alterações por razões diferentes significa que o SRP está sendo ferido, cada use cases apesar de parecido tem razões de mudanças diferentes.
Duplicação real vs Duplicação acidental
- Falsas duplicações nos faz perceber que conforme o sistema vai mudando suas etapas de codigo andam por caminhos diferentes
Use Cases contam historias
- Muitas vezes uma intenção pode soar muito estranho
- use case é a concretização de uma automatização, visto que um sistema é automatização de tarefas
- O use case é o orquestrador do fluxo dentro da aplicação Ex: Simulação de caso de uso (Emprestimo)- regra de negocio que é chamada a partir do use case 1 - Aceita e valida o nome 2 - Valida endereço, aniversário, DL, SSN... 3 - Capta o credit score 4 - Valida se o credit score é < 500, se não ela nega 5 - Se não ele cria a estimativa de emprestimo.
Limites arquiteturais:
- Divisão de componentes e estabilização de contratos Tudo que nao impacta diretamente nas regras de negocio deve estar em um limite arquitetural diferente. Ex: Não será o Frontend, banco de dados que mudarão as regras da aplicação.
Business Rules Layer | | implementação | Database interface (Abstração) | | implementação | Database Access ------------> Database
A camanda de negócios inversamente chama a camada de regras de negócios Nunca a camada de regras de negocios deve chamar a camada que acessa banco de dados
Input vs Output
- Tudo se resume a um input que retorna um output
- Ex: Criar um pedido (dados do pedido = input) Pedido criado (dados de retorno do pedido)
- Simplifique seu raciocinio ao criar um software sempre pensando em Input e Output
- Inputs geralmente vem de qualquer lugar, porém no fim do dia sempre vai ser um input, da mesma forma ocorre com o Output
DTO - (Data Transfer Objct)
- Trafegar os dados entre os limites arquiteturais Ex: Trafega os dados entre as camadas criando um Objeto que é utilizado para trafegar esses dados
- Objeto anemico, não possui comportamento livre de regras
- Contem dados (Inputs e Outputs) =====> Controller =====> useCase useCase ======> Controller
- Outro ponto importante é que cada intensão do sistema muitas vezes precisa de DTOs diferentes Ex: Imagine que queremos criar uma categoria, criamos um DTO onde precisamos ter um Objeto com Atributos que retorne esse fluxo
- Para alterar dados devemos criar um novo DTO que vai tratar os dados especificos para alteração
- São diferentes pois cada DTO segue um caminho diferente
Ex: DTO input - Request
- API -> CONTROLLER -> USE CASE -> ENTITY O fluxo de devolução da informação também funciona via DTO
- Controller cria um DTO com os dados recebidos, cria um DTO para output e retorna para o controller
Presenters
- Objetos de transformação
- Adequa o DTO de output no formato correto para entregar o resultado
- Lembrando: Um sistema por ter diversos formatos de entrega, ex: XML, JSON, Protobuf, GraphQL, CLI... Ex: Criação de um DTO que será trafegado input = new CategoryInputDTO("name"); output = CreateCategoryUseCase(input); -> A partir daqui estamos trafegando dados de uma camada para outra jsonResult = CategoryPresenter(output).toJson(); -> Convertemos o output para um JSON, mas poderia ser qualquer coisa
Entidades - Entities
- Entities da Clean Architecture !== Entities do DDD
- No DDD são Camadas de agregado, no Clean Arch é um conceito de camada com regras de negocios
- Elas se aplicam em qualquer situação pois são o core da aplicação com regras de negocios globais
- Não há definição explicita de como criar as entities
- Normalmente utilzamos táticas do DDD
- Entities = Agregados + Domain Services
- useCase pode varia com o fluxo / entity tem suas regra solidificadas