<?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: Luiz Felipe Warmling Amadeu</title>
    <description>The latest articles on DEV Community by Luiz Felipe Warmling Amadeu (@amad3eu).</description>
    <link>https://dev.to/amad3eu</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%2F660585%2F809c9ec6-90a7-4cb7-9c61-c6e331ad368c.gif</url>
      <title>DEV Community: Luiz Felipe Warmling Amadeu</title>
      <link>https://dev.to/amad3eu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/amad3eu"/>
    <language>en</language>
    <item>
      <title>Os Hooks que vieram junto com o React 18</title>
      <dc:creator>Luiz Felipe Warmling Amadeu</dc:creator>
      <pubDate>Fri, 14 Oct 2022 15:26:38 +0000</pubDate>
      <link>https://dev.to/amad3eu/os-hooks-que-vieram-junto-com-o-react-18-1lhl</link>
      <guid>https://dev.to/amad3eu/os-hooks-que-vieram-junto-com-o-react-18-1lhl</guid>
      <description>&lt;p&gt;&lt;strong&gt;O que são react hooks?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Hooks são os novos padrões que foram introduzidos na versão React 16.8. Os hooks do React deram vida a esses recursos que pudemos fazer nos componentes de classe, mas desta vez nos componentes funcionais. Isso significa que essas APIs do React Hooks podem nos ajudar a interagir com os estados locais do React, os recursos do ciclo de vida e muito mais.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Os React Hooks existentes e como os usamos&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;useEffect:&lt;/strong&gt; Este hook ajuda a realizar os efeitos colaterais nos componentes funcionais, como atualizar o Dom e buscar dados. Ele aceita uma função que será executada por padrão toda vez que o componente renderizar novamente. Podemos parar esta renderização passando algumas condições no array de dependências que é o segundo argumento de useEffect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;useState:&lt;/strong&gt; Este hook ajuda a usar e atualizar variáveis ​​de estado em um componente funcional.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;useRef:&lt;/strong&gt; Este hook retorna um objeto ref mutável que contém uma propriedade .current que é usada para múltiplos propósitos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;useCallback:&lt;/strong&gt; Este hook retorna uma versão memorizada do retorno de chamada somente se as dependências foram alteradas. A memorização é uma maneira de armazenar em cache um resultado, economizando assim o uso da memória.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;useMemo:&lt;/strong&gt; Este hook recalcula o valor memoizado somente quando uma das dependências é alterada e retorna o valor memoizado. Essa também é uma das maneiras de armazenar em cache um resultado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;useContext:&lt;/strong&gt; Este hook aceitará o valor fornecido por React.createContext e. Isso só irá renderizar novamente o componente sempre que seu valor for alterado. Isso, portanto, ajuda a criar, fornecer e consumir o contexto.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;useReducer:&lt;/strong&gt; Este hook nos permite lidar com algumas manipulações e atualizações de estado complexas. Estamos muito familiarizados com o redux, este gancho é um pouco semelhante a isso. ele aceita uma função redutora e um estado inicial.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;useLayoutEffect:&lt;/strong&gt; é executado de forma síncrona após uma renderização, mas antes que a tela seja atualizada.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;useDebugValue:&lt;/strong&gt; Este hook ajuda a registrar informações importantes nas ferramentas de desenvolvimento criadas pelo React. Isso é recomendado para uso apenas para ganchos personalizados. Então agora temos um resumo dos ganchos que vieram antes do react 18.&lt;/p&gt;

&lt;p&gt;Vamos passar agora para os novos ganchos do React 18&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;useId&lt;/li&gt;
&lt;li&gt;useSyncExternalStore&lt;/li&gt;
&lt;li&gt;useDeferredValue&lt;/li&gt;
&lt;li&gt;useInsertionEffect&lt;/li&gt;
&lt;li&gt;useTransition
Agora vamos mergulhar nesses novos hooks&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;useId:&lt;/strong&gt;&lt;br&gt;
Este hook é útil onde precisamos usar alguns ids exclusivos. Dessa forma, o React provou que nos ajudará a gerar IDs exclusivos. Esses IDs exclusivos podem ser usados ​​para conteúdo renderizado pelo servidor e pelo cliente. Isso evita até mesmo incompatibilidade na renderização do lado do servidor, o que pode causar problemas.&lt;br&gt;
Outra maneira em que podemos pensar é quando criamos um formulário, podemos adicionar um sufixo/prefixo a esse id, por exemplo, id + firstName. Dessa forma, podemos ter vários ids exclusivos.&lt;/p&gt;

