Minhas estruturas de arquivos
Tags: architecture
Published: 2024-01-05 18:36:18

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
```bash
├── domain
├── ports
├── infra
```

## Domain
Aqui fica a parte principal da aplicação

O domain possui obrigatoriamente dois outros paths
```bash
├── 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:
```bash
├── 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:
```bash
├── domain
│ ├── entities
│ │ ├── User
│ │ ├── Address
│ ├── usecases
│ │ ├── FindUser
│ │ ├── CreateUser
│ │ ├── ChangeUserStatus
```

Exemplos de código
```java
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
```bash
├── 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:
```bash
├── 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](https://en.wikipedia.org/wiki/Observer_pattern#:~:text=Article%20Talk,calling%20one%20of%20their%20methods.) através de uma interface em comum `Notification`

Exemplo:
```bash
├── ports
│ ├── in
│ ├── out
│ │ ├── notifications
│ │ │ ├── OnUserSaved
│ │ ├── WriteUsers
```


## Infra
Toda a parte de configuração da aplicação, possuind dois paths
```bash
├── infra
│ ├── config
│ ├── providers
```

### Config
Tudo referente a configuração

### Providers
Prove as implementações de assinaturas em `ports`