DEV Community

Allef Santana
Allef Santana

Posted on

Minhas estruturas de arquivos

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
Enter fullscreen mode Exit fullscreen mode

Domain

Aqui fica a parte principal da aplicação

O domain possui obrigatoriamente dois outros paths

├── domain
│ ├── entities
│ ├── usecases
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Exemplos de código

changeUserStatus.to(newStatus)
findUser.byId(id)
findUser.withFilter(filterUser)
createUser.execute(user)
Enter fullscreen mode Exit fullscreen mode

Ports

Todas as integrações e comunicações

O ports possui obrigatoriamente dois outros paths

├── ports
│ ├── in
│ ├── out
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Infra

Toda a parte de configuração da aplicação, possuind dois paths

├── infra
│ ├── config
│ ├── providers
Enter fullscreen mode Exit fullscreen mode

Config

Tudo referente a configuração

Providers

Prove as implementações de assinaturas em ports

Top comments (0)