&lt;p&gt;Código de exemplo:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;useSyncExternalStore:&lt;/strong&gt;&lt;br&gt;
A partir do nome, este gancho esclarece que ajudará na sincronização com as fontes de dados externas. Podemos ler e assinar a partir de fontes de dados externas. Este é um gancho de biblioteca desenvolvido principalmente para os autores da biblioteca integrarem.&lt;/p&gt;

&lt;p&gt;Como usar isso? Este método aceita três argumentos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;subscribe:&lt;/strong&gt; 
É para registrar um callback que é chamado sempre que a store muda.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;getSnapshot:&lt;/strong&gt; 
Ele retorna o valor atual da store.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;getServerSnapshot:&lt;/strong&gt;
Este é um parâmetro opcional e retorna o instantâneo usado durante a renderização do servidor. Este método retorna o valor da store&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;getSnapshot&lt;/strong&gt; é usado para verificar se o valor subscrito mudou desde a última vez que foi renderizado, então o resultado precisa ser referencialmente estável. Isso significa que ele precisa ser um valor imutável, como uma string ou número, ou precisa ser um objeto armazenado em cache/memoizado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;useDeferredValue:&lt;/strong&gt;&lt;br&gt;
O hook rastreia um valor. Se o valor mudar de um valor antigo para um novo, o gancho pode retornar qualquer um dos valores. O benefício de usar &lt;code&gt;useDeferredValue&lt;/code&gt; é que o React irá trabalhar na atualização assim que outro trabalho terminar&lt;/p&gt;

&lt;p&gt;const [searchInput, setSearchInput] = useState(“”);&lt;br&gt;
const searchInputDeferred = useDeferredValue(searchInput);&lt;br&gt;
Aqui é criada uma versão adiada da entrada de pesquisa.&lt;/p&gt;

&lt;p&gt;Veja este exemplo:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Amad3eu"&gt;
        Amad3eu
      &lt;/a&gt; / &lt;a href="https://github.com/Amad3eu/Example_UseDeferredValue"&gt;
        Example_UseDeferredValue
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Um exemplo simples de como useDeferredValue pode melhorar a experiência do usuário com a desaceleração intencional da interface do usuário.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h1&gt;
useDeferredValue example&lt;/h1&gt;
&lt;p&gt;A simple example of how the &lt;code&gt;useDeferredValue&lt;/code&gt; hook can be used to improve the experience of the UI on slower devices.&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Amad3eu/Example_UseDeferredValue"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;&lt;strong&gt;useInsertionEffect:&lt;/strong&gt;&lt;br&gt;
Este hook deve ser usado por autores de bibliotecas css-in-js. Porém esse hook é limitado em escopo e não tem acesso a refs. O gancho é acionado antes de todas as atualizações do DOM. Para desenvolvedores, &lt;strong&gt;useEffect&lt;/strong&gt; ou &lt;strong&gt;useLayoutEffect&lt;/strong&gt; devem ser preferidos. Todos nós sabemos sobre o useLayoutEffect que é acionado antes de um useEffect que useInsertionEffect seja executado antes mesmo de useLayoutEffect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;useTransition&lt;/strong&gt;&lt;br&gt;
Como o nome indica, este hook ajuda nas atualizações de transição.&lt;/p&gt;

&lt;p&gt;As atualizações de estado do React são basicamente de dois tipos. Uma delas são as atualizações de transição que são responsáveis ​​pela transformação da interface do usuário. A outra é a deflexão que vemos como clicar, arrastar etc. O hook **useTransition **nos permite especificar algumas atualizações de estado como não tão importantes. Com isso, podemos dizer ao React para priorizar algumas atualizações mais baixas para atualizações mais priorizadas, e o aplicativo parece muito mais fácil de usar.&lt;/p&gt;

