<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Allef Santana</title>
    <description>The latest articles on DEV Community by Allef Santana (@garug).</description>
    <link>https://dev.to/garug</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F784062%2Fc95aab43-0e28-4e6a-8f07-5de4bbe0fc6e.jpeg</url>
      <title>DEV Community: Allef Santana</title>
      <link>https://dev.to/garug</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/garug"/>
    <language>en</language>
    <item>
      <title>Minhas estruturas de arquivos</title>
      <dc:creator>Allef Santana</dc:creator>
      <pubDate>Fri, 05 Jan 2024 18:36:18 +0000</pubDate>
      <link>https://dev.to/garug/minhas-estruturas-de-arquivos-3h6l</link>
      <guid>https://dev.to/garug/minhas-estruturas-de-arquivos-3h6l</guid>
      <description>&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;O principal são 3 paths&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;├── domain
├── ports
├── infra
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Domain
&lt;/h2&gt;

&lt;p&gt;Aqui fica a parte principal da aplicação&lt;/p&gt;

&lt;p&gt;O domain possui obrigatoriamente dois outros paths&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;├── domain
│ ├── entities
│ ├── usecases
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Entities
&lt;/h3&gt;

&lt;p&gt;Representa as assinaturas de estruturas da aplicação. Aqui entram classes, dicionários, tipos, interfaces, tudo que represente um dado utilizado na aplicação.&lt;/p&gt;

&lt;p&gt;Exemplos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;├── domain
│ ├── entities
│ │ ├── User
│ │ ├── Address
│ ├── usecases
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Usecases
&lt;/h3&gt;

&lt;p&gt;Dado uma entidade, é uma ação. A nomeclatura de um usecase deve &lt;br&gt;
ser representada por um verbo e uma entidade&lt;/p&gt;

&lt;p&gt;Todo usecase deve possuir a função &lt;code&gt;execute&lt;/code&gt;, com sua forma mais básica mas pode possuir outras funções que ainda façam sentido dado o nome do usecase&lt;/p&gt;

&lt;p&gt;Usecases podem ter como dependência outros usecases e ports&lt;/p&gt;

&lt;p&gt;Exemplos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;├── domain
│ ├── entities
│ │ ├── User
│ │ ├── Address
│ ├── usecases
│ │ ├── FindUser
│ │ ├── CreateUser
│ │ ├── ChangeUserStatus
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemplos de código&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;changeUserStatus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;newStatus&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;findUser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;byId&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;findUser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;withFilter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filterUser&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;createUser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Ports
&lt;/h2&gt;

&lt;p&gt;Todas as integrações e comunicações&lt;/p&gt;

&lt;p&gt;O ports possui obrigatoriamente dois outros paths&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;├── ports
│ ├── &lt;span class="k"&gt;in&lt;/span&gt;
│ ├── out
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ambos &lt;code&gt;in&lt;/code&gt; e &lt;code&gt;out&lt;/code&gt; 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 &lt;strong&gt;sanitizadas&lt;/strong&gt; e/ou &lt;strong&gt;adaptadas&lt;/strong&gt; antes de um usecase ser chamado&lt;/p&gt;

&lt;p&gt;O arquivo dentro de port pode ser apenas uma assinatura a ser provida pela infra&lt;/p&gt;

&lt;h3&gt;
  
  
  In
&lt;/h3&gt;

&lt;p&gt;Todo dado que entra na aplicação de alguma forma.&lt;/p&gt;

&lt;p&gt;Receber, Ler, Consumir. Essa é a porta de entrada&lt;/p&gt;

&lt;h4&gt;
  
  
  Contextos específicos comuns
&lt;/h4&gt;

&lt;h5&gt;
  
  
  http
&lt;/h5&gt;

&lt;p&gt;Representa requisições http recebidas pela aplicação&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;├── ports
│ ├── &lt;span class="k"&gt;in&lt;/span&gt;
│ │ ├── http
│ │ │ ├── UserHttp
│ │ ├── ReadUsers
│ ├── out
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;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)&lt;/p&gt;

&lt;h3&gt;
  
  
  Out
&lt;/h3&gt;

&lt;p&gt;Todo o dado que sai da aplicação de alguma forma.&lt;/p&gt;

&lt;p&gt;Escrever, Produzir, Salvar, Notificar. Essa é a porta de saída.&lt;/p&gt;

&lt;h4&gt;
  
  
  Contextos específicos comuns
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Notifications
&lt;/h5&gt;

&lt;p&gt;Eventos ou mensagens de notificação. Assim como os usecases, o nome de cada notification deve fazer sentido. Toda &lt;code&gt;notification&lt;/code&gt; implementa o padrão de &lt;a href="https://en.wikipedia.org/wiki/Observer_pattern#:~:text=Article%20Talk,calling%20one%20of%20their%20methods."&gt;Observer&lt;/a&gt; através de uma interface em comum &lt;code&gt;Notification&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;├── ports
│ ├── &lt;span class="k"&gt;in&lt;/span&gt;
│ ├── out
│ │ ├── notifications
│ │ │ ├── OnUserSaved
│ │ ├── WriteUsers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Infra
&lt;/h2&gt;

&lt;p&gt;Toda a parte de configuração da aplicação, possuind dois paths&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;├── infra
│ ├── config
│ ├── providers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Config
&lt;/h3&gt;

&lt;p&gt;Tudo referente a configuração&lt;/p&gt;

&lt;h3&gt;
  
  
  Providers
&lt;/h3&gt;

&lt;p&gt;Prove as implementações de assinaturas em &lt;code&gt;ports&lt;/code&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
    </item>
  </channel>
</rss>
