Essa postagem busca exemplificar o que eu uso em uma aplicação, independente de linguagem, para monolitos é necessário algumas abstrações a mais para organização.
O principal são 3 paths
├── domain
├── ports
├── infra
Domain
Aqui fica a parte principal da aplicação
O domain possui obrigatoriamente dois outros paths
├── domain
│ ├── entities
│ ├── usecases
Entities
Representa as assinaturas de estruturas da aplicação. Aqui entram classes, dicionários, tipos, interfaces, tudo que represente um dado utilizado na aplicação.
Exemplos:
├── domain
│ ├── entities
│ │ ├── User
│ │ ├── Address
│ ├── usecases
Usecases
Dado uma entidade, é uma ação. A nomeclatura de um usecase deve
ser representada por um verbo e uma entidade
Todo usecase deve possuir a função execute
, com sua forma mais básica mas pode possuir outras funções que ainda façam sentido dado o nome do usecase
Usecases podem ter como dependência outros usecases e ports
Exemplos:
├── domain
│ ├── entities
│ │ ├── User
│ │ ├── Address
│ ├── usecases
│ │ ├── FindUser
│ │ ├── CreateUser
│ │ ├── ChangeUserStatus
Exemplos de código
changeUserStatus.to(newStatus)
findUser.byId(id)
findUser.withFilter(filterUser)
createUser.execute(user)
Ports
Todas as integrações e comunicações
O ports possui obrigatoriamente dois outros paths
├── ports
│ ├── in
│ ├── out
Ambos in
e out
podem possuir paths para cada responsabilidade, separando em ferramentas ou contextos específicos, dentro de cada contexto específico pode existir toda uma estrutura que faça sentido aquele contexto, por exemplo requisições precisam ser sanitizadas e/ou adaptadas antes de um usecase ser chamado
O arquivo dentro de port pode ser apenas uma assinatura a ser provida pela infra
In
Todo dado que entra na aplicação de alguma forma.
Receber, Ler, Consumir. Essa é a porta de entrada
Contextos específicos comuns
http
Representa requisições http recebidas pela aplicação
Exemplo:
├── ports
│ ├── in
│ │ ├── http
│ │ │ ├── UserHttp
│ │ ├── ReadUsers
│ ├── out
Nesse exemplo, UserHttp possuirá todas as requests possíveis relacionadas a usuário e ReadUsers é uma interface que será provida em algum outro lugar da aplicação (pode ser uma leitura de banco, pode ser uma integração com outro serviço)
Out
Todo o dado que sai da aplicação de alguma forma.
Escrever, Produzir, Salvar, Notificar. Essa é a porta de saída.
Contextos específicos comuns
Notifications
Eventos ou mensagens de notificação. Assim como os usecases, o nome de cada notification deve fazer sentido. Toda notification
implementa o padrão de Observer através de uma interface em comum Notification
Exemplo:
├── ports
│ ├── in
│ ├── out
│ │ ├── notifications
│ │ │ ├── OnUserSaved
│ │ ├── WriteUsers
Infra
Toda a parte de configuração da aplicação, possuind dois paths
├── infra
│ ├── config
│ ├── providers
Config
Tudo referente a configuração
Providers
Prove as implementações de assinaturas em ports
Top comments (0)