&lt;p&gt;const [isPending, startTransition] = useTransition();- &lt;code&gt;isPending&lt;/code&gt; é um booleano. É o React nos dizendo se essa transição está em andamento no momento. - &lt;code&gt;startTransition&lt;/code&gt; é uma função. Vamos usá-lo para dizer ao React &lt;em&gt;switch&lt;/em&gt; atualização de estado que queremos adiar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codesandbox.io/s/elastic-vaughan-ykzsi0?file=/src/index.js"&gt;Exemplo de transição de uso&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Então, finalmente, temos uma visão geral desses recém-introduzidos React Hooks, acredite, esses hooks vão nos ajudar muito a aumentar o desempenho, ajudar no cliente eficiente, bem como na renderização do lado do servidor e nos dar mais controle sobre o React como um todo&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Vamos começar a usá-los e ver a mágica. 🧙‍♂️🧙‍♂️🧙‍♂️&lt;/strong&gt;
&lt;/h3&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>A importância da Clean Architecture</title>
      <dc:creator>Luiz Felipe Warmling Amadeu</dc:creator>
      <pubDate>Sun, 04 Sep 2022 20:45:19 +0000</pubDate>
      <link>https://dev.to/amad3eu/a-importancia-da-clean-architecture-2i94</link>
      <guid>https://dev.to/amad3eu/a-importancia-da-clean-architecture-2i94</guid>
      <description>&lt;p&gt;Ultimamente estamos ouvindo falar bastante sobre termos como "Clean Architecture", "Hexagonal Architecture", "SOLID", "DRY", "DDD", etc. Todos eles são princípios, práticas ou abordagens no mundo de desenvolvimento de software que, em essência, convergem para o objetivo de tornar o software mais robusto, escalável e flexível, deixando-o tolerante a mudanças, facilitando a implementação de novos requisitos para a evolução e manutenção do sistema.&lt;br&gt;
Quando se fala em &lt;strong&gt;Clean Architecture&lt;/strong&gt; temos algumas características como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Arquitetura FOCADA nas regras de negócio: suas regras não devem conhecer o "mundo lá fora" (Frameworks, Ferramentas, Tecnologias, etc).&lt;/li&gt;
&lt;li&gt;Inversão de dependências: Por exemplo, seu banco de dados deve depender das suas regras, e não suas regras do seu banco. Sua UI? Mesma coisa!&lt;/li&gt;
&lt;li&gt;A melhor decisão é a que você pode tomar depois? Isso não é preguiça, é arquitetura incremental.&lt;/li&gt;
&lt;li&gt;Regras de negócio devem ser 100% TESTÁVEIS e INDEPENDENTES!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O diagrama que utilizei na parte superior deste post, segundo Uncle Bob, é uma tentativa de integrar todos esses conceitos e boas práticas arquiteturas em uma única ideia.&lt;br&gt;
Um sistema bem estruturado possui baixo acoplamento e alta coesão, portanto, uma das soluções encontradas é a divisão do sistema em camadas.&lt;br&gt;
Surge então a Regra de Dependência que, acordo com a figura, nos mostra que a seta apenas segue para dentro, ou seja, a camada mais externa visualiza e utiliza a mais interna. O inverso não pode acontecer. Isso não faz com que o software fique dependente ou restritivo, muito pelo contrário, a aplicação dessa regra diminui as limitações do código o tornando organizado e acessível. Não ultrapassar essas barreiras é essencial para otimizar o funcionamento do sistema.&lt;/p&gt;

&lt;h2&gt;
  
  
  Entities
&lt;/h2&gt;

&lt;p&gt;Na camada de entidades, deve ser alocada a lógica de negócio e as regras de alto nível. Essa camada pode ser usada por todas as outras, tendo em vista que possui regras mais gerais do software, ou seja, as entidades são usadas pelas classes mais externas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Cases
&lt;/h2&gt;

&lt;p&gt;Neste nível do software, cabe a aplicação das regras de negócio para cada caso. Estas são mais específicas e dizem respeito a validações por exemplo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Interface Adapters
&lt;/h2&gt;

&lt;p&gt;Esta camada tem uma função bem específica como todas as outras. Função esta que é converter as informações vindas das camadas internas (entidades+casos de uso) para o reconhecimento dos elementos pertencentes no próximo nível.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frameworks and Drivers
&lt;/h2&gt;

&lt;p&gt;Composta pelos elementos mais externos: Frameworks, Banco de dados, bibliotecas e derivações.&lt;/p&gt;

&lt;h2&gt;
  
  
  Aplicação prática
&lt;/h2&gt;

&lt;p&gt;Para ilustrar como podemos aplicar o conceito de Clean Architecture na prática, trago aqui uma situação onde temos um projeto de API de cadastro utilizando a liguangem NodeJs e algumas bibliotecas como o Express, MongoDB, BCrypt para criptografia de senha e Validator para validar o e-mail recebido.&lt;br&gt;
Sei que esse exemplo é de baixa complexidade, mas acredito que é suficiente para entender a abordagem proposta nesse post.&lt;br&gt;
A imagem abaixo talvez represente a forma como geralmente estruturamos esse tipo de projeto quando não se conhece a abordagem arquitetural que estamos discutindo aqui.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--osMizsjk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l0crtucrek3w0jujsoii.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--osMizsjk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l0crtucrek3w0jujsoii.png" alt=" Diagrama e foto de arquivos no VsCode demonstrando ao conteúdo " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nesse cenário temos componentes como o SignUpController e SignUpRouter acloplados a biblioteca de terceiros, além de termos componentes que possuem muitas "responsabilidades". Se precisarmos em algum momento trocar o Express por outro framework, será necessário alterar todos os controllers.&lt;/p&gt;

&lt;p&gt;Então para dar início a uma transformação na arquitetura do nosso sistema podemos iniciar focando em desacoplar nossos controllers do Express. Esse tipo de decisão em um cenário ideal deveria ser uma tarefa muito fácil. Mas aqui temos que essa biblioteca praticamente "toma conta" do sistema.&lt;/p&gt;

&lt;p&gt;O SignUpController aponta para o Express por isso o primeiro passo seria usar o padrão de inversão de dependência (dependency inversion) para fazer com que o Express olhe para nossos controllers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zwePkNBj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ibswjylsjld0fjzdx3e1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zwePkNBj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ibswjylsjld0fjzdx3e1.png" alt=" Diagrama demonstrando ao conteúdo " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para isso, podemos criar um adapter entre os dois que terá a tarefa de converter as interfaces do controller para a realidade do Express. Uma das particularidades do Express é que ele espera receber o (req, res) como parâmetros nas rotas definidas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VGAd4Pyx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/acqyb8yu4czv3jbzzfrh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VGAd4Pyx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/acqyb8yu4czv3jbzzfrh.png" alt="  " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Também não podemos permitir que o adapter dependa diretamente do SignUpController. Devemos fazer com que ele possa adaptar qualquer controlador, assim, criamos uma camada Presentation e dentro dela uma interface Controller, que irá servir como um limite desta camada para fazer a inversão de dependência. O adapter precisa de qualquer classe que utilize a interface.&lt;/p&gt;

&lt;p&gt;Com isso a dependência inverteu. Se eu precisar trocar, só altero o adapter.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YHolH0bl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9wcc5orjoyl6i0yp37em.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YHolH0bl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9wcc5orjoyl6i0yp37em.png" alt=" Diagrama demonstrando ao conteúdo " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Seguindo em frente, precisamos agora desacoplar a biblioteca para validar e-mail para que nosso presentation layer não dependa de um componente externo. Criamos um EmailValidatorAdapter semelhante ao adapter criado anteriormente.&lt;/p&gt;

&lt;p&gt;Assim, em vez de o SignUpController depender diretamente desse adapter, definimos, ainda na camada de apresentação, uma nova interface EmailValidator que diz o que esse componente deve fazer e "alguém" de fora implementa a interface definida. Dessa forma desacoplamos e se outros controladores precisarem usar esse validador poderemos facilmente reutilizar o componente. Ainda temos o benefício de, se um dia optarmos por substituir essa biblioteca por uma regex por exemplo, alteraremos apenas um componente.&lt;/p&gt;

&lt;p&gt;Podemos dizer que é nossa camada &lt;strong&gt;Utils&lt;/strong&gt; que é mais genérica irá conter coisas que podem ser utilizadas em qualquer lugar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--POz8HzRz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ao0t9i0fel03hguaid24.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--POz8HzRz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ao0t9i0fel03hguaid24.png" alt=" Diagrama demonstrando ao conteúdo " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Surge, então, a necessidade de uma camada de negócio que diga o que precisamos fazer. Pois para realizar um cadastro, precisamos salvar os dados no banco de dados, mas antes disso, queremos criptografar a senha do usuário.&lt;/p&gt;

&lt;p&gt;Criamos então uma interface AddAccount que nada mais é do que a representação de uma camada de negócio da aplicação, a camada Domain. Essa camada não terá implementação, mas apenas protocolos que dizem o que nossa regra de negócio deve fazer.&lt;/p&gt;

&lt;p&gt;Com isso, o SignUpController irá precisar de alguém que implemente essa interface para criar uma conta de usuário. Não importa se a implementação será com banco de dados, cache, ou dados "mockados", o que importa é que a implementação respeite a interface definida.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1arIL2sa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bworaorwojtbn6qevi31.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1arIL2sa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bworaorwojtbn6qevi31.png" alt=" Diagrama demonstrando ao conteúdo " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Assumindo que queremos a implementação da regra de negócio voltada para armazenamento em banco de dados, criaremos a Data layer que terá o componente DBA Account.&lt;br&gt;
Esse sim irá utilizar o BCrypt para fazer a criptografia da senha do usuário. Mas não queremos acoplá-los diretamente. Assim como antes, criaremos o BCrypt Adapter para isolar os nossos componentes do BCrypt que uma biblioteca externa.&lt;br&gt;
Ele ficará dentro da Infra layer, camada que terá implementações de interface voltadas para frameworks. E agora para realizar a inversão de dependência, criamos a interface Encrypter ainda na Data layer já que o DBA Account precisa de alguém que saiba fazer criptografia e não ele mesmo saber como faz.&lt;br&gt;
Com isso a dependência inverteu novamente. O Infra layer que aponta para o Data layer e não o Data layer apontando para o Infra.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--S76Jw3d9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8lufnnps8pbeufx14ru2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--S76Jw3d9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8lufnnps8pbeufx14ru2.png" alt="Diagrama demonstrando ao conteúdo" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para finalizar temos o a dependência com o MongoDb. Criaremos o componente AddAccountMongo Repository que sabe usar o mongo e criaremos também a interface AddUser Repo pois outros componentes podem precisar de "alguém" que saiba inserir no banco de dados, não importa qual.&lt;br&gt;
Inversão de dependência feita mais uma vez.&lt;br&gt;
Com isso as bibliotecas de terceiros estão cada vez mais isoladas, cada vez mais na camada mais "fora" da nossa arquitetura. Se futuramente quisermos trocar MongoDB, vamos alterar apenas um componente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tVrFgfXO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/owsyd8pjeh5l73mf2w54.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tVrFgfXO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/owsyd8pjeh5l73mf2w54.png" alt=" Diagrama demonstrando ao conteúdo " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Realizamos até aqui transformações, com a ajuda do padrão de projeto Adapter, que removem o acoplamento entre as camadas. Mas para conseguir ter uma solução completa e desacoplar nossas camadas precisamos acoplar uma delas, e esta será a Main layer.&lt;br&gt;
Ela será responsável por criar instâncias de todos os objetos. Exemplo: Para criar a rota de signup precisamos do SignUpController, que por sua vez precisa de alguém que implemente a interface AddAccount. Mas que sua implementação não será instanciada no controller.&lt;br&gt;
"Alguém" irá criar essa instância e injetará no controller. O Main layer fará a composição desses objetos através de outro design pattern, o Composite, e toda composição será feita em um lugar só.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9hVe1QS7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/71nt0iz6w9h56bofa6kg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9hVe1QS7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/71nt0iz6w9h56bofa6kg.png" alt=" Diagrama demonstrando ao conteúdo " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Abaixo está o desenho final desse exemplo, destacando com cores para melhor visualização das camadas. Acredito que tenhamos chegado bem próximo de um desenho arquitetural bem estruturado com baixo acoplamento e alta coesão. Observa-se que as dependências externas estão sempre nas "pontas" e facilmente podemos troca-las sem afetar o resto do sistema.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iQieYsPG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0kk9kxn821ovustmoqs7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iQieYsPG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0kk9kxn821ovustmoqs7.png" alt=" Diagrama demonstrando ao conteúdo " width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Considerações Finais
&lt;/h2&gt;

&lt;p&gt;As ideias propostas por Uncle Bob, padronizam o desenvolvimento de software moderno.&lt;/p&gt;

&lt;p&gt;Nota-se que os métodos sugeridos, se aplicados de maneira correta, organizam o código, facilita o trabalho em equipe, e entre outros benefícios. Isso não quer dizer que o Clean Architecture é uma "bala de prata" para desenvolver softwares. Ressalto aqui que sua aplicação deve ser avaliada de acordo com o tipo de projeto e suas particularidades.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://thewisedev.com.br/"&gt;Otavio Lemos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rmanguinho/clean-react"&gt;Rodrigo Manguinho em Clean React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;MARTIN, Robert C. Clean Architecture: A Craftsman’s Guide to Software Structure and Design. 1st. ed. USA: Prentice Hall Press, 2017. ISBN 0134494164.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
      <category>cleancode</category>
      <category>architecture</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
