<?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: Roberto Costa</title>
    <description>The latest articles on DEV Community by Roberto Costa (@robertheory).</description>
    <link>https://dev.to/robertheory</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%2F468545%2Fdd95e7ce-1a8a-4a66-b3e3-bf2bfd655068.jpeg</url>
      <title>DEV Community: Roberto Costa</title>
      <link>https://dev.to/robertheory</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/robertheory"/>
    <language>en</language>
    <item>
      <title>Core Web Vitals: UX além da interface</title>
      <dc:creator>Roberto Costa</dc:creator>
      <pubDate>Thu, 04 Apr 2024 01:22:47 +0000</pubDate>
      <link>https://dev.to/techinrio/core-web-vitals-ux-alem-da-interface-410m</link>
      <guid>https://dev.to/techinrio/core-web-vitals-ux-alem-da-interface-410m</guid>
      <description>&lt;p&gt;Na web a experiência do usuário vai além da interface: tempo de carregamento, interatividade e estabilidade são alguns dos pilares que podem definir seu sucesso ou ruína!&lt;/p&gt;

&lt;p&gt;Entenda nesse artigo como utilizar uma das melhores ferramentas para análise da experiência de usuários do mundo real: Core Web Vitals!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Introdução&lt;/li&gt;
&lt;li&gt;
Entendendo Core Web Vitals

&lt;ul&gt;
&lt;li&gt;Largest Contentful Paint (LCP) - Maior exibição de conteúdo&lt;/li&gt;
&lt;li&gt;Interaction to Next Paint (INP) - Interação com a próxima exibição&lt;/li&gt;
&lt;li&gt;Cumulative Layout Shift (CLS) - Mudança de layout cumulativa&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Usando o Lighthouse no seu projeto&lt;/li&gt;

&lt;li&gt;O Core Web Vitals está em constante evolução&lt;/li&gt;

&lt;li&gt;Conclusão&lt;/li&gt;

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

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Introdução &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Fazer um site bonito é bem legal, mas esse esforço pode ser jogado no lixo se a tela demorar muito para carregar ou ficar travando.&lt;/p&gt;

&lt;p&gt;Pode parecer óbvio mas conforme temos a necessidade de adicionar mais funcionalidades na nossa aplicação/site, começamos a conviver com o pensamento de "trade offs":&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Vale a pena meu site demorar 800 milissegundos a mais para carregar para que eu disponibilize um chatbot?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vale a pena que a aplicação fique congelada por 1 segundo para que eu possa sincronizar um montão de dados sem que o usuário interaja com ela?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E mesmo assim isso são casos onde você tem uma necessidade específica e precisa ponderar sobre essas trocas, mas o cenário mais comum é outro:&lt;/p&gt;

&lt;p&gt;As pessoas simplesmente saem desenvolvendo e se deparam com o monstro que criaram:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Um projeto carregando muito JavaScript;&lt;/li&gt;
&lt;li&gt;Alguma rotina causando vazamento de memória;&lt;/li&gt;
&lt;li&gt;Código não utilizado sendo carregado e atrasando o carregamento da página;&lt;/li&gt;
&lt;li&gt;Imagens enormes não otimizadas demorando para carregar.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;É muito fácil criar esses monstros no dia a dia, mas antes de entender como podemos evitar, vamos entender como fazemos para detectar esses problemas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Entendendo Core Web Vitals &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;De acordo com o artigo &lt;a href="https://web.dev/articles/vitals?hl=pt-br" rel="noopener noreferrer"&gt;Web Vitals&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;As métricas Web Vitals são uma iniciativa do Google para fornecer orientações unificadas para indicadores de qualidade da página da Web que são essenciais para oferecer uma ótima experiência do usuário na Web. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Contudo existe um subconjunto muito mais crítico para a experiência do usuário que se resume em 3 métricas:&lt;/p&gt;

&lt;h3&gt;
  
  
  Largest Contentful Paint (LCP) - Maior exibição de conteúdo &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;A LCP informa o tempo de renderização da maior imagem ou bloco de texto visível na janela de visualização em relação ao momento em que o usuário navegou pela primeira vez à página. Para oferecer uma boa experiência ao usuário, a LCP precisa ocorrer em até 2,5 segundos após o início do carregamento da página.&lt;/p&gt;

&lt;h3&gt;
  
  
  Interaction to Next Paint (INP) - Interação com a próxima exibição &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;A INP observa a latência de todas as interações de clique, toque e teclado com uma página durante toda a vida útil e informa a duração mais longa, ignorando as exceções. Um INP baixo significa que a página é capaz de responder rapidamente à grande maioria das interações do usuário de maneira consistente. Para oferecer uma boa experiência do usuário, as páginas precisam ter um INP de 200 milissegundos ou menos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cumulative Layout Shift (CLS) - Mudança de layout cumulativa &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;A CLS é uma medida do maior valor de pontuações de troca de layout para cada mudança inesperada que ocorre durante a vida útil de uma página. Uma mudança de layout ocorre sempre que um elemento visível muda de posição de um frame renderizado para o próximo. Para oferecer uma boa experiência do usuário, é necessário manter um CLS de 0.1. ou menos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb3ujw8m122elm4hcwy8u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb3ujw8m122elm4hcwy8u.png" alt="Core Web Vitals" width="750" height="230"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;É muito fácil testar o desempenho de um site nestas métricas, podemos tanto utilizar o &lt;a href="https://pagespeed.web.dev/" rel="noopener noreferrer"&gt;PageSpeed Insights&lt;/a&gt; quanto a ferramenta &lt;a href="https://developer.chrome.com/docs/lighthouse/overview" rel="noopener noreferrer"&gt;Lighthouse&lt;/a&gt; que já vem embutida no navegador Google Chrome.&lt;/p&gt;

&lt;p&gt;Pegue qualquer site, até este mesmo onde você está lendo e use uma destas ferramentas.&lt;/p&gt;

&lt;p&gt;Seja pelo PageSpeed Insights ou pelo Lighthouse, ao analizar a página você terá um relatório parecido com estes:&lt;/p&gt;

&lt;h4&gt;
  
  
  Relatório do PageSpeed Insights
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fczhv4fz8cdjojcfhbo5l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fczhv4fz8cdjojcfhbo5l.png" alt="PageSpeed Insights Report" width="800" height="558"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Relatório do Lighthouse
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F325ju4136j275a9slpfs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F325ju4136j275a9slpfs.png" alt="Lighthouse Report" width="800" height="804"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Usando o Lighthouse no seu projeto &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Particularmente gosto mais de utilizar o Lighthouse pois é possível usá-lo no seu projeto como uma dependencia e integrar com a sua sua esteira de entrega de software.&lt;/p&gt;

&lt;p&gt;Dessa forma podemos criar alertas automatizados para nos avisar caso alguma das métricas venha a ser violada ou passe dos valores que você estipular.&lt;/p&gt;

&lt;p&gt;Lighthouse no NPM: &lt;a href="https://www.npmjs.com/package/lighthouse" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/lighthouse&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por padrão ele analiza apenas a página que você apontou no seu site, mas é possível realizar automações, com o &lt;a href="https://pptr.dev/" rel="noopener noreferrer"&gt;Puppeteer&lt;/a&gt; por exemplo, para simular a navegação de um usuário e extrair um relatório deste fluxo.&lt;/p&gt;

&lt;p&gt;Ainda nesta utilidade, você pode usar uma ferramenta de dentro do DevTools, o &lt;a href="https://developer.chrome.com/docs/devtools/recorder?utm_source=devtools&amp;amp;hl=pt-br" rel="noopener noreferrer"&gt;Recorder&lt;/a&gt; que grava o fluxo do usuário na sua tela para que você possa reproduzir com ferramentas como o &lt;a href="https://pptr.dev/" rel="noopener noreferrer"&gt;Puppeteer&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Assim fica simples demais testar seu frontend para estar sempre respeitando as métricas que você definiu, ou pelo menos que você possa notar quando algo de errado estiver acontecendo.&lt;/p&gt;

&lt;p&gt;Ainda de acordo com &lt;a href="https://web.dev/articles/vitals?hl=pt-br" rel="noopener noreferrer"&gt;Web Vitals em web.dev&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Para cada uma dessas métricas, para garantir que você atinja a meta recomendada para a maioria dos usuários, um bom limite a ser medido é o 75o percentil de carregamentos de página, segmentado em dispositivos móveis e computadores.&lt;/p&gt;

&lt;p&gt;As ferramentas que avaliam a conformidade com as Core Web Vitals precisam considerar uma página em conformidade se ela atender aos destinos recomendados no 75o percentil para cada uma dessas três métricas.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  O Core Web Vitals está em constante evolução &lt;a&gt;&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqu8s3keprso6cjn84y61.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqu8s3keprso6cjn84y61.png" alt="Core Web Vitals Lifecycle" width="726" height="128"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cada fase é projetada para sinalizar aos desenvolvedores como eles devem pensar sobre cada métrica:&lt;/p&gt;

&lt;p&gt;As métricas experimentais são potenciais Core Web Vitals que ainda podem estar passando por mudanças significativas dependendo dos testes e do feedback da comunidade.&lt;/p&gt;

&lt;p&gt;As métricas pendentes são as Core Web Vitals futuras que passaram no estágio de teste e feedback e têm um cronograma bem definido para se tornarem estáveis.&lt;/p&gt;

&lt;p&gt;As métricas estáveis são o conjunto atual de Core Web Vitals que o Chrome considera essenciais para oferecer ótimas experiências do usuário.&lt;/p&gt;

&lt;p&gt;Recentemente houve a substituição da métrica FID (First Input Delay) pela INP, como descrito neste &lt;a href="https://web.dev/articles/fid?hl=pt-br" rel="noopener noreferrer"&gt;artigo&lt;/a&gt;, logo, é interessante ficar atendo às mudanças e tendencias da comunidade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão  &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Core Web Vitals são uma ótima forma de analizar e mitigar os problemas do seu site, use e abuse desta ferramenta que com toda certeza vai contribuir para a qualidade geral do seu software.&lt;/p&gt;

&lt;p&gt;Contudo analisar é apenas a primeira parte, acompanhe nos meus próximos conteúdos as técnicas e boas práticas mais interessantes para fazer um frontend incrível independente de framework.&lt;/p&gt;

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

&lt;p&gt;Google Developers. Vitals - web.dev. Disponível em: &lt;a href="https://web.dev/articles/vitals" rel="noopener noreferrer"&gt;https://web.dev/articles/vitals&lt;/a&gt;. Acesso em: 03 abr. 2024.&lt;/p&gt;

&lt;p&gt;Google Developers. Novas métricas de campo para a experiência de página: Primeiras impressões. Disponível em: &lt;a href="https://web.dev/blog/inp-cwv-march-12?hl=pt-br" rel="noopener noreferrer"&gt;https://web.dev/blog/inp-cwv-march-12?hl=pt-br&lt;/a&gt;. Acesso em: 03 abr. 2024.&lt;/p&gt;

&lt;p&gt;Google Developers. Google Chrome Developer Tools: Gravador. Disponível em: &lt;a href="https://developer.chrome.com/docs/devtools/recorder" rel="noopener noreferrer"&gt;https://developer.chrome.com/docs/devtools/recorder&lt;/a&gt;. Acesso em: 03 abr. 2024.&lt;/p&gt;

&lt;p&gt;npm. Lighthouse. Disponível em: &lt;a href="https://www.npmjs.com/package/lighthouse" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/lighthouse&lt;/a&gt;. Acesso em: 03 abr. 2024.&lt;/p&gt;

&lt;p&gt;Google Developers. Insights sobre velocidade da Web. Disponível em: &lt;a href="https://developers.google.com/speed/docs/insights/v5/about" rel="noopener noreferrer"&gt;https://developers.google.com/speed/docs/insights/v5/about&lt;/a&gt;. Acesso em: 03 abr. 2024.&lt;/p&gt;

&lt;p&gt;Google Developers. PageSpeed Insights. Disponível em: &lt;a href="https://pagespeed.web.dev/" rel="noopener noreferrer"&gt;https://pagespeed.web.dev/&lt;/a&gt;. Acesso em: 03 abr. 2024.&lt;/p&gt;

&lt;p&gt;Google Chrome Web Store. Lighthouse. Disponível em: &lt;a href="https://chrome.google.com/webstore/detail/lighthouse/blipmdconlkpinefehnmjammfjpmpbjk" rel="noopener noreferrer"&gt;https://chrome.google.com/webstore/detail/lighthouse/blipmdconlkpinefehnmjammfjpmpbjk&lt;/a&gt;. Acesso em: 03 abr. 2024.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>braziliandevs</category>
      <category>browser</category>
    </item>
    <item>
      <title>Desenvolvendo Soft Skills</title>
      <dc:creator>Roberto Costa</dc:creator>
      <pubDate>Sat, 09 Mar 2024 19:13:44 +0000</pubDate>
      <link>https://dev.to/techinrio/desenvolvendo-soft-skills-418</link>
      <guid>https://dev.to/techinrio/desenvolvendo-soft-skills-418</guid>
      <description>&lt;p&gt;Habilidades técnicas todo mundo aprende, mas o que te destaca são as habilidades não técnicas.&lt;/p&gt;

&lt;p&gt;Aprenda como sair na frente e se virar nas mais diversas situações com soft skills que o tornam um profissional completo.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que são Soft Skills
&lt;/h2&gt;

&lt;p&gt;A definição mais simplista é: habilidades não técnicas.&lt;/p&gt;

&lt;p&gt;Normalmente soft skills são definidas como habilidades interpessoais, ou seja, suas capacidades de comunicação, sociais, fala e hábitos.&lt;/p&gt;

&lt;p&gt;Contudo, gosto de conferir outro sentido à Soft Skills:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Toda habilidade essencial para a boa execução do seu trabalho é considerada uma habilidade técnica (Hard Skills);&lt;/li&gt;
&lt;li&gt;Toda habilidade não essencial para o seu trabalho pode ser considerada uma soft skill.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Logo, existem habilidades que não são exatamente sobre interações sociais mas que me ajudam muito no dia a dia do trabalho, por exemplo: leitura dinâmica e técnicas de memorização.&lt;/p&gt;

&lt;p&gt;Gosto deste tipo de visão pois te habilita a olhar além das capacidades sociais e pensar em tudo que pode compor seu cinto de utilidades de soft skills.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tipos de Soft Skills
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Comunicação assertiva&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Articule ideias e seja compreendido de forma clara e simples.&lt;br&gt;
Comunicação assertiva é fazer mais com menos, compreender e ser compreendido, o que é essencial em ambientes de trabalho em equipe, quase todo trabalho.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Trabalho em equipe&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Falando em trabalho em equipe, de nada adianta saber comunicar suas ideias se não conseguir colaborar em equipe.&lt;br&gt;
Trabalho em equipe envolve saber dividir para conquistar, confiar nos seus pares e principalmente entender que todos estão ali para um objetivo em comum.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pensamento crítico&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pense e entenda o que está fazendo e como isso tem valor para o objetivo, só assim você consegue sair da caixinha e agregar valor de verdade.&lt;/p&gt;

&lt;p&gt;Um bom exemplo é tarefas que as pessoas querem automatizar, mas o trabalho para fazer isso vai gastar mais tempo e ter menos retorno do que apenas fazer manualmente de forma ocasional.&lt;/p&gt;

&lt;p&gt;É o tipo de coisa que nem todo mundo pára pra pensar antes de fazer.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resolução de problemas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Muitas das vezes as pessoas não estão esperando os problemas aparecerem, mas eles chegam mesmo assim.&lt;/p&gt;

&lt;p&gt;Essa habilidade é sobre você ter a calma e controle para pegar o controle da situação e fazer o melhor que puder com o que você tem.&lt;/p&gt;

&lt;p&gt;Nem sempre poderá fazer muito sobre isso, mas é importante que não desista antes de tentar.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inteligência emocional&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nem sempre o caminho que as coisas tomam é aquele que você gostaria, e por isso mesmo é super importante que você se conheça e treine esta habilidade.&lt;/p&gt;

&lt;p&gt;Lidar bem com situações atípicas e frustrações é algo bem complicado e isso daqui costuma ser uma jornada pessoal para cada pessoa.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Empatia&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sim, eu sei que tem momentos onde você quer simplesmente detonar uma bomba em cima de uma pessoa, mas é importante lembrar que ela é tão humana quanto você e amanhã pode ser o dia onde você precisaria de empatia dela.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gestão de tempo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ahh essa daqui é boa!!&lt;br&gt;
Já sentiu que você está sempre no olho de um furacão com tudo rodando ao seu redor onde você só pode se concentrar nas emergências, sempre tem muita coisa com prazos críticos e etc??&lt;/p&gt;

&lt;p&gt;Nossa é muito ruim isso, qual foi a última vez que você estava relativamente tranquilo, com bastante folga nos prazos e tempo de sobra?&lt;/p&gt;

&lt;p&gt;Pois é, toda vez que você ver alguém que tá sempre &lt;code&gt;na correria&lt;/code&gt; lembre-se desta habilidade.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adaptabilidade&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eu que trabalhei bastante de startups sempre convivi bastante com ambientes onde tudo está mudando constantemente, mudanças de prioridade, tudo é emergência, tudo é importante, etc.&lt;/p&gt;

&lt;p&gt;Bem isso não é nem de longe agradável mas assim como outros &lt;code&gt;calos&lt;/code&gt; da profissão, te preparam para se adaptar aos mais diversos cenários.&lt;/p&gt;

&lt;p&gt;Uma das coisas mais importantes dessa habilidade é saber analisar suas prioridades e se organizar de acordo com elas.&lt;/p&gt;

&lt;p&gt;Tudo mudar muito rápido não é uma desculpa para ser desorganizado.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Liderança&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Todas habilidades anteriores bem desenvolvidas podem te levar naturalmente para o caminho da liderança.&lt;/p&gt;

&lt;p&gt;Faça as contas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se comunica bem;&lt;/li&gt;
&lt;li&gt;Sabe lidar com problemas;&lt;/li&gt;
&lt;li&gt;Sabe lidar com pessoas;&lt;/li&gt;
&lt;li&gt;Sabe usar seu tempo;&lt;/li&gt;
&lt;li&gt;Se mantém firme diante dos problemas;&lt;/li&gt;
&lt;li&gt;Faz o que tem que fazer para chegar no objetivo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Olhando pra isso tudo parece quase natural colocar uma pessoa com essas habilidades em uma posição de liderança onde pode ajudar outras pessoas a colaborar para um objetivo maior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Onde as Soft Skills te Levam?
&lt;/h2&gt;

&lt;p&gt;Gosto de dizer essas habilidades te levam além e desbloqueiam novos caminhos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cargos de liderança e gestão
&lt;/h3&gt;

&lt;p&gt;Uma pessoa que desenvolveu bem suas soft skills naturalmente é mais cogitada para cargos de liderança e gestão.&lt;/p&gt;

&lt;h3&gt;
  
  
  Oportunidades
&lt;/h3&gt;

&lt;p&gt;Se conectar com pessoas e desenvolver relações genuínas é uma forma muito eficaz de acessar ótimas oportunidades de trabalho e negócios.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sucesso e crescimento profissional
&lt;/h3&gt;

&lt;p&gt;Pessoas com melhor domínio de soft skills aumentam significativamente as chances de sucesso dos projetos que participam bem como sua velocidade e destaque no meio profissional.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como treinar
&lt;/h2&gt;

&lt;p&gt;Como muitas das habilidades não técnicas são relacionadas a situações sociais, se expor socialmente é um caminho natural:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Apresentar trabalhos/palestras;&lt;/li&gt;
&lt;li&gt;Ir em eventos;&lt;/li&gt;
&lt;li&gt;Socializar com pessoas;&lt;/li&gt;
&lt;li&gt;Falar com pessoas que pensam diferente;&lt;/li&gt;
&lt;li&gt;Ter discussões construtivas;&lt;/li&gt;
&lt;li&gt;Ensinar;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Assim como mencionei no início deste artigo, toda e qualquer habilidade que possa te ajudar nas suas tarefas é bem vinda.&lt;/p&gt;

&lt;p&gt;Então preste bastante atenção nas atividades que você desempenha rotineiramente para entender se é possível melhorar seu desempenho e resultados.&lt;/p&gt;

&lt;h2&gt;
  
  
  Leituras recomendadas
&lt;/h2&gt;

&lt;p&gt;O que não falta por aí é conteúdo falando sobre soft skills, mas gostaria de recomendar pessoalmente estes 2 livros que me ajudaram bastante alcançar outro nível nessas habilidades: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Soft skills: competências essenciais para os novos tempos por Lucedile Antunes&lt;/li&gt;
&lt;li&gt;Como fazer amigos e influenciar pessoas por Dale Carnegie&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Gupy Blog. "Soft Skills: o que são, sua importância e 10 principais soft skills para o mercado de trabalho." Disponível em: &lt;a href="https://www.gupy.io/blog/soft-skills" rel="noopener noreferrer"&gt;https://www.gupy.io/blog/soft-skills&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Solides Blog. "Conheça soft skills para desenvolver." Disponível em: &lt;a href="https://blog.solides.com.br/conheca-soft-skills-para-desenvolver/" rel="noopener noreferrer"&gt;https://blog.solides.com.br/conheca-soft-skills-para-desenvolver/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Na Prática. "Como desenvolver soft skills." Disponível em: &lt;a href="https://www.napratica.org.br/como-desenvolver-soft-skills/" rel="noopener noreferrer"&gt;https://www.napratica.org.br/como-desenvolver-soft-skills/&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>career</category>
      <category>braziliandevs</category>
      <category>community</category>
    </item>
    <item>
      <title>Simplificando IndexedDB</title>
      <dc:creator>Roberto Costa</dc:creator>
      <pubDate>Wed, 06 Mar 2024 16:01:57 +0000</pubDate>
      <link>https://dev.to/robertheory/simplificando-indexeddb-hg1</link>
      <guid>https://dev.to/robertheory/simplificando-indexeddb-hg1</guid>
      <description>&lt;p&gt;Mais espaço, mais rápido e menos amigável.&lt;/p&gt;

&lt;p&gt;A partir daqui é menos ódio e mais amor pela forma de armazenamento mais poderosa do seu navegador.&lt;/p&gt;

&lt;p&gt;O IndexedDB pode ser um pouco complicado a princípio, mas ao final deste artigo você vai entender o essencial para usar o melhor desta ferramenta ao seu favor!&lt;/p&gt;

&lt;h2&gt;
  
  
  Tabela de Conteúdos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Pontos fortes&lt;/li&gt;
&lt;li&gt;Pontos de atenção&lt;/li&gt;
&lt;li&gt;
Teoria e conceitos do IndexedDB

&lt;ul&gt;
&lt;li&gt;Database&lt;/li&gt;
&lt;li&gt;Object Store&lt;/li&gt;
&lt;li&gt;Índices&lt;/li&gt;
&lt;li&gt;Transações&lt;/li&gt;
&lt;li&gt;Versionamento&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

IndexedDB na prática

&lt;ul&gt;
&lt;li&gt;Criando o banco e a store&lt;/li&gt;
&lt;li&gt;Operações de armazenamento&lt;/li&gt;
&lt;li&gt;Trabalhando com Índices&lt;/li&gt;
&lt;li&gt;Transações&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Conclusão&lt;/li&gt;

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

&lt;/ul&gt;

&lt;p&gt;De acordo com &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API" rel="noopener noreferrer"&gt;Developer Mozilla&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;IndexedDB é uma API de baixo nível para armazenamento no lado do cliente de quantidades significativas de dados estruturados, incluindo arquivos/blobs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;O IndexedDB é um sistema de banco de dados transacional, semelhante a bancos que utilizam SQL, contudo, sua semelhança com SQL acaba por ai.&lt;/p&gt;

&lt;p&gt;Nele trabalhamos com o armazenamento de objetos indexados com chaves, logo, podemos sim considerá-lo um banco de dados NoSQL, e nesse aspecto lembra um pouco bancos como o Redis que trabalham no esquema Chave-Valor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pontos fortes &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Alta performance em consultas: Seu funcionamento baseado em índices permite realizar consultas de forma mais performática em comparação aos mecanismos de WebStorage.&lt;/li&gt;
&lt;li&gt;Altas cotas de armazenamento: Ainda em comparação com o WebStorage, que pode armazenar cotas de até 5 MiB, o IndexedDB oferece até 10% do tamanho total do disco onde o perfil do usuário está armazenado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por exemplo, se o dispositivo tiver um disco rígido de 500 GiB, o navegador permitirá que uma origem armazene até:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No modo de melhor esforço: 10 GiB de dados, que é o limite do grupo eTLD+1.&lt;/li&gt;
&lt;li&gt;No modo persistente: 250 GiB, que representa 50% do tamanho total do disco.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Navegadores diferentes tratam os limites e o despejo de dados de forma diferente, entenda mais em: &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Storage_API/Storage_quotas_and_eviction_criteria#other_web_technologies" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/API/Storage_API/Storage_quotas_and_eviction_criteria#other_web_technologies&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Armazenamento de dados estruturados: Aqui podemos armazenar diretamente objetos complexos da nossa aplicação sem a necessidade de conversões mirabolantes, ou transformar em string como é o caso do &lt;code&gt;localStorage&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sim, diferente do localStorage que armazena apenas texto aqui você pode armazenar diretamente qualquer tipo objeto suportado pelo &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm" rel="noopener noreferrer"&gt;algoritmo de clone estruturado&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pontos de atenção &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Complexidade: IndexedDB é uma API de baixo nível, o que significa que pode ser complexa para iniciantes. Requer uma compreensão sólida de conceitos como transações, índices e manipulação de eventos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Não é adequado para todos os casos de uso: IndexedDB é mais adequado para armazenar grandes volumes de dados, como em aplicativos da web que precisam de armazenamento offline robusto. Para casos de uso mais simples, como armazenamento temporário de dados, pode ser excessivo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Desempenho em alguns cenários: Embora seja geralmente eficiente para grandes conjuntos de dados, IndexedDB pode ter desempenho inferior em cenários onde há muitas operações de leitura e escrita frequentes em pequenos conjuntos de dados.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;API Verbosa: As operações em IndexedDB muitas vezes exigem muito código para realizar tarefas simples. Isso pode tornar o desenvolvimento mais demorado e propenso a erros.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Teoria e conceitos do IndexedDB  &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3cykrg8mkdivn969844v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3cykrg8mkdivn969844v.png" alt="estrutura exemplo indexedDB" width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Database &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;A estrutura de mais alto nível do IndexedDB.&lt;br&gt;
Nele iremos conter as Object Stores, onde de fato iremos armazenar os dados.&lt;br&gt;
É possível criar múltiplos Databases, que por sua vez podem conter múltiplas Object Stores.&lt;/p&gt;
&lt;h3&gt;
  
  
  Object Store &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Cada Object Store é um compartimento individual onde seus dados serão armazenados.&lt;br&gt;
Traçando um paralelo com bancos de dados relacionais, as Object Stores normalmente são criadas para um fim específico, como armazenar apenas produtos, ou apenas posts de um blog.&lt;br&gt;
É comum criar uma Object Store para cada finalidade dentro da aplicação, como: armazenar uma lista de produtos, publicações de um blog, etc.&lt;/p&gt;

&lt;p&gt;Diferentemente das tabelas em bancos de dados tradicionais, os tipos de dados no armazenamento não precisam ser consistentes.&lt;/p&gt;

&lt;p&gt;Assim, podemos por exemplo, armazenar um objeto com propriedades que podem ser &lt;code&gt;String&lt;/code&gt; ou &lt;code&gt;undefined&lt;/code&gt; sem problemas.&lt;/p&gt;

&lt;p&gt;Neste exemplo temos uma Store de métodos de pagamento por usuário, onde cada objeto tem as propriedades: &lt;code&gt;name&lt;/code&gt; e &lt;code&gt;payment&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Contudo é perceptível que nem todos os objetos desta Store possuem um valor válido para &lt;code&gt;payment&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fungnuairlxe4jon1udqm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fungnuairlxe4jon1udqm.png" alt="object store com inconsistencia" width="800" height="458"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Índices &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;No IndexedDB os índices funcionam como se fosse uma nova Object Store, contudo a chave para consulta é definida por um campo específico do objeto armazenado.&lt;/p&gt;

&lt;p&gt;Levando em consideração o exemplo anterior com a Store de métodos de pagamento por usuário, vamos criar um índice baseado nas formas de pagamento:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6p5nwjyxn9z0mizrbvma.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6p5nwjyxn9z0mizrbvma.png" alt="índice baseado nas formas de pagamento" width="800" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Neste novo índice podemos observar as seguintes mudanças:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A chave agora é o método de pagamento;&lt;/li&gt;
&lt;li&gt;Os objetos armazenados continuam os mesmos;&lt;/li&gt;
&lt;li&gt;Registros que não possuem a propriedade &lt;code&gt;payment&lt;/code&gt; não são retornados;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A Object Store anterior que se baseava em um ID incremental ainda existe, contudo, no ato da consulta da Object Store é crucial informar o índice de consulta desejado, caso contrário a consulta será realizada no índice padrão.&lt;/p&gt;
&lt;h3&gt;
  
  
  Transações &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Uma transação é um procedimento que envolve uma operação ou grupo de operações que garante a integridade do banco de dados.&lt;/p&gt;

&lt;p&gt;Se uma das ações de uma transação falhar, nenhuma delas será aplicada e o banco de dados retornará ao estado em que estava antes do início da transação.&lt;/p&gt;

&lt;p&gt;Todas as operações de leitura ou gravação no IndexedDB precisam fazer parte de uma transação. Isso permite operações atômicas de leitura-modificação-gravação sem precisar se preocupar com outras linhas de execução agindo no banco de dados ao mesmo tempo.&lt;/p&gt;
&lt;h3&gt;
  
  
  Versionamento &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;No IndexedDB existe o conceito de versão do banco de dados, onde cada versão é numerada, normalmente de forma sequencial.&lt;/p&gt;

&lt;p&gt;Quando o banco é executado pela primeira vez, a sua versão começa em &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Esta funcionalidade é realmente útil quando se precisa por algum motivo modificar a estrutura do banco, assim criamos uma nova versão com uma estrutura diferente.&lt;/p&gt;
&lt;h2&gt;
  
  
  IndexedDB na prática &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Na prática a verbosidade da API do IndexedDB é algo que pode realmente complicar o seu trabalho e levá-lo a reconsiderar o uso da ferramenta. Inclusive sua complexidade é algo que leva muitas pessoas a desistirem mesmo de entender como se usa a ferramenta, assim perdendo uma ferramenta que é boa para diversos trabalhos.&lt;/p&gt;

&lt;p&gt;Eu particularmente tenho certo apreço pelo uso de bibliotecas que tornam a usabilidade do IndexedDB muito melhor como o &lt;a href="https://www.npmjs.com/package/idb" rel="noopener noreferrer"&gt;IDB&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;IndexedDB com usabilidade.&lt;br&gt;
Esta é uma biblioteca pequena (~ 1,19kB brotli'd) que reflete principalmente a API IndexedDB, mas com pequenas melhorias que fazem uma grande diferença na usabilidade.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Uma vez que o IndexedDB tem uma documentação muito boa, vou me ater a exemplos já existentes das documentações e lhes encorajo a notar como sua implementação com a biblioteca npm IDB se torna muito mais simples em comparação com a API padrão.&lt;/p&gt;
&lt;h3&gt;
  
  
  Verificando a compatibilidade com IndexedDB
&lt;/h3&gt;

&lt;p&gt;A compatibilidade do IndexedDB é quase absoluta, contudo existem cenários onde é importante checar sua compatibilidade, por exemplo se você estiver trabalhando com navegadores mais antigos, por precaução, não é uma má ideia detectar o suporte de recursos.&lt;/p&gt;

&lt;p&gt;A maneira mais fácil é verificar o objeto window:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (!window.indexedDB) {
  window.alert(
    "Seu navegador não suporta uma versão estável do IndexedDB. Alguns recursos não estarão disponíveis.",
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este e outros exemplos de código em: &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API/Using_IndexedDB" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API/Using_IndexedDB&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Criando o banco e a store &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Para abrir um banco é preciso realizar um pedido (request) que será atendido em algum momento, assim várias operações do IndexedDB.&lt;/p&gt;

&lt;p&gt;Para criar o banco de dados temos que realizar os seguintes passos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Informar o nome do banco&lt;/li&gt;
&lt;li&gt;Informar a versão do banco&lt;/li&gt;
&lt;li&gt;Criar a Object Store&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No seguinte exemplo vamos criar dar vida ao nosso exemplo anterior de &lt;code&gt;métodos de pagamento por usuário&lt;/code&gt; utilizando a biblioteca IDB para realizar a abertura do banco e a criação da primeira store.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { openDB } from 'idb';

const dbPromise = openDB('MeuBancoIDB', 1, {
  upgrade(db) {
// aqui é onde realizamos a definição do nosso banco
// podemos criar quantas stores quisermos
    db.createObjectStore('usuariosPagamento');
  },
});

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método &lt;code&gt;upgrade&lt;/code&gt; é chamado se essa versão do banco de dados nunca tiver sido aberta antes.&lt;/p&gt;

&lt;p&gt;Nele especificamos o esquema (estrutura) do banco de dados.&lt;/p&gt;

&lt;p&gt;Veja em profundidade o funcionamento do método openDB e seu ciclo de vida: &lt;a href="https://www.npmjs.com/package/idb#opendb" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/idb#opendb&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Operações de armazenamento &lt;a&gt;&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;Com o nosso banco de dados criado com sucesso, é hora de realizarmos as operações de leitura e escrita.&lt;/p&gt;

&lt;p&gt;Uma vez que a &lt;code&gt;dbPromise&lt;/code&gt; será nossa interface assíncrona com o banco, os métodos para acessar o banco precisam resolver as promises para que só então possam interagir com o banco.&lt;/p&gt;

&lt;p&gt;Veja a seguir o exemplo da documentação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { openDB } from 'idb';

const dbPromise = openDB('MeuBancoIDB', 1, {
  upgrade(db) {
    db.createObjectStore('usuariosPagamento');
  },
});


// espere a promise do banco resolver com async/await
// resolvendo a promise, realize a operação

export async function get(key) {
  return (await dbPromise).get('usuariosPagamento', key);
}
export async function set(key, val) {
  return (await dbPromise).put('usuariosPagamento', val, key);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Trabalhando com Índices &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Gosto de dizer que os índices são a parte legal do IndexedDB (também o nome dele é Indexed, se os índices não fossem legais não faria sentido).&lt;/p&gt;

&lt;p&gt;O uso dos índices pode conferir velocidade e praticidade na recuperação de dados da sua aplicação.&lt;/p&gt;

&lt;p&gt;Com o IDB sua criação e utilização é muito simples, vamos recriar o índice &lt;code&gt;payment&lt;/code&gt; do exemplo passado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const dbPromise = openDB('MeuBancoIDB', 2, {
  upgrade(db) {
    const store = db.createObjectStore('usuariosPagamento', {
      // ID é a chave padrão
      keyPath: 'id',
      // ID é um valor de auto incremento
      autoIncrement: true,
    });

   //store.createIndex('nomeDoÍndice', 'propriedadeDoObjeto')
    store.createIndex('payment', 'payment');
  },
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como o método upgrade é onde definimos as alterações estruturais do banco, nele mesmo iremos declarar nosso novo índice.&lt;/p&gt;

&lt;p&gt;Além de criar um novo índice, definimos também que a chave padrão da nossa store é um ID incremental.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// buscar um registro pela chave em um índice
await dbPromise.getFromIndex('usuariosPagamento', 'payment', key)

// retornar todos registros de um índice
await dbPromise.getAllFromIndex('usuariosPagamento', 'payment')

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A biblioteca IDB dispões de métodos específicos para interagir com índices, o que facilita bastante o trabalho que teríamos usando a API padrão do IndexedDB.&lt;/p&gt;

&lt;h3&gt;
  
  
  Transações &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Trabalhar com transações é um diferencial para realizar diversas operações de uma só vez.&lt;/p&gt;

&lt;p&gt;Caso haja algum tipo de intercorrência durante a transação, todas as operações são canceladas e o banco volta a seu estado anterior à transação.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// instância da transação
const tx = dbPromise.transaction('usuariosPagamento', 'readwrite');

// operações assíncronas a serem resolvidas
await Promise.all([
 tx.store.add({
  name: 'Anna',
  payment: 'credit'
 }),
 tx.store.add({
  name: 'Steve',
  payment: 'cash'
 }),
// a última operação é o fechamento da transação
 tx.done,
]);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mais detalhes sobre a operação de transações em: &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/IDBTransaction" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/API/IDBTransaction&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;IndexedDB é uma ferramenta incrivelmente poderosa nos seus casos de uso adequados, entender seu funcionamento e como posso tirar o melhor dele me ajudou não só a expandir meus horizontes para aplicações frontend, como também para trazer soluções cada vez mais especializadas para projetos onde era necessário.&lt;/p&gt;

&lt;p&gt;Assim como qualquer tecnologia, o IDB tem seus pontos fortes e fracos, dessa forma, utilize-o com sabedoria e ceticismo.&lt;/p&gt;

&lt;p&gt;Espero que tenham gostado &amp;lt;3.&lt;/p&gt;

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

&lt;p&gt;npmjs.com - "IDB: IndexedDB is a low-level API for client-side storage of significant amounts of structured data." [Online]. Available: &lt;a href="https://www.npmjs.com/package/idb" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/idb&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Mozilla Developer Network (MDN) - "Storage quotas and eviction criteria". [Online]. Available: &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Storage_API/Storage_quotas_and_eviction_criteria" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/API/Storage_API/Storage_quotas_and_eviction_criteria&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;web.dev - "Storage for the web". [Online]. Available: &lt;a href="https://web.dev/articles/storage-for-the-web" rel="noopener noreferrer"&gt;https://web.dev/articles/storage-for-the-web&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Medium - Julien Etienne, "The power of IndexedDB and the birth of DB64: A practical alternative." [Online]. Available: &lt;a href="https://medium.com/@julienetienne/the-power-of-indexeddb-and-the-birth-of-db64-a-practical-alternative-4a5aa2a94794" rel="noopener noreferrer"&gt;https://medium.com/@julienetienne/the-power-of-indexeddb-and-the-birth-of-db64-a-practical-alternative-4a5aa2a94794&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;web.dev - "IndexedDB". [Online]. Available: &lt;a href="https://web.dev/articles/indexeddb?hl=pt-br" rel="noopener noreferrer"&gt;https://web.dev/articles/indexeddb?hl=pt-br&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Mozilla Developer Network (MDN) - "IDBTransaction". [Online]. Available: &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/IDBTransaction" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/API/IDBTransaction&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Mozilla Developer Network (MDN) - "Using IndexedDB". [Online]. Available: &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API/Using_IndexedDB" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API/Using_IndexedDB&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>braziliandevs</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Sistemas Numéricos na Computação: Introdução e Binário</title>
      <dc:creator>Roberto Costa</dc:creator>
      <pubDate>Thu, 11 Jan 2024 12:39:49 +0000</pubDate>
      <link>https://dev.to/robertheory/sistemas-numericos-na-computacao-introducao-e-binario-3mo7</link>
      <guid>https://dev.to/robertheory/sistemas-numericos-na-computacao-introducao-e-binario-3mo7</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Há 10 tipos de pessoas no mundo: aquelas que entendem binário e aquelas que não entendem.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Vamos juntos em uma jornada para compreender as bases da computação e desbravar o mundo da tecnologia: &lt;strong&gt;sistemas numéricos em computação!&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tabela de conteúdos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
Breve introdução à sistemas de numeração

&lt;ul&gt;
&lt;li&gt;Decimal no detalhe&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

Sistemas numéricos na computação

&lt;ul&gt;
&lt;li&gt;Binário&lt;/li&gt;
&lt;li&gt;Convertendo binário para decimal&lt;/li&gt;
&lt;li&gt;Decimal pra binário&lt;/li&gt;
&lt;li&gt;Contando em binário&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Conclusão&lt;/li&gt;

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

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Breve introdução à sistemas de numeração &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Antes de falar como este sistems se aplicam na computação, vamos fazer uma breve introdução que vai nos assistir com conceitos super importantes para entender o restante.&lt;/p&gt;

&lt;p&gt;Sistemas de numeração consistem em um conjunto de regras e símbolos utilizados para &lt;em&gt;representar quantidade de forma organizada&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Historicamente já passamos por diversos sistemas de numeração que evoluíram de acordo com a cultura e necessidade das civilizações.&lt;/p&gt;

&lt;p&gt;Alguns exemplos:&lt;/p&gt;

&lt;p&gt;Sistema de numeração Sumério&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdz2p6t830yc31rchn4vg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdz2p6t830yc31rchn4vg.png" alt="Sistema de numeração Sumério"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sistema de numeração Romano&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgxbra21rjxae1qq2jfid.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgxbra21rjxae1qq2jfid.png" alt="Sistema de numeração Romano"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sistema vigesimal Maia&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjxhpkngh68dnk5qw07v7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjxhpkngh68dnk5qw07v7.png" alt="Sistema vigesimal Maia"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E ao longo do tempo foi-se desenvolvendo o sistema de numeração que utilizamos no nosso dia a dia:&lt;/p&gt;

&lt;p&gt;Sistema decimal&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flhm3c3mluh145aw7gw6a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flhm3c3mluh145aw7gw6a.png" alt="Sistema decimal"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O sistema decimal está presente em diversas áreas de conhecimento modernas, contudo, há áreas com necessidades específicas que desenvolveram diferentes sistemas para solucionar problemas, e uma delas é a &lt;em&gt;computação&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Decimal no detalhe &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;É muito provável que você seja bem familiar com o sistema decimal, mas vamos passar aqui um conceito que vai ajudar a entender o binário mais à frente.&lt;/p&gt;

&lt;p&gt;Cada casa (ou ordem) de um número decimal tem um peso diferente.&lt;/p&gt;

&lt;p&gt;Avançar ou retroceder uma casa, significa multiplicar ou dividir este número por 10.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhsj01l040otkf8jg1wbv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhsj01l040otkf8jg1wbv.png" alt="casas decimais"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cada casa de um número decimal possui 10 possíveis dígitos:&lt;br&gt;
&lt;code&gt;1 2 3 4 5 6 7 8 9 0&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Com um número com 1 dígito, temos apenas 10 possíveis variações numéricas.&lt;/p&gt;

&lt;p&gt;Agora, com 2 dígitos temos 100 possibilidades diferentes:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

00, 01, 02, 03, 04, 05, 06, 07, 08, 09,
10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
90, 91, 92, 93, 94, 95, 96, 97, 98, 99


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;E o padrão segue: a cada dígito a mais em um número decimal temos a quantidade de combinações anterior vezes 10!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 dígito decimal: 10 opções (0 à 9)&lt;/li&gt;
&lt;li&gt;2 dígitos decimais: 10 × 10 = 100 opções (00 à 99)&lt;/li&gt;
&lt;li&gt;3 dígitos decimais: 10 × 10 × 10 = 1000 opções (000 à 999)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Este conceito é importante pois cada sistema de numeração irá apenas implementar sua própria base, como será com o &lt;em&gt;binário&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sistemas numéricos na computação &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;A história da computação é marcada por uma necessidade crescente de representar e manipular informações de forma eficiente, dessa forma, sistemas como binário, hexadecimal e octal foram largamente empregados para diversas necessidades específicas.&lt;/p&gt;

&lt;p&gt;Um dos fins mais comuns que estes sistemas nos permitem é a entrada de dados e sua representação em texto, ou seja, digitar no teclado:&lt;/p&gt;

&lt;p&gt;Conversão Decimal, Binário, Octal, Hexadecimal para ASCII&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzx3osb0rk8v7jgts00qd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzx3osb0rk8v7jgts00qd.png" alt="IConversão Decimal, Binário, Octal, Hexadecimal para ASCII"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Baseando-se nesta tabela que muitos computadores compreendem a informação enviada por teclados e outros dispositivos de entrada.&lt;/p&gt;

&lt;h3&gt;
  
  
  Binário &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Vamos entender agora o básico de binário para que você possa compreender o meme abaixo e não estar mais no lugar da segunda pessoa.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjb22tk3tbv8o4ed4w7cl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjb22tk3tbv8o4ed4w7cl.png" alt="pessoas que entendem binario"&gt;&lt;/a&gt; &lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como mencionamos antes, binário é um sistema de base 2, logo, para representar informações temos 2 símbolos: &lt;code&gt;1&lt;/code&gt; (ligado) e &lt;code&gt;0&lt;/code&gt; (desligado).&lt;/p&gt;

&lt;p&gt;É realmente como se fosse uma lâmpada, ou um circuito (o que geralmente é):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flfp6eaewsl2a21nspedh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flfp6eaewsl2a21nspedh.png" alt="binário 101011"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Seguindo a lógica da quantidade de dígitos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 dígito binário: 2 opções (0 ou 1)&lt;/li&gt;
&lt;li&gt;2 dígitos binários: 2 × 2 = 4 opções (00, 01, 10, 11)&lt;/li&gt;
&lt;li&gt;3 dígitos binários: 2 × 2 × 2 = 8 opções (000, 001, 010, 011, 100, 101, 110, 111)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Como convenção, utilizamos potências de 2 para representar a progressão em binário, logo:&lt;/p&gt;

&lt;p&gt;4 dígitos binários: 2^4 = 16 opções (0000 a 1111)&lt;/p&gt;

&lt;h3&gt;
  
  
  Convertendo binário para decimal &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Agora vamos ver na prática como se realiza esta conversão.&lt;/p&gt;

&lt;p&gt;Regras da conversão:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Em binário contamos da direita para esquerda;&lt;/li&gt;
&lt;li&gt;Dígitos &lt;code&gt;0&lt;/code&gt; em uma posição específica contribuem para o valor total, mas seu valor é zero;&lt;/li&gt;
&lt;li&gt;Cada casa (ordem) tem um peso diferente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemplo prático:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

Converter para decimal 🤔

 0   1   0   1   1   0   0   1 


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Respectivamente, cada casa deste número tem seu peso (ordem) começando da direita:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

 0   1   0   1   1   0   0   1 - número
 7   6   5   4   3   2   1   0 - ordem


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Assim como no sistema decimal, o número de uma ordem específica tem seu valor absoluto:&lt;/p&gt;

&lt;p&gt;No número: &lt;code&gt;1920&lt;/code&gt;, o dígito &lt;code&gt;9&lt;/code&gt; representa &lt;code&gt;900&lt;/code&gt;, pois está na ordem das centenas, ou seja: &lt;code&gt;9 (ele mesmo) x 10 (dezena) x 10 (centena) = 900&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;No binário vamos fazer a potência da ordem para chegar no valor de cada dígito&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

 0    1    0    1    1    0    0    1
2^7  2^6  2^5  2^4  2^3  2^2  2^1  2^0
128  64   32   16    8    4    2    1


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Contudo, devemos lembrar que o dígito &lt;code&gt;0&lt;/code&gt; (zero) significa desligado, dessa forma vamos cumprir uma das regras citadas anteriormente: o dígito &lt;code&gt;0&lt;/code&gt; não possui valor.&lt;/p&gt;

&lt;p&gt;Assim obtemos o seguinte resultado:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

 0   1   0   1   1   0   0   1
2^7 2^6 2^5 2^4 2^3 2^2 2^1 2^0
 0  64   0  16   8   0   0   1  = 89


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Por fim basta somar os números resultantes para obter o número decimal convertido com sucesso.&lt;/p&gt;

&lt;p&gt;Este método é um pouco trabalhoso se feito à mão, mas é garantidamente uma das melhores formas de compreender sistemas de numeração e compreender de fato o binário para aplicações futuras em tecnologia.&lt;/p&gt;

&lt;p&gt;Para converter um número decimal em binário é bem mais simples.&lt;/p&gt;

&lt;h3&gt;
  
  
  Decimal pra binário &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;O processo de conversão aqui é bem mais tranquilo, só precisamos de uma divisão simples do número por 2:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1b8mr0v0z3631md0pyb5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1b8mr0v0z3631md0pyb5.png" alt="Decimal pra binário"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note que nem sempre a divisão irá terminar com resto zero, o que é comum para este tipo de conversão.&lt;/p&gt;

&lt;h3&gt;
  
  
  Contando em binário &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;A habilidade de contar em binário é uma aptidão fundamental em diversos domínios, sendo especialmente crucial no universo da programação e lógica digital. &lt;/p&gt;

&lt;p&gt;Compreender como os números binários se desdobram é uma peça-chave para programadores, engenheiros e entusiastas da tecnologia.&lt;/p&gt;

&lt;p&gt;Contar em binário é razoavelmente simples depois que já notamos como funciona a ordem dos dígitos.&lt;/p&gt;

&lt;p&gt;Para entender a lógica por trás disso no binário, vamos revisitar o sistema decimal:&lt;/p&gt;

&lt;p&gt;Quando uma ordem alcança seu último dígito e ainda sim precisamos incrementar 1 unidade, como seria para passar de &lt;code&gt;09&lt;/code&gt; para &lt;code&gt;10&lt;/code&gt;, o que ocorre é a famosa "adição com reserva" ou "reagrupamento", popularmente chamado de "vai um".&lt;/p&gt;

&lt;p&gt;Assim nós zeramos a casa das unidades e incrementamos a casa das dezenas, resultando em: &lt;code&gt;10&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Em binário temos apenas 2 dígitos de possibilidade, então é muito fácil atingir o limite e precisar fazer o "vai um".&lt;/p&gt;

&lt;p&gt;Observe o padrão:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

Binario  Decimal
 0000       0
 0001       1
 0010       2
 0011       3
 0100       4
 0101       5
 0110       6
 0111       7
 1000       8
 1001       9
 1010       10


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Sim, você chegou na parte onde finalmente entendeu o meme lá de cima. 🎉&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Veja também como acontecem nas bases hexadecimal e octal&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9b9990e171bfcg220ye2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9b9990e171bfcg220ye2.png" alt="bases decimal, binaria, octal e hexadecimal"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Pronto, agora você já sabe o básico de sistemas numéricos e binário, mas isso não é tudo!&lt;/p&gt;

&lt;p&gt;Olha só o que você desbloqueia com o conhecimento deste post:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Redes de computadores: vários aspectos das redes, desde transporte de dados, organização e configuração de redes envolve conhecimento em binário e hexadecimal;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Robótica e Automação: plataformas como Arduino e Raspberry Pi se utilizam amplamente de sistemas binários e hexadecimal para compor sua lógica de funcionamento;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Segurança: usa-se binário em tópicos como criptografia, algoritmos de hashing, assinaturas digitais, protocolos de segurança, engenharia reversa e outros.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Então não deixe seu conhecimento pegar poeira, desbloqueie mais possibilidades e vá além ⚡️.&lt;/p&gt;

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

&lt;p&gt;Toda Matéria. Sistema de Numeração Decimal. Disponível em: &lt;a href="https://www.todamateria.com.br/sistema-de-numeracao-decimal/" rel="noopener noreferrer"&gt;https://www.todamateria.com.br/sistema-de-numeracao-decimal/&lt;/a&gt;. Acesso em: 10 jan. 2024.&lt;/p&gt;

&lt;p&gt;IFSC - Instituto Federal de Educação, Ciência e Tecnologia de Santa Catarina. AULA 2 - Eletrônica Digital 1 - Graduação. Disponível em: &lt;a href="https://wiki.ifsc.edu.br/mediawiki/index.php/AULA_2_-_Eletr%C3%B4nica_Digital_1_-_Gradua%C3%A7%C3%A3o" rel="noopener noreferrer"&gt;https://wiki.ifsc.edu.br/mediawiki/index.php/AULA_2_-_Eletr%C3%B4nica_Digital_1_-_Gradua%C3%A7%C3%A3o&lt;/a&gt;. Acesso em: 10 jan. 2024.&lt;/p&gt;

&lt;p&gt;Ciência de Garagem. Como os Sistemas Numéricos Evoluíram ao Longo do Tempo? Disponível em: &lt;a href="https://cienciadegaragem.blogspot.com/2014/12/como-os-sistemas-numericos-evoluiram-ao.html" rel="noopener noreferrer"&gt;https://cienciadegaragem.blogspot.com/2014/12/como-os-sistemas-numericos-evoluiram-ao.html&lt;/a&gt;. Acesso em: 10 jan. 2024.&lt;/p&gt;

&lt;p&gt;Vivah, Linda. Learn How to Read Binary in 5 Minutes. Disponível em: &lt;a href="https://medium.com/@LindaVivah/learn-how-to-read-binary-in-5-minutes-dac1feb991e" rel="noopener noreferrer"&gt;https://medium.com/@LindaVivah/learn-how-to-read-binary-in-5-minutes-dac1feb991e&lt;/a&gt;. Acesso em: 10 jan. 2024.&lt;/p&gt;

&lt;p&gt;CadCobol. Mecaweb - Conversão Bin/Dec, Dec/Bin. Disponível em: &lt;a href="https://www.cadcobol.com.br/mecaweb_conversao_bin_dec_dec_bin.htm" rel="noopener noreferrer"&gt;https://www.cadcobol.com.br/mecaweb_conversao_bin_dec_dec_bin.htm&lt;/a&gt;. Acesso em: 10 jan. 2024.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
      <category>braziliandevs</category>
      <category>computerscience</category>
    </item>
    <item>
      <title>Redux 101: gerenciadores de estados simplificados</title>
      <dc:creator>Roberto Costa</dc:creator>
      <pubDate>Wed, 03 Jan 2024 14:41:51 +0000</pubDate>
      <link>https://dev.to/robertheory/redux-101-480j</link>
      <guid>https://dev.to/robertheory/redux-101-480j</guid>
      <description>&lt;p&gt;Estados complexos são um desafio, então você decide usar Redux, mas encontra outro desafio: &lt;strong&gt;&lt;em&gt;entender o Redux&lt;/em&gt;&lt;/strong&gt;. Mas hoje vamos ver tudo que você precisa saber para começar bem com essa ferramenta!&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;O que é o Redux&lt;/li&gt;
&lt;li&gt;Quando devo utilizar&lt;/li&gt;
&lt;li&gt;Quando não devo utilizar&lt;/li&gt;
&lt;li&gt;
Como funciona o Redux

&lt;ul&gt;
&lt;li&gt;Arquitetura Flux&lt;/li&gt;
&lt;li&gt;
Mergulhando no Redux

&lt;ul&gt;
&lt;li&gt;Slices&lt;/li&gt;
&lt;li&gt;Os Reducers&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;

Mão na massa!

&lt;ul&gt;
&lt;li&gt;Funcionalidades&lt;/li&gt;
&lt;li&gt;
Implementação

&lt;ul&gt;
&lt;li&gt;1 Preparação&lt;/li&gt;
&lt;li&gt;2 Criando a Store&lt;/li&gt;
&lt;li&gt;3 Configurando o Provider&lt;/li&gt;
&lt;li&gt;4 Slices&lt;/li&gt;
&lt;li&gt;5 Reducers&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Ligado os dados aos componentes!&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;

Persistindo dados

&lt;ul&gt;
&lt;li&gt;Seletores personalizados&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Redux com NextJs&lt;/li&gt;

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

&lt;/ul&gt;

&lt;h2&gt;
  
  
  O que é o Redux &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Basicamente, Redux é uma solução para gerenciar estados, ele brilha de verdade quando temos que lidar com casos mais complexos como estados distribuídos e &lt;a href="https://www.alura.com.br/artigos/prop-drilling-no-react-js" rel="noopener noreferrer"&gt;Prop Drilling&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;De acordo com a sua &lt;a href="https://redux.js.org" rel="noopener noreferrer"&gt;documentação&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O Redux é um contêiner de estado previsível para aplicativos JavaScript.&lt;br&gt;
Ele ajuda a escrever aplicativos que se comportam de forma consistente, são executados em diferentes ambientes (cliente, servidor e nativo) e são fáceis de testar.&lt;br&gt;
Além disso, ele fornece uma ótima experiência de desenvolvedor, como a edição de código ao vivo combinada com um depurador que viaja no tempo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;E realmente, essa biblioteca é bem versátil em trabalhar com outras bibliotecas e frameworks de visualização, tornando uma ótima escolha para trabalhar com gerenciamento de estados.&lt;/p&gt;

&lt;p&gt;Contudo, é muito fácil fazer um uso equivocado desta ferramenta, devido a sua popularidade e praticidade, muitos projetos adicionam o Redux automaticamente sem refletir se realmente precisam disso.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quando devo utilizar &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Como muitas coisas no mundo da tecnologia, o melhor uso do Redux vem quando você percebe sua necessidade na aplicação, e alguns sinais disso são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Complexidade do Estado&lt;/strong&gt;:&lt;br&gt;
Se sua aplicação tem um estado complexo, com múltiplos componentes que precisam acessar e modificar esse estado, o Redux pode fornecer uma maneira mais organizada de gerenciar o estado global.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Compartilhamento de Estado&lt;/strong&gt;:&lt;br&gt;
Quando há a necessidade de compartilhar estado entre componentes que não têm uma relação pai-filho direta, o Redux oferece uma solução centralizada para acessar e modificar o estado.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fruhn99wnz9nzmn8iwrbq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fruhn99wnz9nzmn8iwrbq.png" alt="imagem de Componentes distantes" width="800" height="516"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Prop Drilling&lt;/strong&gt;:
Quando existe uma relação pai-filho, mas para passar o estado para o filho desejado você precisa passar por vários componentes filhos até chegar nele.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff33vgxvdicqeq51naebs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff33vgxvdicqeq51naebs.png" alt="imagem de Prop Drilling" width="800" height="510"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Quando não devo utilizar &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Aplicação pequena ou simples&lt;/strong&gt;:&lt;br&gt;
Se sua aplicação é pequena e possui requisitos de gerenciamento de estado simples, a introdução do Redux pode ser excessiva.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Curva de Aprendizado da Equipe&lt;/strong&gt;:&lt;br&gt;
Se sua equipe não tem familiaridade com o Redux e a curva de aprendizado é um fator crítico, pode ser mais sensato evitar a introdução desta ferramenta, especialmente se os benefícios esperados não justificarem o tempo de aprendizado.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ferramentas Alternativas&lt;/strong&gt;:&lt;br&gt;
Existem várias alternativas no que se diz respeito a gerenciar estados no ReactJS, dentre elas podemos citar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pmndrs/zustand" rel="noopener noreferrer"&gt;Zustand&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://recoiljs.org" rel="noopener noreferrer"&gt;Recoil&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mobx.js.org" rel="noopener noreferrer"&gt;MobX&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Mas existe algo melhor ainda: &lt;a href="https://react.dev/reference/react/createContext" rel="noopener noreferrer"&gt;React Context&lt;/a&gt; e &lt;a href="https://react.dev/reference/react/useReducer" rel="noopener noreferrer"&gt;useReducer hook&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nada melhor do que usar as ferramentas nativas do próprio ReactJS para resolver as questões que temos, assim podemos depender de menos bibliotecas externas e tornando nosso projeto mais simples.&lt;/p&gt;

&lt;p&gt;Apesar desta abordagem ser algo que eu destaco como ideal, ou pelo menos mais interassante, é assunto para outro artigo, já que hoje vamos falar de Redux.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como funciona o Redux &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Arquitetura Flux &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;A arquitetura do &lt;a href="https://facebookarchive.github.io/flux/" rel="noopener noreferrer"&gt;Flux&lt;/a&gt; foi proposta pelo Facebook para construção de SPAs que divide a aplicação nas seguintes partes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;View&lt;/strong&gt;: um componente React, ou Angular, etc;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action&lt;/strong&gt;: um evento que descreve a mudança que está ocorrendo e carrega os dados necessários;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dispatcher&lt;/strong&gt;: responsável por levar os eventos das actions até a &lt;code&gt;store&lt;/code&gt; responsável;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Store&lt;/strong&gt;: recebe os eventos e lida com as mudanças de estado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Importante ressaltar que:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O estado é imutável, logo não pode ser modificado diretamente;&lt;/li&gt;
&lt;li&gt;A única forma de atualizar o estado é através das actions e dispatchers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Criei um exemplo visual para entendermos como isso funciona:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fraocz91t22byxbsqf5r9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fraocz91t22byxbsqf5r9.png" alt="arquitura flux" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Neste exemplo, temos uma &lt;code&gt;store&lt;/code&gt; de carrinho de compras chamada &lt;code&gt;carrinho&lt;/code&gt; e algumas &lt;code&gt;actions&lt;/code&gt; que representam operações no carrinho.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flvllu743p9k2hdr5ws1t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flvllu743p9k2hdr5ws1t.png" alt="exemplo store flux" width="563" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Logo depois vamos usar nos nossos componentes React:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fctzbs14t5q26nkwps420.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fctzbs14t5q26nkwps420.png" alt="implementação do flux" width="800" height="567"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O componente &lt;code&gt;Carrinho&lt;/code&gt; está observando a &lt;code&gt;store&lt;/code&gt;, que contém  a lista de produtos do carrinho;&lt;/li&gt;
&lt;li&gt;O componente &lt;code&gt;Produto&lt;/code&gt; , bem distante do carrinho, vai acionar a &lt;code&gt;action&lt;/code&gt; chamada &lt;code&gt;adicionar ao carrinho&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;action&lt;/code&gt; vai ser recebida pelo &lt;code&gt;dispatcher&lt;/code&gt; que vai interagir com a &lt;code&gt;store&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;store&lt;/code&gt; recebe a &lt;code&gt;action&lt;/code&gt; e atualiza seu estado com o novo produto;&lt;/li&gt;
&lt;li&gt;O carrinho recebe o novo estado e se atualiza.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se você entendeu este fluxo, praticamente entendeu toda a lógica maior do Redux, pois ele segue fielmente esta arquitetura!&lt;/p&gt;

&lt;h3&gt;
  
  
  Mergulhando no Redux &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Agora que já falamos sobre a arquitetura por trás de tudo, vamos ver como que o Redux funciona de fato. Vamos ver alguns termos e conceitos a se familiarizar na prática desta ferramenta.&lt;/p&gt;

&lt;h4&gt;
  
  
  Slices &lt;a&gt;&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;É importante notar que a store é um estado "global" que contém outros estados, frequentemente chamados de "fatias" ou &lt;code&gt;slices&lt;/code&gt;, então o nosso estado de carrinho é um &lt;code&gt;slice&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fttf17sg504p8gyli7eyx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fttf17sg504p8gyli7eyx.png" alt="Redux Store" width="663" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Os Reducers &lt;a&gt;&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;Temos um novo jogador no campo, os reducers são funções super simples que  são utilizadas para atualizar o estado da aplicação.&lt;br&gt;
Eles tem responsabilidades e escopos muito bem definidos, assim como as actions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function addToCart(state, action) {  
  return {
     cart: [...state.cart, action.product]
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Mão na massa! &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Nada melhor do que um exemplo de código para entendermos como ligar nossa aplicação ReactJS com o Redux.&lt;/p&gt;

&lt;p&gt;Para este propósito fiz o seguinte projeto didático: &lt;a href="https://github.com/robertheory/react-state-management" rel="noopener noreferrer"&gt;React State Management 101&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Essa demo é uma loja fictícia onde temos duas funcionalidades básicas para atender: gerenciar favoritos e carrinho de compras.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxbstv5f3kcox4g4k0n1r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxbstv5f3kcox4g4k0n1r.png" alt="print de tela" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como nosso intuito aqui é a implementação do Redux, não vamos focar em detalhes como estilização..&lt;/p&gt;

&lt;h3&gt;
  
  
  Funcionalidades &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Antes mesmo de colocar a mão no código, precisamos entender as funcionalidades pretendidas nesta aplicação:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Favoritar
Adiciona o item à lista de favoritos.
Caso este item já seja um favorito, ele será removido da lista.&lt;/li&gt;
&lt;li&gt;Adicionar ao carrinho
Adiciona este item ao carrinho.
Caso este item já esteja no carrinho, sua quantidade deve ser incrementada.&lt;/li&gt;
&lt;li&gt;Remover do carrinho
Decrementa a quantidade do item no carrinho.
Caso o item tenha apenas 1 de quantidade, é removido do carrinho.&lt;/li&gt;
&lt;li&gt;Deletar do carrinho
Remove completamente o item do carrinho.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Implementação &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Entraremos agora em detalhes de implementação do projeto, contudo não vou demonstrar todas as funcionalidades, apenas a de favoritar para simplificar este exemplo.&lt;/p&gt;

&lt;h4&gt;
  
  
  1 Preparação &lt;a&gt;&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;Começando do zero em um projeto ReactJS recém criado, execute:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;yarn add @reduxjs/toolkit&lt;/code&gt;&lt;br&gt;
ou&lt;br&gt;
&lt;code&gt;npm install @reduxjs/toolkit&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Tendo em vista a atual implementação recomendada na documentação do &lt;a href="https://redux.js.org/" rel="noopener noreferrer"&gt;Redux&lt;/a&gt;, temos uma maneira mais interessante de seguir usando ReactJS: vamos utilizar o &lt;a href="https://react-redux.js.org/" rel="noopener noreferrer"&gt;React-Redux&lt;/a&gt;, uma forma de interagir melhor com os componentes React usando todo o poder da biblioteca original.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;yarn add react-redux&lt;/code&gt;&lt;br&gt;
ou&lt;br&gt;
&lt;code&gt;npm install react-redux&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Agora estamos prontos para o primeiro passo: criar a nossa Store!&lt;/p&gt;
&lt;h4&gt;
  
  
  2 Criando a Store &lt;a&gt;&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;A Store é o centro de tudo, a partir dela teremos nossos Slices e usaremos em toda a aplicação, é o coração do gerenciamento de estado.&lt;/p&gt;

&lt;p&gt;A partir da documentação oficial do React-Redux, temos o seguinte exemplo de código:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;src/store/index.ts&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;configureStore&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@reduxjs/toolkit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="c1"&gt;// ...&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;configureStore&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;reducer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;postsReducer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;comments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;commentsReducer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;users&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;usersReducer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// Infer the RootState and AppDispatch types from the store itself&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;RootState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;ReturnType&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getState&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;// Inferred type: {posts: PostsState, comments: CommentsState, users: UsersState}&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;AppDispatch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dispatch&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como ainda não temos nenhum Slice, vamos criar assim por enquanto:&lt;br&gt;
&lt;code&gt;src/store/index.ts&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;configureStore&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@reduxjs/toolkit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;configureStore&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;reducer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;


&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;RootState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;ReturnType&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getState&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;AppDispatch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dispatch&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com a Store criada, agora vamos para o próximo passo: configurar o Provider, assim toda aplicação poderá utilizar o Redux.&lt;/p&gt;

&lt;h4&gt;
  
  
  3 Configurando o Provider &lt;a&gt;&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;Este passo é o mais simples, nunca realmente vai mudar, apenas não esqueça pois é crucial.&lt;/p&gt;

&lt;p&gt;Seguindo a documentação oficial, envolva o seu App com o Provider do React-Redux e passe para ele a sua Store recém criada.&lt;br&gt;
&lt;code&gt;src/index.ts&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Provider&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-redux&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./store&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./App&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ReactDOM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createRoot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;root&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="nx"&gt;root&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Provider&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Provider&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora chegou a hora de criarmos nossos Slices, através deles teremos nossos estados e reducers que vão fazer a mágica acontecer.&lt;/p&gt;

&lt;h4&gt;
  
  
  4 Slices &lt;a&gt;&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;Dentro da pasta &lt;code&gt;store&lt;/code&gt; vamos criar nosso primeiro e mais simples Slice: &lt;code&gt;favoritesSlice.ts&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Antes de mais nada, gostaria de demonstrar a anatomia geral de um Slice, o que deve se repetir para todos os próximos:&lt;br&gt;
&lt;code&gt;src/store/favoritesSlice.ts&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createSlice&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@reduxjs/toolkit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;RootState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Movie&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../interfaces&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  

&lt;span class="c1"&gt;// declarei aqui o estado inicial para que assim pudesse inferir um tipo&lt;/span&gt;
&lt;span class="c1"&gt;// desta forma o slice irá aceitar apenas filmes em seu estado &lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;initialState&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Movie&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;  

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;favorites&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createSlice&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="c1"&gt;// nome identificador do slice&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;favorites&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;// estado inicial&lt;/span&gt;
    &lt;span class="nx"&gt;initialState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;reducers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// funções reducers&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
    &lt;span class="c1"&gt;// reducers&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;favorites&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// seletores (é uma forma de buscar dados dentro dos componentes react usando estas funções que podemos criar)&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getFavorites&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;RootState&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;favorites&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  
&lt;span class="c1"&gt;// RootState vai dar erro pois este slice ainda não está registrado na store, vamos ver a seguir...&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;favorites&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;reducer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como o Slice é apenas uma fatia do estado global, precisamos que ele se integre com a nossa Store criada anteriormente, e para isso faremos o seguinte:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;src/store/index.ts&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;configureStore&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@reduxjs/toolkit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;favorites&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./favoritesSlice&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;configureStore&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;reducer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;favorites&lt;/span&gt; &lt;span class="c1"&gt;// registrar o novo slice na Store&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// agora o RootState conhece o seu novo slice e deve corrigir o erro anterior&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;RootState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;ReturnType&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getState&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;AppDispatch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dispatch&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora que vimos como é a estrutura geral de uma Store, vamos à criação dos seus Reducers!&lt;/p&gt;

&lt;h4&gt;
  
  
  5 Reducers &lt;a&gt;&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;Vamos criar o reducer de favoritar, e como descrito anteriormente, ele deve funcionar como um botão de liga/desliga, então chamaremos de &lt;code&gt;toggleFavorite&lt;/code&gt;:&lt;br&gt;
&lt;code&gt;src/store/favoritesSlice.ts&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;favorites&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createSlice&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;favorites&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="nx"&gt;initialState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="na"&gt;reducers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// state: o estado de favoritos&lt;/span&gt;
    &lt;span class="c1"&gt;// action: a ação que está sendo realizada no slice, que por sua vez contém dados na em action.payload&lt;/span&gt;
    &lt;span class="na"&gt;toggleFavorite&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Movie&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// a payload é onde podemos passar dados para o nosso reducer&lt;/span&gt;
    &lt;span class="c1"&gt;// neste caso fiz obrigatório o envio de um dado do tipo Movie na payload&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findIndex&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;movie&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;movie&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  

        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;splice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Desta forma nosso primeiro reducer ganha vida, mas ainda não podemos usar ainda, temos que exportá-lo nas nossas actions:&lt;br&gt;
&lt;code&gt;src/store/favoritesSlice.ts&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;toggleFavorite&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;favorites&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E agora sim, nosso slice de favoritos está pronto para ser utilizado!&lt;/p&gt;

&lt;h3&gt;
  
  
  Ligado os dados aos componentes! &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;A página de favoritos é super simples, apenas iremos listar todos eles:&lt;br&gt;
&lt;code&gt;src/pages/favorites/index.tsx&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useSelector&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-redux&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Layout&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../../components/Layout&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;MovieCard&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../../components/MovieCard&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;getFavorites&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../../store/favoritesSlice&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Favorites&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="c1"&gt;// a função useSelector do react-redux é responsável por interpretar a função getFavorites e retornar os dados&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;favorites&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useSelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;getFavorites&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Layout&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Favorites&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;   
                &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;favorites&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;You&lt;/span&gt; &lt;span class="nx"&gt;don&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;t have any favorite movies&amp;lt;/p&amp;gt;
                ) : (
                    favorites.map((movie) =&amp;gt; &amp;lt;MovieCard key={movie.id} movie={movie} /&amp;gt;)
                )}
            &amp;lt;/div&amp;gt;
        &amp;lt;/Layout&amp;gt;
    );
};

export default Favorites;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Logo vamos seguir para onde acontece toda ação: no componente &lt;code&gt;MovieCard.tsx&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;src/components/MovieCard.tsx&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;FiHeart&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;FiShoppingCart&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-icons/fi&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useDispatch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useSelector&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-redux&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useNavigate&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-router-dom&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Movie&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../interfaces&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;getFavorites&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;toggleFavorite&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../store/favoritesSlice&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;MovieCardProps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;movie&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Movie&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;  

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;MovieCard&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;movie&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="nx"&gt;MovieCardProps&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;navigate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useNavigate&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// aqui utilizamos o useDispatch para que o Dispatcher do Redux possa executar os reducers que passarmos&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dispatch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useDispatch&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// novamente buscamos todos os favoritos com o seletor&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;favorites&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useSelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;getFavorites&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isFavorite&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;!!&lt;/span&gt;&lt;span class="nx"&gt;favorites&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;fav&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;fav&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;movie&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleAddToFavorites&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// aqui despachamos o reducer toggleFavorite passando os dados do filme em questão&lt;/span&gt;
        &lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;toggleFavorite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;movie&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;  

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Intl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;NumberFormat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;en-US&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;currency&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;USD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;movie&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;

    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;   
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;    
            &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;movie&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;img&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;movie&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cover&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;movie&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;   
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;span&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text-lg font-bold mr-auto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="na"&gt;Price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;price&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/span&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;    
                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;FiShoppingCart&lt;/span&gt; &lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;
            &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleAddToFavorites&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;isFavorite&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bg-red-500&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; 
                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;FiHeart&lt;/span&gt;
                    &lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
                    &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;isFavorite&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text-red-500&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;
        &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;navigate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`/movie/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;movie&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; 
        &lt;span class="nx"&gt;More&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;MovieCard&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora o componente &lt;code&gt;MovieCard&lt;/code&gt; é capaz e favoritar os filmes e nossa página de favoritos irá exibi-los, aparentemente está tudo funcionando, mas existe um pequeno problema: &lt;em&gt;Estados React são reiniciados quando a tela atualiza&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Persistindo dados &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Uma vez que os dados da nossa Store naturalmente serão jogados fora ao recarregar a página, precisamos que estes dados sejam armazenados localmente no navegador do usuário.&lt;/p&gt;

&lt;p&gt;Desta forma mesmo que feche o navegador ou desligue o computador, quando voltar para a aplicação seus favoritos estarão no mesmo lugar onde deixou.&lt;/p&gt;

&lt;p&gt;Em alguns casos esta questão é trivial, nem sempre existe a necessidade de armazenar estes dados, mas nesta aqui é super importante que eu persista estes favoritos.&lt;/p&gt;

&lt;p&gt;Mas a solução é simples: dentro do reducer, depois que atualizar o estado, utilize o localStore ou sessionStorage para armazenar estes dados no navegador do usuário, e no initialState é só buscar os dados no navegador!&lt;/p&gt;

&lt;p&gt;Em teoria sim, isso funciona, mas vai dar um trabalho enorme para implementar isso na mão, fora outras questões que existem.&lt;/p&gt;

&lt;p&gt;Mas não tem problema, temos o &lt;a href="https://github.com/rt2zz/redux-persist" rel="noopener noreferrer"&gt;Redux-Persist&lt;/a&gt;, uma solução completa e simplista para persistir os dados do seu Redux.&lt;/p&gt;

&lt;p&gt;Vamos à implementação:&lt;/p&gt;

&lt;p&gt;Primeiro instale o pacote:&lt;br&gt;
&lt;code&gt;yarn add redux-persist&lt;/code&gt;&lt;br&gt;
ou&lt;br&gt;
&lt;code&gt;npm i redux-persist&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;O passo essencial agora é adaptar nossa Store para usar o Redux Persist:&lt;br&gt;
&lt;code&gt;src/store/index.ts&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;combineReducers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;configureStore&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@reduxjs/toolkit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;persistReducer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;persistStore&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;redux-persist&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;storage&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;redux-persist/lib/storage&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;cart&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./cartSlice&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;favorites&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./favoritesSlice&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// configuração básica do redux-persist&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;persistConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;root&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;// podemos utilizar outras formas de armazenamento, mas a padrão utiliza a localStorage do navegador&lt;/span&gt;
    &lt;span class="nx"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// vamos mudar a forma como recebemos os reducers&lt;/span&gt;
&lt;span class="c1"&gt;// agora combinamos todos os reducers em um único&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rootReducer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;combineReducers&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="nx"&gt;favorites&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// o persistedReducer vai comportar dos nossos reducers e com as configurações apropriadas que definimos&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;persistedReducer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;persistReducer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;persistConfig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;rootReducer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// a store é finalmente criada com nosso reducer especial&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;configureStore&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;reducer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;persistedReducer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// responsável por persistir os dados da store&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;persistor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;persistStore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;RootState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;ReturnType&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getState&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;AppDispatch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E por último, vamos configurar o provider do Redux-Persist:&lt;br&gt;
&lt;code&gt;src/index.ts&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Provider&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-redux&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;PersistGate&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;redux-persist/integration/react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;persistor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../store&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ReactDOM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createRoot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;root&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="nx"&gt;root&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="c1"&gt;// o mesmo provider que utilizamos antes&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Provider&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="c1"&gt;// agora temos que passar o PersistGate em volta da aplicação&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;PersistGate&lt;/span&gt; &lt;span class="nx"&gt;loading&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;persistor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;persistor&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/PersistGate&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Provider&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simples assim, agora os dados irão naturalmente persistir no localStorage.&lt;/p&gt;

&lt;p&gt;Ainda sim vale a pena que você se familiarize com temas comuns do Redux-Persist como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Blacklist: uma lista dos slices que não devem ser permitidos persistir&lt;/li&gt;
&lt;li&gt;Whitelist: uma lista dos únicos slices que devem persistir&lt;/li&gt;
&lt;li&gt;stateReconciler: Os reconciliadores de estado definem como o estado de entrada é mesclado com o estado inicial&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Todos estes temas você encontra na &lt;br&gt;
&lt;a href="https://github.com/rt2zz/redux-persist" rel="noopener noreferrer"&gt;documentação oficial do Redux-Persist&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Seletores personalizados &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Este ponto é bem simples mas ainda sim gostaria de trazer atenção para ele pois seu bom uso é extremamente benéfico no React.&lt;/p&gt;

&lt;p&gt;Esta pequena função a seguir faz parte do exemplo dado acima na criação do slice.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;app/store/favoritesSlice.ts&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getFavorites&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;RootState&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;favorites&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo apenas retornamos todos os favoritos disponíveis no slice, mas podemos realizar diversas modificação de acordo com a necessidade, como por exemplo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;app/store/favoritesSlice.ts&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// passando algum parâmetro&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getSortedFavorites&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sorting&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;asc&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;desc&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;RootState&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;favorites&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="cm"&gt;/* função para ordenar */&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                                                                        &lt;span class="c1"&gt;// Editando o retorno                                                   &lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getFormattedFavorites&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;RootState&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;favorites&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="cm"&gt;/* função para formatar os dados */&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Redux com NextJS &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Existe um pequeno problema ao utilizar Redux com NextJS:&lt;/p&gt;

&lt;p&gt;NextJS é executado no lado do cliente e no lado do servidor, e no lado do servidor &lt;em&gt;NÃO EXISTE WEB STORAGE&lt;/em&gt;!&lt;/p&gt;

&lt;p&gt;Contudo ainda tem solução: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quando a aplicação for executada no lado do cliente utilizaremos o storage padrão;&lt;/li&gt;
&lt;li&gt;Quando a aplicação for executada no lado do servidor utilizaremos o storage fake.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nossas funções do Redux estão sendo utilizadas apenas no lado do cliente, mas mesmo assim, encontraremos erros em tempo de execução devido a natureza de Server Side Rendering do NextJS.&lt;/p&gt;

&lt;p&gt;Logo, vamos criar nosso novo storage:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;src/store/storage.ts&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;createWebStorage&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;redux-persist/lib/storage/createWebStorage&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;createNoopStorage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;getItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="nf"&gt;setItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="nf"&gt;removeItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;storage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;undefined&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
        &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nf"&gt;createWebStorage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;local&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;createNoopStorage&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E assim atualizamos a nossa Store:&lt;br&gt;
&lt;code&gt;src/store/index.ts&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="c1"&gt;// importação atualizada&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;storage&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./storage&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;persistConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;root&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gerenciamento avançado de estados é um tema crucial quando se fala de desenvolvimento web, compreender e utilizar a ferramenta Redux e outros semelhantes me ajudou bastante para desenvolver softwares mais sofisticados e complexos.&lt;/p&gt;

&lt;p&gt;Espero que tenham gostado desta super introdução ao tema e à ferramenta.&lt;br&gt;
Se quiser deixar alguma nota, complementar em algo ou se houver alguma ideia interessante, não deixe de compartilhar comigo.&lt;/p&gt;

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

&lt;p&gt;Dias, D. L. (2022, 20 de fevereiro). Flux: A arquitetura JavaScript que funciona. Medium. &lt;a href="https://dayvsonlima.medium.com/flux-a-arquitetura-javascript-que-funciona-1197857464b8" rel="noopener noreferrer"&gt;https://dayvsonlima.medium.com/flux-a-arquitetura-javascript-que-funciona-1197857464b8&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;FreeCodeCamp.org. (2022, 2 de agosto). Evite prop drilling em React. FreeCodeCamp.org. &lt;a href="https://www.freecodecamp.org/news/avoid-prop-drilling-in-react/" rel="noopener noreferrer"&gt;https://www.freecodecamp.org/news/avoid-prop-drilling-in-react/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Redux.js.org. (s.d.). Redux. Redux.js.org. &lt;a href="https://redux.js.org/" rel="noopener noreferrer"&gt;https://redux.js.org/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;React-redux.js.org. (s.d.). React-redux. React-redux.js.org. &lt;a href="https://react-redux.js.org/" rel="noopener noreferrer"&gt;https://react-redux.js.org/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;FreeCodeCamp.org. (2022, 12 de março). O que é Redux store, ações e redutores explicados. FreeCodeCamp.org. &lt;a href="https://www.freecodecamp.org/news/what-is-redux-store-actions-reducers-explained/" rel="noopener noreferrer"&gt;https://www.freecodecamp.org/news/what-is-redux-store-actions-reducers-explained/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub. (s.d.). redux-persist. GitHub. &lt;a href="https://github.com/rt2zz/redux-persist" rel="noopener noreferrer"&gt;https://github.com/rt2zz/redux-persist&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>redux</category>
      <category>javascript</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>SOLID no Frontend: Design de Software no ReactJS</title>
      <dc:creator>Roberto Costa</dc:creator>
      <pubDate>Sat, 18 Nov 2023 10:37:40 +0000</pubDate>
      <link>https://dev.to/robertheory/solid-no-frontend-design-de-software-no-reactjs-9n5</link>
      <guid>https://dev.to/robertheory/solid-no-frontend-design-de-software-no-reactjs-9n5</guid>
      <description>&lt;p&gt;Começar um novo projeto é o caminho fácil, o desafio vem em manter este projeto saudável ao longo do tempo.&lt;/p&gt;

&lt;p&gt;Aqui trarei exemplos de conceito e código, demonstrando como aplicar os tão famosos princípios SOLID no frontend para uma aplicação sustentável e resistente ao tempo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table Of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;O Problema do ReactJS...&lt;/li&gt;
&lt;li&gt;Resolvendo alguns problemas&lt;/li&gt;
&lt;li&gt;
Aplicando SOLID no ReactJS

&lt;ul&gt;
&lt;li&gt;&lt;a href="//#chapter-3.1"&gt;Single Responsability Principle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="//#chapter-3.2"&gt;Open-Closed Principle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="//#chapter-3.3"&gt;Liskov Substituition Principle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="//#chapter-3.4"&gt;Interface Segregation Principle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="//#chapter-3.5"&gt;Dependency Inversion Principle&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  O Problema do ReactJS... &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F04b5clsdy52u1wugqf5h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F04b5clsdy52u1wugqf5h.png" alt="React projects begin easy and angular begin hard, after 1 year the situation shifts"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na verdade o que vou falar aqui não em si um problema, mas uma característica que pode ser problemática:&lt;/p&gt;

&lt;h3&gt;
  
  
  Flexibilidade
&lt;/h3&gt;

&lt;p&gt;A flexibilidade do React é algo notável, uma vez que essa biblioteca permite realizar escolhas para cada peça do quebra-cabeça que é o nosso frontend.&lt;/p&gt;

&lt;p&gt;Essa flexibilidade é um ponto chave para o React, ela te permite realizar os mais diversos casos de uso e usar a sua criatividade de forma abundante no código.&lt;/p&gt;

&lt;p&gt;No entanto isso não é apenas um ponto positivo...&lt;/p&gt;

&lt;p&gt;Frequentemente aplicações ReactJS chegam em um ponto onde a manutenção é dificultosa, repetindo-se muito código e tendo bastante retrabalho, e se você ainda não viu isso ocorrendo, temos 3 possibilidades para considerar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Seu projeto é muito novo;&lt;/li&gt;
&lt;li&gt;Seu projeto é pequeno;&lt;/li&gt;
&lt;li&gt;Existe alguém cuidando da arquitetura e design de código do seu frontend.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quando falamos de design de código e arquitetura de software estamos indo muito além de estrutura de pastas.&lt;/p&gt;

&lt;p&gt;No frontend, mais especificamente no ReactJS, esses conceitos têm um lugar especial, uma vez que essa biblioteca não oferece uma estrutura opinada pensada para escalar e ser de fácil manutenção, ela deixa tudo para você decidir, o que para muitas pessoas não é realmente recomendado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resolvendo alguns problemas &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;A componentização é uma mão na roda na hora de programar interfaces, mas criar componentes cegamente não ajuda em nada.&lt;/p&gt;

&lt;p&gt;Uma coisa que você já deve ter percebido é que a forma como seus componentes se relacionam está diretamente ligada a qualidade do seu frontend.&lt;/p&gt;

&lt;p&gt;Algumas más práticas que existem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prop Drilling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quando um componente pai passa um estado para o filho, que passa para seu filho, que passa para seu filho, que passa para seu filho, etc.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Context APIs desnecessárias&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Já criou um contexto e depois percebeu que está sendo sub utilizado, ou que não faz sentido usar na aplicação inteira?&lt;br&gt;
A melhor forma aqui é ver aplicações maiores e sua utilização de seus próprios contextos, pode ser esclarecedor.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pacotes desnecessários&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Calma ai, quer dizer que você precisa baixar um pacote para validar um CPF que poderia utilizar uma RegExp?&lt;br&gt;
Tem alguma vantagem em usar o Axios ao invés da Fetch API?&lt;br&gt;
Pergunte-se, entenda o uso de cada coisa e saiba suas alternativas.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hooks usados de forma errada ou sub utilizados&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por vezes um hook mal implementado pode fazer com que algumas requisições seja feitas a mais ou que algum regra da sua aplicação não seja devidamente validada, obviamente podemos chegar a problemas de segurança e de desempenho aqui.&lt;/p&gt;

&lt;p&gt;Requisitos para mandar bem no design de código no ReactJS:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Dominar a base: JavaScript ou TypeScript;&lt;/li&gt;
&lt;li&gt;React Hooks;&lt;/li&gt;
&lt;li&gt;Context API;&lt;/li&gt;
&lt;li&gt;Conheça o terreno: saiba as opções de pacotes que tem para fazer cada função.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  1. Dominar a base
&lt;/h3&gt;

&lt;p&gt;Essa não é difícil de explicar: seja JS ou TS, se você não estiver seguro do que está fazendo e se não tiver algum conhecimento prévio de estruturas de dados e do funcionamento dessas tecnologias isso torna-se um fator limitante muito grande.&lt;br&gt;
Conforme você verá aqui, alguns conceitos são mais abstratos que outros, e certas abstrações ficam mais simples de se entender depois de um certo tempo batendo a cabeça no código ou sentindo a necessidade natural de resolver um problema no código.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. React Hooks
&lt;/h3&gt;

&lt;p&gt;Sim, todo dia lança um React Hook novo e você vai ter mesmo que ficar se atualizando nisso???&lt;br&gt;
Infelizemente você está na área de tecnologia, se atulizar é algo intrínseco da sua carreira.&lt;br&gt;
Mas olhe por esse lado:&lt;br&gt;
Os Hooks são seus aliados, eles resolvem problemas muito importantes do ciclo de vida do React, se existe um novo Hook  provavelmente ele vai resolver um problema interessante e pode te ajudar em algo, então pelo menos saiba o que eles fazem, isso já é de grande ajuda.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Context API
&lt;/h3&gt;

&lt;p&gt;A amada Context API é uma ferramenta sensacional que temos no ReactJS para criar nossos próprios contextos e disponibilizá-los por toda aplicação ou onde acharmos necessário.&lt;br&gt;
Qual a importância dela?&lt;br&gt;
Criando nossos próprios contextos podemos atingir várias metas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Diminuir repetição de código;&lt;/li&gt;
&lt;li&gt;Concentrar o controle de uma funcionlidade em um só lugar;&lt;/li&gt;
&lt;li&gt;Criar abstrações de alto nível;&lt;/li&gt;
&lt;li&gt;Gerenciar melhor o ciclo de vida da aplicação.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Conheça o terreno
&lt;/h3&gt;

&lt;p&gt;Conhecer onde está pisando te dá maior segurança para seguir em frente.&lt;br&gt;
Entender melhor do ecossistema do ReactJS e do JavaScript é essencial para que você encontre as peças certas para seu quebra-cabeça.&lt;br&gt;
Como temos muitas opções, é muito importante que você pelo menos esteja ciente dos prós e contras das principais para tomar decisões conscientes..&lt;br&gt;
Algumas das decições que temos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CSS: CSS, CSS Modules, SASS, Styled-Components, TailwindCSS;&lt;/li&gt;
&lt;li&gt;Gerenciamento de estado: Redux, Recoil, nenhuma hahaha&lt;/li&gt;
&lt;li&gt;Router: React Router Dom, Appwrite&lt;/li&gt;
&lt;li&gt;Testes: Jest, Cypress, Playwright, Selenium&lt;/li&gt;
&lt;li&gt;Formulários: React Hook Form, Formik, Redux-form&lt;/li&gt;
&lt;li&gt;HTTP requests: Fetch API, Axios&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nossa, são muitas opções mesmo!&lt;br&gt;
Não listei todas, apenas algumas mais conhecidas, mas deu para entender que, pela variedade, temos muitas coisas no nosso cinto de utilidades.&lt;/p&gt;

&lt;h2&gt;
  
  
  SOLID no ReactJS &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Agora chegou a hora, chega de enrolação, vamos falar de como aplicar os princípios SOLID para deixar seu frontend mais sênior!&lt;/p&gt;

&lt;p&gt;Os conceitos SOLID estão diretamente ligados à &lt;code&gt;Programação Orientada a Objetos&lt;/code&gt;, logo é interessante que você seja familiar com esses conceitos para tirar melhor proveito deste conteúdo.&lt;/p&gt;

&lt;p&gt;Todos os exemplos de código são parte do repositório que criei para este artigo: &lt;a href="https://github.com/robertheory/solid-react-js" rel="noopener noreferrer"&gt;https://github.com/robertheory/solid-react-js&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Os exemplos são inspirados em situações reais e também nas referências ao final do artigo.&lt;/p&gt;

&lt;h3&gt;
  
  
  S — Single Responsibility &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Seus componentes deve ter responsabilidades bem definidas e isoladas.&lt;/p&gt;

&lt;p&gt;Se o seu componente faz muita coisa, pode ser uma boa oportunidade de componentizar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvzsl0tkevnb5yluiadcc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvzsl0tkevnb5yluiadcc.png" alt="Single Responsibility"&gt;&lt;/a&gt;&lt;br&gt;
*All illustrations in this article are by &lt;a href="https://medium.com/@ugonnat" rel="noopener noreferrer"&gt;Ugonna Thelma&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;br&gt;
Neste exemplo, apresento um componente consulta em API e ordenação de resultados que concetra toda a lógica da funcionalidade em si próprio:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const SearchAndSort = () =&amp;gt; {
  const [sorting, setSorting] = useState&amp;lt;'asc' | 'desc'&amp;gt;('asc');

  const [search, setSearch] = useState&amp;lt;string&amp;gt;('');

  const [data, setData] = useState&amp;lt;any[]&amp;gt;([]);

  const [loading, setLoading] = useState&amp;lt;boolean&amp;gt;(false);

  const [error, setError] = useState&amp;lt;string&amp;gt;('');

  const handleSort = () =&amp;gt; {
    setSorting(sorting === 'asc' ? 'desc' : 'asc');
  };

  const handleSearch = async () =&amp;gt; {
    try {
      setLoading(true);
      const response = await fetch(
        `https://jsonplaceholder.typicode.com/todos?title=${search}`
      );

      const data = await response.json();

      if (!response.ok) {
        throw new Error('Something went wrong');
      }

      setData(data);
    } catch (error) {
      setError(error.message);
    } finally {
      setLoading(false);
    }
  };

  if (loading) {
    return &amp;lt;div&amp;gt;Loading...&amp;lt;/div&amp;gt;;
  }

  if (error) {
    return (
      &amp;lt;div&amp;gt;
        {error}

        &amp;lt;button onClick={() =&amp;gt; setError('')}&amp;gt;Retry&amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
    );
  }

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;div&amp;gt;
        &amp;lt;input
          type='text'
          value={search}
          onChange={(e) =&amp;gt; setSearch(e.target.value)}
        /&amp;gt;
        &amp;lt;button onClick={handleSearch} disabled={loading}&amp;gt;
          Search
        &amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div&amp;gt;
        &amp;lt;button onClick={handleSort}&amp;gt;Sort&amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div&amp;gt;
        {data.map((item, index) =&amp;gt; (
          &amp;lt;div key={index}&amp;gt;{item.title}&amp;lt;/div&amp;gt;
        ))}
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Ele é candidato a ser dividido em várias partes, podemos citar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Acesso à API e retorno de dados;&lt;/li&gt;
&lt;li&gt;Interação com a busca e feedback visual;&lt;/li&gt;
&lt;li&gt;Apresentação do resultado;&lt;/li&gt;
&lt;li&gt;Ordenação do resultado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cada um destes itens é passível de se tornar um novo componente, onde podemos isolar completamente a sua lógica dentro de si para que os datalhes de implementação sejam abstraídos.&lt;/p&gt;

&lt;p&gt;O caso de &lt;code&gt;Acesso à API e retorno de dados&lt;/code&gt; é até mais interessante pois ele nem mesmo tem a ncessidade de ser um componente, pode ser uma função separada que recebe o input de busca e retorna os resultados, dessa forma, o componente que utilizar essa função, nem mesmo precisa saber como que os dados estão sendo buscados, criando uma abstração maior ainda e um menor acoplamento a métodos de busca de dados (RestAPI, GraphQL, FileSystem, etc).&lt;/p&gt;

&lt;p&gt;Segue o exemplo após a refatoração:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const seachToDos = async (search: string) =&amp;gt; {
  const response = await fetch(
    `https://jsonplaceholder.typicode.com/todos?title=${search}`
  );

  const data = (await response.json()) as Todo[];

  if (!response.ok) {
    throw new Error('Something went wrong');
  }

  return data;
};

const SearchComponent = ({
  onSearch,
}: {
  onSearch: (todos: Todo[]) =&amp;gt; void;
}) =&amp;gt; {
  const [search, setSearch] = useState&amp;lt;string&amp;gt;('');
  const [loading, setLoading] = useState&amp;lt;boolean&amp;gt;(false);
  const [error, setError] = useState&amp;lt;string&amp;gt;('');

  const handleSearch = async () =&amp;gt; {
    try {
      setLoading(true);

      const data = await seachToDos(search);

      onSearch(data);
    } catch (error) {
      setError(error.message);
    } finally {
      setLoading(false);
    }
  };

  if (loading) {
    return &amp;lt;div&amp;gt;Loading...&amp;lt;/div&amp;gt;;
  }

  if (error) {
    return (
      &amp;lt;div&amp;gt;
        {error}

        &amp;lt;button onClick={() =&amp;gt; setError('')}&amp;gt;Retry&amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
    );
  }

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;input
        type='text'
        value={search}
        onChange={(e) =&amp;gt; setSearch(e.target.value)}
      /&amp;gt;
      &amp;lt;button onClick={handleSearch} disabled={loading}&amp;gt;
        Search
      &amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

const ListTodoComponent = ({ todos }: { todos: Todo[] }) =&amp;gt; (
  &amp;lt;div&amp;gt;
    {todos.map((item, index) =&amp;gt; (
      &amp;lt;div key={index}&amp;gt;
        &amp;lt;h1&amp;gt;{item.title}&amp;lt;/h1&amp;gt;
        &amp;lt;p&amp;gt;{item.completed ? 'Completed' : 'Not completed'}&amp;lt;/p&amp;gt;
      &amp;lt;/div&amp;gt;
    ))}
  &amp;lt;/div&amp;gt;
);

const SearchAndSort = () =&amp;gt; {
  const [sorting, setSorting] = useState&amp;lt;'asc' | 'desc'&amp;gt;('asc');

  const [data, setData] = useState&amp;lt;Todo[]&amp;gt;([]);

  const handleSort = () =&amp;gt; {
    setSorting(sorting === 'asc' ? 'desc' : 'asc');
  };

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;SearchComponent onSearch={setData} /&amp;gt;

      &amp;lt;button onClick={handleSort}&amp;gt;Sort&amp;lt;/button&amp;gt;

      &amp;lt;ListTodoComponent todos={data} /&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  O — Open-Closed &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Componentes devem ser abertos para extensão e fechados para modificação.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1e287wroeusvowam63ah.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1e287wroeusvowam63ah.png" alt="Open-Closed"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Neste exemplo, trago um simples botão com ícone que deve variar entre os tipos &lt;code&gt;add&lt;/code&gt; e &lt;code&gt;remove&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A depender do tipo do botão, o ícone e a cor devem mudar, contudo essa implementação se torna bem problemática ao passo de que você precisa adicionar mais variantes para este botão.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type ButtonProps = {
  type: 'add' | 'remove';
  text: string;
};


const ButtonWithIcon = ({ type, text }: ButtonProps) =&amp;gt; {
  const buttonStyles = {
    backgroundColor: type === 'add' ? 'green' : 'red',
    color: 'white',
    padding: '10px 20px',
    border: 'none',
    borderRadius: '5px',
    cursor: 'pointer',
  };

  return (
    &amp;lt;&amp;gt;
      &amp;lt;button style={buttonStyles}&amp;gt;{text}&amp;lt;/button&amp;gt;
      {type === 'add' &amp;amp;&amp;amp; &amp;lt;i className='material-icons'&amp;gt;add&amp;lt;/i&amp;gt;}
      {type === 'remove' &amp;amp;&amp;amp; &amp;lt;i className='material-icons'&amp;gt;remove&amp;lt;/i&amp;gt;}
    &amp;lt;/&amp;gt;
  );
};

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Em um cenário onde há a necessidade de se criar mais variantes para este mesmo botão, acabaria ficando inviável e extremamente verboso adicionar cada vez mais condicionais dentro dele.&lt;/p&gt;

&lt;p&gt;A solução é simples: vamos tornar o componente extensível!&lt;/p&gt;

&lt;p&gt;Tornar o componente extensível significa que os detalhes sobre a variante do botão ficarão totalmente a encargo de quem o implementar, vejamos melhor no exemplo a seguir:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type ButtonProps = {
  text: string;
  icon: string;
  color: string;
};

const ButtonWithIconExtended = ({ color, icon, text }: ButtonProps) =&amp;gt; {
  const buttonStyles = {
    backgroundColor: color,
    color: 'white',
    padding: '10px 20px',
    border: 'none',
    borderRadius: '5px',
    cursor: 'pointer',
  };

  return (
    &amp;lt;&amp;gt;
      &amp;lt;button style={buttonStyles}&amp;gt;{text}&amp;lt;/button&amp;gt;
      &amp;lt;i className='material-icons'&amp;gt;{icon}&amp;lt;/i&amp;gt;
    &amp;lt;/&amp;gt;
  );
};

export const App = () =&amp;gt; {
  return (
    &amp;lt;div&amp;gt;
      &amp;lt;ButtonWithIconExtended color='green' icon='add' text='Add' /&amp;gt;
      &amp;lt;ButtonWithIconExtended color='red' icon='delete' text='Delete' /&amp;gt;
      &amp;lt;ButtonWithIconExtended color='blue' icon='edit' text='Edit' /&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Após refatorar o código do botão, teremos um componente que será não só menor e mais legível, como também permitirá maior flexibilidade na sua implementação.&lt;/p&gt;

&lt;h3&gt;
  
  
  L — Liskov Substitution &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Essa explicação pode ser um pouco confusa, mas já te explico como que funciona.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Se um componente do tipo S é uma representação do componente T, então componentes do tipo T devem poder ser substituidos pelo componente S sem alterar o funcionamento desejado da aplicação.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F59llpurlycdli96e909k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F59llpurlycdli96e909k.png" alt="Liskov Substitution"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Basicamente, se você está criando a sua própria versão de um elemento, por exemplo, um &lt;code&gt;input&lt;/code&gt; então o seu novo componente deve ser capaz de substituir um input comum e continuar funcionando.&lt;/p&gt;

&lt;p&gt;Vamos ver na prática com este exemplo &lt;code&gt;errado&lt;/code&gt; antes de refatorar:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type PrettyInputProps = {
  isLarge: boolean;
};

const PrettyInput = ({ isLarge }: PrettyInputProps) =&amp;gt; (
  &amp;lt;div
    style={{
      backgroundColor: 'white',
      border: '1px solid #ccc',
      borderRadius: '5px',
      padding: '10px',
      width: isLarge ? '300px' : '100px',
    }}
  &amp;gt;
    &amp;lt;input type='text' style={{ width: '100%' }} /&amp;gt;
  &amp;lt;/div&amp;gt;
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Este componente JAMAIS poderia substituir verdadeiramente um input, pois se você tentar fazer isso daqui:&lt;br&gt;
&lt;code&gt;&amp;lt;PrettyInput type="button" onChange={someFunction}/&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Isso nunca funcionaria pois seu componente desconhece tais propriedades que são intrísecas ao &lt;code&gt;HTMLInput&lt;/code&gt; comum.&lt;/p&gt;

&lt;p&gt;Para resolver isto é bem simples, basta extender seu componente para herdar as propriedades de um &lt;code&gt;HTMLInput&lt;/code&gt; e repassar essas &lt;code&gt;props&lt;/code&gt; para o devido input:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interface PrettyInputProps extends React.HTMLAttributes&amp;lt;HTMLInputElement&amp;gt; {
  isLarge: boolean;
}

const PrettyInput = ({ isLarge, ...rest }: PrettyInputProps) =&amp;gt; (
  &amp;lt;div
    style={{
      backgroundColor: 'white',
      border: '1px solid #ccc',
      borderRadius: '5px',
      padding: '10px',
      width: isLarge ? '300px' : '100px',
    }}
  &amp;gt;
    &amp;lt;input type='text' style={{ width: '100%' }} {...rest} /&amp;gt;
  &amp;lt;/div&amp;gt;
);

export const App = () =&amp;gt; (
  &amp;lt;div&amp;gt;
    &amp;lt;PrettyInput isLarge={true} placeholder='Type something...' /&amp;gt;
    &amp;lt;PrettyInput isLarge={false} onChange={console.log} /&amp;gt;
    &amp;lt;PrettyInput isLarge={false} onLoad={console.log} /&amp;gt;
  &amp;lt;/div&amp;gt;
);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  I — Interface Segregation &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Componentes não deveriam depender de &lt;code&gt;props&lt;/code&gt; que eles não utilizam&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp11bo1hoxqgsv7ssbk2l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp11bo1hoxqgsv7ssbk2l.png" alt="Interface Segregation"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Veja o seguinte exemplo:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type SimpleCardProps = {
  user: {
    fullName: string;
    firstName: string;
    lastName: string;
    state: string;
    country: string;
    cellphone: string;
    email: string;
    avatar: string;
    description: string;
  };
};

const Avatar = ({ user }: SimpleCardProps) =&amp;gt; (
  &amp;lt;div
    style={{
      backgroundColor: 'white',
      border: '1px solid #ccc',
      borderRadius: '50%',
      padding: '10px',
      width: '100px',
    }}
  &amp;gt;
    &amp;lt;img src={user.avatar} alt='description' /&amp;gt;
  &amp;lt;/div&amp;gt;
);

const SimpleCard = ({ user }: SimpleCardProps) =&amp;gt; {
  return (
    &amp;lt;div&amp;gt;
      &amp;lt;h2&amp;gt;{user.fullName}&amp;lt;/h2&amp;gt;
      &amp;lt;Avatar user={user} /&amp;gt;
      &amp;lt;p&amp;gt;{user.description}&amp;lt;/p&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Este exemplo é mais ingênuo, contudo esta necessidade se torna mais evidente em componentes maiores e que se utilizam de muitos dados.&lt;/p&gt;

&lt;p&gt;Basicamente, o componente de Avatar não tem nenhuma necessidade de entender outros detalhes do usuário, desde que ele utiliza apenas a URL da imagem, ele nem mesmo deveria conhecer o tipo do usuário.&lt;/p&gt;

&lt;p&gt;Segue o exemplo refatorado:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type SimpleCardProps = {
  user: {
    fullName: string;
    firstName: string;
    lastName: string;
    state: string;
    country: string;
    cellphone: string;
    email: string;
    avatarUrl: string;
    description: string;
  };
};

const Avatar = ({ avatarUrl }: { avatarUrl: string }) =&amp;gt; (
  &amp;lt;div
    style={{
      backgroundColor: 'white',
      border: '1px solid #ccc',
      borderRadius: '50%',
      padding: '10px',
      width: '100px',
    }}
  &amp;gt;
    &amp;lt;img src={avatarUrl} alt='description' /&amp;gt;
  &amp;lt;/div&amp;gt;
);

const SimpleCard = ({ user }: SimpleCardProps) =&amp;gt; {
  return (
    &amp;lt;div&amp;gt;
      &amp;lt;h2&amp;gt;{user.fullName}&amp;lt;/h2&amp;gt;
      &amp;lt;Avatar avatarUrl={user.avatarUrl} /&amp;gt;
      &amp;lt;p&amp;gt;{user.description}&amp;lt;/p&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Após uma simples refatoração, podemos ver que o componente de Avatar agora não depende do tipo do usuário, apenas necessita de receber uma URL, podendo ser utilizado em outros contextos, diminuindo o acomplamento com o Card de usuário.&lt;/p&gt;

&lt;h3&gt;
  
  
  D — Dependency Inversion &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Componetes genéricos devem depender de abstrações e não de implementações.&lt;/p&gt;

&lt;p&gt;Os detalhes de implementação devem ser de responsabilidade do componente pai.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flmi29yz4k5tkhbnk7a0u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flmi29yz4k5tkhbnk7a0u.png" alt="Dependency Inversion"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para este exemplo vamos começar com um componente de formulário simples:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const SimpleSimpleForm = () =&amp;gt; {
  const [username, setUsername] = React.useState('');
  const [password, setPassword] = React.useState('');
  const [error, setError] = React.useState('');
  const [loading, setLoading] = React.useState(false);

  const handleSubmit = (e: React.FormEvent&amp;lt;HTMLFormElement&amp;gt;) =&amp;gt; {
    e.preventDefault();
    setLoading(true);
    setError('');

    fetch('https://reqres.in/api/login', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ email: username, password }),
    })
      .then((res) =&amp;gt; res.json())
      .then((res) =&amp;gt; {
        setLoading(false);
        if (res.error) {
          setError(res.error);
          return;
        }
        console.log(res);
      })
      .catch((err) =&amp;gt; {
        setLoading(false);
        setError(err.message);
      });
  };

  if (loading) {
    return &amp;lt;div&amp;gt;Loading...&amp;lt;/div&amp;gt;;
  }

  if (error) {
    return (
      &amp;lt;div&amp;gt;
        {error}
        &amp;lt;button onClick={() =&amp;gt; setError('')}&amp;gt;Reset&amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
    );
  }

  return (
    &amp;lt;form onSubmit={handleSubmit}&amp;gt;
      &amp;lt;div&amp;gt;
        &amp;lt;label htmlFor='username'&amp;gt;Username&amp;lt;/label&amp;gt;
        &amp;lt;input
          type='text'
          id='username'
          value={username}
          onChange={(e) =&amp;gt; setUsername(e.target.value)}
        /&amp;gt;
      &amp;lt;/div&amp;gt;

      &amp;lt;div&amp;gt;
        &amp;lt;label htmlFor='password'&amp;gt;Password&amp;lt;/label&amp;gt;
        &amp;lt;input
          type='password'
          id='password'
          value={password}
          onChange={(e) =&amp;gt; setPassword(e.target.value)}
        /&amp;gt;
      &amp;lt;/div&amp;gt;

      &amp;lt;button type='submit'&amp;gt;Login&amp;lt;/button&amp;gt;
    &amp;lt;/form&amp;gt;
  );
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Num cenário onde temos que reutilizar este componente em diversos locais da aplicação, mas a depender do local, a função de submit vai precisar ser alterada.&lt;/p&gt;

&lt;p&gt;O objetivo agora é tornar esse componente se tornar mais genérico, fazendo com que o componente pai seja responsável por lidar com a requisição e seu retorno.&lt;/p&gt;

&lt;p&gt;Agora veja o componente após a refatoração:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type SimpleSimpleFormProps = {
  onSubmit: (username: string, password: string) =&amp;gt; void;
};

const SimpleSimpleForm = ({ onSubmit }: SimpleSimpleFormProps) =&amp;gt; {
  const [username, setUsername] = React.useState('');
  const [password, setPassword] = React.useState('');

  const handleSubmit = (e: React.FormEvent&amp;lt;HTMLFormElement&amp;gt;) =&amp;gt; {
    e.preventDefault();
    onSubmit(username, password);
  };

  return (
    &amp;lt;form onSubmit={handleSubmit}&amp;gt;
      &amp;lt;div&amp;gt;
        &amp;lt;label htmlFor='username'&amp;gt;Username&amp;lt;/label&amp;gt;
        &amp;lt;input
          type='text'
          id='username'
          value={username}
          onChange={(e) =&amp;gt; setUsername(e.target.value)}
        /&amp;gt;
      &amp;lt;/div&amp;gt;

      &amp;lt;div&amp;gt;
        &amp;lt;label htmlFor='password'&amp;gt;Password&amp;lt;/label&amp;gt;
        &amp;lt;input
          type='password'
          id='password'
          value={password}
          onChange={(e) =&amp;gt; setPassword(e.target.value)}
        /&amp;gt;
      &amp;lt;/div&amp;gt;

      &amp;lt;button type='submit'&amp;gt;Login&amp;lt;/button&amp;gt;
    &amp;lt;/form&amp;gt;
  );
};

export const App = () =&amp;gt; {
  const [user, setUser] = React.useState&amp;lt;null | unknown&amp;gt;(null);

  const handleLoginWithRestAPI = async (username: string, password: string) =&amp;gt; {
// details
  };

  const handleLoginWithGraphQL = async (username: string, password: string) =&amp;gt; {
// details
  };

  return (
    &amp;lt;&amp;gt;
      &amp;lt;h1&amp;gt;Login With Provider 1&amp;lt;/h1&amp;gt;
      &amp;lt;SimpleSimpleForm onSubmit={handleLoginWithRestAPI} /&amp;gt;

      &amp;lt;h1&amp;gt;Login With Provider 2&amp;lt;/h1&amp;gt;
      &amp;lt;SimpleSimpleForm onSubmit={handleLoginWithGraphQL} /&amp;gt;

      &amp;lt;h1&amp;gt;User&amp;lt;/h1&amp;gt;
      &amp;lt;pre&amp;gt;{JSON.stringify(user, null, 4)}&amp;lt;/pre&amp;gt;
    &amp;lt;/&amp;gt;
  );
};

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Após essa refatoração é notavel como podemos delegar para o componente pai os detalhes de implementação sobre como o método de login é realizado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bônus: OCP + DIP
&lt;/h2&gt;

&lt;p&gt;O verdadeiro potencial dos princípios SOLID mora não só na sua adoção e compreensão, mas também na capacidade de interligar um princípio com outro quando temos a oportunidade.&lt;/p&gt;

&lt;p&gt;Neste exemplo bônus eu vou juntar 2 deles: Open-Close Principle com Dependency Inversion Principle.&lt;/p&gt;

&lt;p&gt;O objetivo é:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tornar o componente de formulário extensível para que seus campos sejam customizáveis;&lt;/li&gt;
&lt;li&gt;Tornar este componente genérico para que seu componente pai lide com os detalhes de implementação do submit.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Como resultado, teremos o seguinte código:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type SimpleSimpleFormProps = {
  onSubmit: (event) =&amp;gt; void;
  children: React.ReactNode;
};

const SimpleSimpleForm = ({ onSubmit, children }: SimpleSimpleFormProps) =&amp;gt; {
  const handleSubmit = (event: React.FormEvent&amp;lt;HTMLFormElement&amp;gt;) =&amp;gt; {
    event.preventDefault();
    onSubmit(event);
  };

  return (
    &amp;lt;form onSubmit={handleSubmit}&amp;gt;
      {children}

      &amp;lt;button type='submit'&amp;gt;Login&amp;lt;/button&amp;gt;
    &amp;lt;/form&amp;gt;
  );
};

export const App = () =&amp;gt; {
  const handleLogin = async (event: React.FormEvent&amp;lt;HTMLFormElement&amp;gt;) =&amp;gt; {
    const username = event.currentTarget.username.value;
    const password = event.currentTarget.password.value;


    // details
  };

  const handleRegister = async (event: React.FormEvent&amp;lt;HTMLFormElement&amp;gt;) =&amp;gt; {
    const username = event.currentTarget.username.value;
    const password = event.currentTarget.password.value;
    const passwordConfirmation = event.currentTarget.passwordConfirmation.value;
    const email = event.currentTarget.email.value;

    // details
  };

  return (
    &amp;lt;&amp;gt;
      &amp;lt;h1&amp;gt;Login With Provider 1&amp;lt;/h1&amp;gt;
      &amp;lt;SimpleSimpleForm onSubmit={handleLogin}&amp;gt;
        &amp;lt;input type='text' placeholder='Username' name='username' /&amp;gt;
        &amp;lt;input type='password' placeholder='Password' name='password' /&amp;gt;
      &amp;lt;/SimpleSimpleForm&amp;gt;

      &amp;lt;h1&amp;gt;Register Form&amp;lt;/h1&amp;gt;
      &amp;lt;SimpleSimpleForm onSubmit={handleRegister}&amp;gt;
        &amp;lt;input type='text' placeholder='Username' name='username' /&amp;gt;
        &amp;lt;input type='password' placeholder='Password' name='password' /&amp;gt;
        &amp;lt;input
          type='passwordConfirmation'
          placeholder='Confirm Password'
          name='confirm'
        /&amp;gt;
        &amp;lt;input type='text' placeholder='Email' name='email' /&amp;gt;
      &amp;lt;/SimpleSimpleForm&amp;gt;
    &amp;lt;/&amp;gt;
  );
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Note que o ponto onde parei ainda está longe do ideal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O componente pai recebe seus campos a partir do evento de submit e não temos compo inferir tipos nisso &lt;em&gt;ainda&lt;/em&gt;;&lt;/li&gt;
&lt;li&gt;Não temos tratamento de erros;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Apesar da implementação estar longe de ser ideal e poder evoluir bastante ainda, o principal é cultivar a ideia de fundir 2 princípios SOLID para tornar o componente o mais genérico e extensível possível.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Design de software pode ser algo bem abstrato e complexo de entender a princípio, mas é que naturalmente iremos enxergar a necessidade de utilizar.&lt;/p&gt;

&lt;p&gt;Tenho certeza que esses princípios são de grande utilidade no desenvolvimento Frontend, especialmente nas aplicações ReactJS onde nós somos responsáveis por todas as decisões na aplicação, desde de pacotes e funcionamento, até arquitetura e estrutura de pastas que não são a mesma coisa 😂.&lt;/p&gt;

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

&lt;p&gt;Titulo:  The S.O.L.I.D Principles in Pictures&lt;br&gt;
Autor: Ugonna Thelma&lt;br&gt;
May 18, 2020&lt;br&gt;
&lt;a href="https://medium.com/backticks-tildes/the-s-o-l-i-d-principles-in-pictures-b34ce2f1e898" rel="noopener noreferrer"&gt;https://medium.com/backticks-tildes/the-s-o-l-i-d-principles-in-pictures-b34ce2f1e898&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Titulo: 10 Best Practices for Writing Clean React Code&lt;br&gt;
Autor: Dhawal Pandya&lt;br&gt;
&lt;a href="https://www.turing.com/kb/writing-clean-react-code" rel="noopener noreferrer"&gt;https://www.turing.com/kb/writing-clean-react-code&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Titulo: 7 React Clean Code Tips You Should Know&lt;br&gt;
Autor: Juntao Qiu&lt;br&gt;
&lt;a href="https://itnext.io/7-react-clean-code-tips-you-should-know-846b8108fc46" rel="noopener noreferrer"&gt;https://itnext.io/7-react-clean-code-tips-you-should-know-846b8108fc46&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Titulo: How to Write Cleaner React Code&lt;br&gt;
Autor: Reed Barger&lt;br&gt;
&lt;a href="https://www.freecodecamp.org/news/how-to-write-cleaner-react-code/" rel="noopener noreferrer"&gt;https://www.freecodecamp.org/news/how-to-write-cleaner-react-code/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Titulo: 10 Must-Know Patterns for Writing Clean Code with React and TypeScript✨🛀&lt;br&gt;
Autor: Alex Omeyer&lt;br&gt;
&lt;a href="https://dev.to/alexomeyer/10-must-know-patterns-for-writing-clean-code-with-react-and-typescript-1m0g"&gt;https://dev.to/alexomeyer/10-must-know-patterns-for-writing-clean-code-with-react-and-typescript-1m0g&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Titulo: Four Tips for Writing Clean React Code&lt;br&gt;
Autor: Julien Delange&lt;br&gt;
&lt;a href="https://www.codiga.io/blog/clean-react-code/" rel="noopener noreferrer"&gt;https://www.codiga.io/blog/clean-react-code/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Titulo: This is the Only Right Way to Write React clean-code - SOLID&lt;br&gt;
Autor: Islem Maboud&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=MSq_DCRxOxw" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=MSq_DCRxOxw&lt;/a&gt;&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>react</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Hackeando a entrevista</title>
      <dc:creator>Roberto Costa</dc:creator>
      <pubDate>Tue, 20 Jun 2023 04:07:47 +0000</pubDate>
      <link>https://dev.to/robertheory/hackeando-a-entrevista-2698</link>
      <guid>https://dev.to/robertheory/hackeando-a-entrevista-2698</guid>
      <description>&lt;p&gt;Entrevistas de emprego podem ser assustadoras e desafiadoras, mas quando nos preparamos adequadamente, essa impressão fica cada vez mais fraca.&lt;/p&gt;

&lt;p&gt;Atenção: Entreviste a empresa!&lt;br&gt;
O processo seletivo não é apenas a empresa te entrevistando, você deve ativamente entrevistar a empresa e entender se esse lugar realmente é um ambiente que esteja alinhado com as suas expectativas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Aviso: cada caso é um caso!
&lt;/h3&gt;

&lt;p&gt;No começo da carreira é complicado sustentar esse discurso de ser mais seletivo nos trabalhos pois nem todos temos as mesmas oportunidades, assim é muito mais fácil você aceitar qualquer oportunidade no começo pois você precisa de experiência ou precisa do dinheiro, então não existe regra geral sobre o que fazer nesse momento, apenas esteja ciente que empresas vão querer te explorar sim, ainda mais no começo. Se elas puderem vão te pagar tão pouco quanto conseguirem e te exigirão 2x de trabalho. Fique atento a esse tipo de situação, existe muito por ai, pode ser que você nunca caia nisso na vida, mas é importante saber que existe, e talvez mesmo assim faça sentido para você entrar nesse tipo de situação, no fim do dia é você que paga suas contas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pesquise sobre a empresa
&lt;/h3&gt;

&lt;p&gt;Primeiro passo fundamental para se preparar para a vaga é fazer seu trabalho de casa! Pesquise sobre a cultura da empresa, casos de sucesso e sobre seu negócio.&lt;br&gt;
Buscar saber mais sobre a empresa demonstra seu interesse genuino de entrar para a equipe, além de te dar ferramentas para entender se faz sentido para você entrar em uma nova jornada fazendo parte deste ambiente.&lt;/p&gt;

&lt;h4&gt;
  
  
  Principais pontos de interesse
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Qual o ramo de negócio da empresa;&lt;/li&gt;
&lt;li&gt;Quem são os clientes desta empresa;&lt;/li&gt;
&lt;li&gt;Quanto tempo de mercado ela tem;&lt;/li&gt;
&lt;li&gt;Como a empresa se define;&lt;/li&gt;
&lt;li&gt;Clientes desta empresa;&lt;/li&gt;
&lt;li&gt;Cultura da empresa;&lt;/li&gt;
&lt;li&gt;Iniciativas e atividades de impacto;&lt;/li&gt;
&lt;li&gt;Onde se encaixa a sua área de trabalho na empresa.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Fale sobre você
&lt;/h3&gt;

&lt;p&gt;Falar muito, falar pouco, deixar de falar algo - estes são alguns dos problemas que podem te atingir aqui. Mas não se preocupe: a ideia geral deste momento da entrevista é dar ao recrutador o contexto sobre você, de forma que seja relevante para a vaga. &lt;br&gt;
Para isto, você deve fazer um trabalho prévio. Eu recomendo o seguinte método:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Leia bem a vaga;&lt;/li&gt;
&lt;li&gt;Identifique os pontos da sua jornada que são importantes no contexto da vaga;&lt;/li&gt;
&lt;li&gt;Após anotar todos os pontos, crie uma história breve; e&lt;/li&gt;
&lt;li&gt;Faça com que a história seja breve e sucinta, tente contar em menos de 2 minutos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Com o método acima, você pode conseguir uma apresentação muito boa que será simples e que seus ouvintes irão lembrar melhor.&lt;/p&gt;

&lt;h4&gt;
  
  
  Toques especiais
&lt;/h4&gt;

&lt;p&gt;É interessante que sua apresentação não seja robótica e reflita um pouco do seu ânimo, então modele o texto de forma a transmitir sentimentos, como o de que entrou animado na faculdade ou que concluiu um projeto que te deixou extremamente satisfeito, mas cuidado para não enrolar demais. &lt;br&gt;
Coloque elementos pessoais no começo, antes de falar de carreira e trabalhos, tudo bem dizer se prefere gatos ou cachorros, ou que adora tocar violão, esse tipo de nota traz um sentimento de humanidade e proximidade com as pessoas que te escutam.&lt;/p&gt;

&lt;h4&gt;
  
  
  Experiências relevantes
&lt;/h4&gt;

&lt;p&gt;Durante a sua apresentação, se houver alguma intersecção entre o negócio da empresa e as suas vivências, pode ser muito positivo que você levante este tópico, isto pode fazer com que a sua candidatura ganhe uma força a mais dentre as outras, ou que mesmo que você não cumpra totalmente os requisitos técnicos, sua experiência anterior é capaz de ser sua forte aliada para sair na frente.&lt;/p&gt;

&lt;h3&gt;
  
  
  No geral depende muito do perfil da empresa
&lt;/h3&gt;

&lt;p&gt;Cada empresa vai ter um processo de recrutamento específico, onde umas podem buscar um maior alinhamento com a cultura da empresa ou de repente podem estar apenas querendo alguém que seja altamente qualificado independente do alinhamento cultural. Nesse quesito é muito importante fazer bem a sua pesquisa sobre a empresa e seus valores, bem como entender junto aos recrutadores qual é a necessidade que esta vaga irá suprir.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que fazer e o que não fazer...
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Não detone sua empresa atual!
&lt;/h4&gt;

&lt;p&gt;Sim, você pode dizer que está saindo por falta de oportunidades ou que quer ampliar seus horizontes, mas é muito importante que seja sincero nessa etapa, caso contrário vai parecer que você só está saindo por sair, e não pega nada bem a imagem de um funcionário que está saindo sem motivos ou que quer escondê-los.&lt;/p&gt;

&lt;h4&gt;
  
  
  Leia bem a descrição da vaga
&lt;/h4&gt;

&lt;p&gt;É essencial se atentar ao que é requisitado na vaga, e não tem problema se você não souber uma ou duas coisas, geralmente isso podemos compensar com boas soft skills ou habilidades diferenciais. Jamais deixe para descobrir os requisitos da vaga na hora da entrevista, veja bem o que é pedido e de preferência tenha um projeto de estudos ou de teste para comprovar proficiência.&lt;/p&gt;

&lt;h4&gt;
  
  
  Não tenha medo de falar que não sabe!
&lt;/h4&gt;

&lt;p&gt;Sinceridade é um fator importante em uma entrevista e na maioria dos casos, não saber ou ter pouca vivência em um dos requisitos não é o que vai te desclassificar. Por outro lado, mentir sobre a sua proficiência é algo que com toda certeza vai te levar para uma experiência desagradável durante seus processos seletivos.&lt;/p&gt;

&lt;h4&gt;
  
  
  Estude para a entrevista
&lt;/h4&gt;

&lt;p&gt;Estudar para entrevista envolve 2 aspéctos: a empresa e o técnico. Estudar a empresa já foi comentado aqui antes e é super importante até para você saber se quer estar lá. Já o aspécto técnico tem sua importância no que se diz ao preparo para um eventual teste técnico de acordo com os requisitos da vaga.&lt;/p&gt;

&lt;h4&gt;
  
  
  Estudo para teste técnico
&lt;/h4&gt;

&lt;p&gt;Aqui eu vou assumir que você cumpre boa parte dos requisitos da vaga pois é o recomendável para uma aplicação de sucesso.&lt;br&gt;
Existem vários tipos de testes técnicos:&lt;/p&gt;

&lt;h5&gt;
  
  
  Teste ao vivo
&lt;/h5&gt;

&lt;p&gt;O objetivo aqui é entender a linha de raciocínio do candidato e pode ser que você nem perca pontos por não terminar, mas só de demonstrar a sua forma de pensar, já é o suficiente para os recrutadores.&lt;/p&gt;

&lt;h5&gt;
  
  
  Projeto com data de entrega
&lt;/h5&gt;

&lt;p&gt;Aqui você terá de realizar um projeto relativamente trabalhoso e entregar em uma data limite. Normalmente o objetivo desse tipo teste é entender a velocidade e as técnicas empregadas pelo candidato, de forma que mesmo se não finalizar tudo no prazo, dependendo da vaga, você pode passar se tiver uma boa execução.&lt;/p&gt;

&lt;h5&gt;
  
  
  Arguição
&lt;/h5&gt;

&lt;p&gt;Nesse tipo de teste normalmente se testa o conhecimento básico da pessoa, pois para determinadas atividades existem conhecimentos específicos que não podem ser memorizados a esse ponto, mas a parte do conhecimento profundo do trabalho é colocado à prova em uma série de perguntas.&lt;/p&gt;

&lt;h5&gt;
  
  
  Prova
&lt;/h5&gt;

&lt;p&gt;Nesse tipo de teste a empresa deve criar questões discursivas ou de múltipla escolha que testarão no geral o conhecimento teórico da pessoa sobre determinados assuntos, de forma que é comum que existam perguntas ambíguas ou que induzam o candidato ao erro, de forma que apenas o conhecimento prévio ou experiência poderiam ajudar.&lt;br&gt;
Ainda sim existem modalidades diferentes de provas:&lt;/p&gt;

&lt;h6&gt;
  
  
  Online
&lt;/h6&gt;

&lt;p&gt;Faz a prova em uma página na web, e provavelmente será um tipo de prova que vai ser trabalhosa mesmo se você colar ou utilizar ferramentas terceiras pois os recrutadores já esperam que você o faça.&lt;/p&gt;

&lt;h6&gt;
  
  
  Online ao vivo
&lt;/h6&gt;

&lt;p&gt;Aqui a coisa complica um pouco pois na prova ao vivo, pode ser que não seja permitido consultar a internet, mas se for, menos mal. Novamente, se for permitido consultar a internet o problema vai ser complexo mesmo assim e agora no ao vivo você ainda vai estar sendo observado, então tentativas fúteis de resolver algo que você não tem ideia podem ser percebidas.&lt;/p&gt;

&lt;h6&gt;
  
  
  Escrita
&lt;/h6&gt;

&lt;p&gt;Cada dia mais em desuso, a prova escrita nos testes técnicos costumam ser tranquilas caso você realmente tenha certo conhecimento sobre o que se propõe, contudo o que a faz diferente de todas as outras formas é justamente a ausência do computador como facilitador. Sem consultas, sem ajudinha da internet, sem dicas e sem corretor.&lt;/p&gt;

&lt;h4&gt;
  
  
  Estudo Go Horse - Cuidado ⚠️ prática nada saudável
&lt;/h4&gt;

&lt;p&gt;Existem pessoas que não dominam quase nada do que a vaga pede, mas para se preparar fazem uma rotina super intensa de estudos baseada nos requisitos. Tal rotina pode envolver:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cursos ultra rápidos;&lt;/li&gt;
&lt;li&gt;Criação de projetos do zero;&lt;/li&gt;
&lt;li&gt;Estudo de código de terceiros;&lt;/li&gt;
&lt;li&gt;Mentoria de código intesiva;&lt;/li&gt;
&lt;li&gt;Bootcamps.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mas o detalhe é que esse método de estudo não foca nada em qualidade e proficiência, você vai estar fazendo um processo que vai passar de forma muito superficial sobre os requisitos e no caso de ter alguma situação mais específica é bem possível que você passe um aperto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Perguntas comuns
&lt;/h3&gt;

&lt;p&gt;Não dá para saber 100% do que vai ser perguntado durante uma entrevista, mas existem algumas perguntas clássicas os recrutadores costumam trazer para entender mais sobre a pessoa entrevistada. Responder essas perguntas antecipadamente vai te dar uma vantagem de não tem que pensar tanto para responder durante a entrevista.&lt;/p&gt;

&lt;p&gt;Aqui vão algumas das perguntas mais comuns:&lt;/p&gt;

&lt;h4&gt;
  
  
  Perguntas sobre seu contexto
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Por que você está deixando seu emprego atual?&lt;/li&gt;
&lt;li&gt;Quais são os seus pontos fortes e fracos?&lt;/li&gt;
&lt;li&gt;Em algum momento você discordou de uma decisão de trabalho? Como foi isso?&lt;/li&gt;
&lt;li&gt;Como você trabalha em equipe?&lt;/li&gt;
&lt;li&gt;Como você lida com pressão ou situações estressantes?&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Perguntas sobre sua carreira
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Fale sobre algum desafio que você teve sucesso;&lt;/li&gt;
&lt;li&gt;Fale sobre algum desafio que você não teve sucesso;&lt;/li&gt;
&lt;li&gt;Maior desafio que já enfrentou;&lt;/li&gt;
&lt;li&gt;Qual é a sua maior conquista profissional?&lt;/li&gt;
&lt;li&gt;Onde você se vê em cinco anos?&lt;/li&gt;
&lt;li&gt;Como você lida com conflitos no ambiente de trabalho?&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Perguntas sobre a empresa
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;O que você sabe sobre a empresa?&lt;/li&gt;
&lt;li&gt;Por que você quer este trabalho?&lt;/li&gt;
&lt;li&gt;O que você sabe sobre nossos valores/missão?&lt;/li&gt;
&lt;li&gt;O que você entende sobre essa área/projeto X e como você se vê colaborando?&lt;/li&gt;
&lt;li&gt;Como você acha que se encaixa na cultura da empresa?&lt;/li&gt;
&lt;li&gt;Por que devemos contratá-lo?&lt;/li&gt;
&lt;li&gt;O que você daria de ideia nova para melhorar projeto X?&lt;/li&gt;
&lt;li&gt;Você tem alguma pergunta?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Perguntas a se fazer
&lt;/h3&gt;

&lt;p&gt;Fazer perguntas para os entrevistadores é importantíssimo! Você também está avaliando a vaga, precisa saber se é algo que você quer realmente entrar, então se empenhe em descobrir o que tem de mais importante para você sobre o trabalho.&lt;/p&gt;

&lt;p&gt;Aqui vão algumas perguntas interessantes e suas motivações:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Essa vaga é novo ou já existia?&lt;br&gt;
Nessa pergunta você pode entender se está substituindo alguém que saiu ou está sendo alocado para um trabalho que não existia antes na empresa. Saber disso pode ser importante para você se não gosta de assumir o trabalho de outras pessoas e se prefere começar projetos do zero.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Como é o perfil de colaborador que vocês procuram?&lt;br&gt;
Nessa pergunta você vai conseguir entender um pouco sobre as expectativas comportamentais e pode dar alguma dica do que você terá que enfrentar no seu dia a dia, por exemplo: fique de olho quando uma empresa diz que precisa de colaboradores resilientes, pois isso demonstra que ela tem um ambiente que pode não ser tão amigável.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Como os times interagem entre si&lt;br&gt;
Nessa pergunta você consegue entender melhor como será a dinâmica de trabalho do seu dia a dia: sua equipe tem quantas pessoas? Você vai entrar em contato diretamente com outras equipes? Tem que falar primeiro com o líder ou gestor? Você vai ter mais autonomia ou menos?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Qual o principal desafio que este cargo precisa resolver?&lt;br&gt;
É muito importante entender o motivo pelo qual você está sendo contratado: seria um projeto temporário? Seria um novo protudo a ser testado? Dependendo do que for seu trabalho pode ter os dias contados desde o momento da contratação. Entenda também os desafios que você terá pois nem tudo que você vai enfrentar vai estar na descrição da vaga.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Qual a parte que vocês mais gostam sobre trabalhar nesta empresa?&lt;br&gt;
Nada melhor do que a opinião das pessoas que já trabalham lá para te dizer algo sobre ela. Provavelmente ninguém vai te falar nada negativo sobre a empresa, mas procure perguntar sobre sua satisfação com a interação entre colegas e o que eles mais gostam sobre o ambiente de trabalho.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Como são os próximos passos ou plano de carreira para esta posição?&lt;br&gt;
Fazer esta pergunta é muito importante quando você tem planos a longo prazo e está buscando construir uma carreira nesta empresa, logo, é preciso saber de antemão se a empresa pode te oferecer isso.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>career</category>
      <category>interview</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Planejamento de carreira inteligente</title>
      <dc:creator>Roberto Costa</dc:creator>
      <pubDate>Fri, 12 May 2023 16:08:46 +0000</pubDate>
      <link>https://dev.to/robertheory/planejamento-de-carreira-inteligente-2lf2</link>
      <guid>https://dev.to/robertheory/planejamento-de-carreira-inteligente-2lf2</guid>
      <description>&lt;p&gt;Construir uma carreira sólida ou mesmo começar do zero pode parecer desafiador, e realmente é, não espere que seja fácil ou que ocorra da noite para o dia. Assim como muita coisa na vida, para tal é necessário planejamento, além de outros fatores, mas principalmente planejamento.&lt;/p&gt;

&lt;p&gt;Não ter seu objetivo ou metas bem definidos é como vagar sem rumo, você pode até conseguir algo, mas vai ser por pura sorte. Ter sorte é parte do caminho, mas não dá para criar uma carreira baseado nisso, a não ser que você trabalhe com apostas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Aviso
&lt;/h2&gt;

&lt;p&gt;Cuidado com fórmulas do sucesso ou caminhos pré-definidos por outras pessoas, a carreira que ela planejou pode ser algo que não vá funcionar para você, apenas você sabe da sua realidade e quais são suas prioridades no momento.&lt;/p&gt;

&lt;h2&gt;
  
  
  Definição de objetivos
&lt;/h2&gt;

&lt;p&gt;No quadro geral, tem dois objetivos importantes de se ter em mente, e muito embora pareça ser bobo, tem muita gente que não pensa ativamente sobre isso:&lt;/p&gt;

&lt;h2&gt;
  
  
  Objetivo de carreira
&lt;/h2&gt;

&lt;p&gt;Aqui você tem total liberdade para pensar no que quiser, pode ser um cargo que almeja, um trabalho dos sonhos ou mesmo ter o seu próprio negócio. O mais importante sobre esse passo é pensar em uma meta de longo prazo, mas atenção, entenda bem as responsabilidades e exigências do seu objetivo, por exemplo, se você quer ter seu próprio negócio mas odeia lidar com tarefas administrativas e financeiras, provavelmente vai se frustrar no meio do caminho e quando descobrir será tarde demais. Por isso é importante entender as responsabilidades que vêm com seu objetivo, e uma boa estratégia para isso é conversar com pessoas que já chegaram lá, coletar opiniões e experiência de múltiplas pessoas para ajudar construção da sua perspectiva.&lt;/p&gt;

&lt;h2&gt;
  
  
  Objetivos de vida
&lt;/h2&gt;

&lt;p&gt;Há mais na vida do que apenas trabalho, tem lazer, hobbies, família, amigos, viagens, relacionamentos e cada um desses pontos tem uma importância diferente para cada pessoa, e por isso mesmo que não existe fórmula certa ou jeito errado, apenas os resultados da sua jornada. Para seus objetivos de vida, você deve buscar se compreender e entender o que quer a longo prazo, como mudar de cidade, de trabalho, trabalhar menos, estar mais com a família, viajar o mundo, ter a sua casa, se casar e ter filhos, contribuir para uma causa ou para educação, melhorar o mundo, morar em uma cidade, morar no interior, etc.&lt;/p&gt;

&lt;p&gt;Aqui o escopo é enorme, não temos como fazer tudo pois temos um limite de tempo de vida, mas conseguimos pelo menos definir alguns princípios essenciais que podemos viver por eles, por exemplo:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Eu gostaria de ter mais tempo com a minha família e amigos, quero conhecer o mundo e as diferentes culturas e aprender um instrumento musical.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;É importante notar que objetivos de vida quase sempre entram em conflito com objetivos de carreira, visto que carreira demanda tempo de dedicação, assim como várias coisas na sua vida pessoal, então é normal se sentir dividido por alguma decisão, mas saiba que desde que tenha objetivos claros, você ainda vai poder tomar essas decisões difíceis, o que nem sempre é possível quando você está à deriva sem saber onde ir e como chegar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Planejamento de carreira
&lt;/h2&gt;

&lt;p&gt;Depois de decidir qual seu objetivo profissional, é preciso entender como chegar até lá. Existem várias formas de fazer um plano de carreira, uma das mais simples é seguir estes passos:&lt;/p&gt;

&lt;h3&gt;
  
  
  Levantamento de requisitos
&lt;/h3&gt;

&lt;p&gt;Procure requisitos comuns que são exigidos para seu objetivo, seja em sites de vagas ou mesmo conversando com pessoas da área. Cuidado com lugares que pedem requisitos em proporções irreais, nisso uma pessoa mais experiente pode te ajudar melhor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Planejamento de estudos
&lt;/h3&gt;

&lt;p&gt;Após ter os requisitos é hora de planejar como que você vai fazer para chegar até lá. Procure cursos, aulas, conteúdo gratuito, especializações. Mas principalmente organize!&lt;br&gt;
Pode parecer difícil mas faça um planejamento para que possa ter uma estimativa de quando irá conseguir atingir os objetivos, distribua no seu calendário os marcos onde você espera terminar um determinado estudo. Crie um cronograma de estudos, se desafie!&lt;/p&gt;

&lt;h3&gt;
  
  
  Acompanhamento
&lt;/h3&gt;

&lt;p&gt;Não espere se sentir sem rumo, torne a autoavaliação algo rotineiro. Sempre que terminar um determinado estudo ou ciclo, volte pare ver o que realmente aprendeu, e até mesmo se está alinhado com suas expectativas.&lt;/p&gt;

&lt;h4&gt;
  
  
  Exemplo
&lt;/h4&gt;

&lt;p&gt;Entendendo que seu objetivo é começar como Desenvolvedor de Bolinhos Júnior, podemos fazer uma pesquisa nas principais plataformas de recrutamento para entender o que é frequentemente requisito para essa vaga.&lt;br&gt;
Após esta pesquisa você descobriu que este trabalho possui algumas especialidades básicas: criação de massas, preparação de recheio, confecção de caldas e arte para bolos.&lt;br&gt;
A partir destes requisitos mínimos você pode procurar materiais ou mesmo cursos que te ofereçam esse tipo de conhecimento, e o mais importante aqui é você manter seu objetivo em foco, tendo em mente sua meta final que é se qualificar para ser um Desenvolvedor de Bolinhos Júnior.&lt;br&gt;
É extremamente importante que durante seu aprendizado você faça pausas regulares para validar o que está aprendendo e se de fato você está aprendendo ou se está sendo algo que é útil para seu objetivo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Planejamento de vida
&lt;/h3&gt;

&lt;p&gt;Bem, aqui eu realmente não posso fazer nada por você 😁, é contigo, confio que você sabe melhor do que eu as suas aspirações e metas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Planejar uma carreira muito se assemelha em planejar seus estudos, mas não se engane, carreira não é só sobre habilidades ou conhecimento, tem muito mais!&lt;/p&gt;

&lt;h3&gt;
  
  
  Soft Skills
&lt;/h3&gt;

&lt;p&gt;Existem habilidade essenciais no nosso trabalho, as quais devemos desenvolver ativamente para nos capacitar para o trabalho, contudo o conceito de soft skill diz respeito a habilidades secundárias, muitas vezes qualidades pessoais que ajudam as pessoas a prosperar no ambiente de trabalho.&lt;br&gt;
Muitas pessoas associam essas habilidades apenas ao conceito interpessoal, onde a ideia é desenvolver boas relações, mas não se limita a isso, sendo qualquer habilidade que possa contribuir para seu sucesso, como por exemplo: leitura dinâmica é uma habilidade que te ajuda a ler de forma mais rápida e absorver mais conteúdo e pode ser considerada uma soft skill pois pode auxiliar diversos tipos de trabalhos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Networking
&lt;/h3&gt;

&lt;p&gt;Sem sombra de dúvidas as relações que criamos ao longo da nossa jornada de carreira são muito importantes, mas cuidado, networking não é só trabalho, networking é confiança e até amizade!&lt;br&gt;
Um bom networking é aquele que você realmente se conecta com as pessoas e estabelece uma relação amistosa.&lt;br&gt;
Existirão alguns casos onde determinada pessoa terá apenas uma boa relação de negócios contigo, contudo, é importante saber diferenciar as pessoas que você realmente pode contar como um bom networking de quem apenas estará do seu lado enquanto houver benefícios.&lt;/p&gt;

&lt;h3&gt;
  
  
  Visibilidade
&lt;/h3&gt;

&lt;p&gt;Quem não é visto não é lembrado!! Marque sua presença nas redes sociais e profissionais, compartilhe conhecimento, ajude pessoas, tudo isso são formas de você ganhar visibilidade e por consequência ser alvo de oportunidades que pessoas mais anônimas não tem. A existência de caçadores de talentos ou mesmo pessoas procurando boas parcerias é algo que vai aparecer com mais facilidade para pessoas que investem na sua visibilidade, e se quiser ir mais além ainda, invista na sua marca pessoal!&lt;/p&gt;

&lt;p&gt;Obs.: Eu não sei nada sobre confeitaria, exemplo dos bolinhos é meramente ilustrativo.&lt;/p&gt;

</description>
      <category>career</category>
      <category>beginners</category>
      <category>productivity</category>
      <category>learning</category>
    </item>
    <item>
      <title>Estudando certo - Guia do autodidata</title>
      <dc:creator>Roberto Costa</dc:creator>
      <pubDate>Thu, 20 Apr 2023 12:24:09 +0000</pubDate>
      <link>https://dev.to/robertheory/estudando-certo-guia-do-autodidata-opk</link>
      <guid>https://dev.to/robertheory/estudando-certo-guia-do-autodidata-opk</guid>
      <description>&lt;p&gt;Você já pensou em se tornar autodidata? Aprender por conta própria pode ser desafiador no começo, mas é igualmente libertador e gratificante, pois você não está limitado a um conteúdo pré-determinado.&lt;/p&gt;

&lt;p&gt;De certa forma, todos nós somos autodidatas em algum nível: procuramos referências por conta própria quando queremos aprender mais sobre algum assunto, não nos contentamos com explicações superficiais e nos aprofundamos, ou tentamos aprender algo novo sem ajuda.&lt;/p&gt;

&lt;p&gt;Ser autodidata não significa que não precisamos de ajuda ou que não utilizamos materiais prontos, mas sim que não dependemos de um ambiente dedicado ao ensino, como escolas, para desenvolver nossas habilidades.&lt;/p&gt;

&lt;p&gt;Assim, uma pessoa autodidata utiliza todas as ferramentas disponíveis que se alinham com seus objetivos ou que podem ajudar de alguma forma, incluindo materiais didáticos livres ou vídeos explicativos.&lt;/p&gt;

&lt;p&gt;Realizar cursos ou frequentar ambientes de ensino não invalida a posição de uma pessoa como autodidata. Esses são ótimos recursos para acelerar o aprendizado em um determinado assunto. No entanto, uma pessoa que busca se desenvolver por conta própria não se limita ao que foi planejado para ela, busca materiais por si mesma, sabe distinguir o que é útil e o que não é, e, acima de tudo, otimiza seu tempo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Marcas registradas de uma pessoa autodidata
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Curiosidade
&lt;/h3&gt;

&lt;p&gt;Você não se contenta com conhecer algo superficialmente, faz perguntas, vai mais fundo, procura outros materiais, pessoas que pensam diferente, prós e contras. A curiosidade é um dos pilares mais fortes pois é uma das melhores ferramentas nesse leque.&lt;/p&gt;

&lt;h3&gt;
  
  
  Disciplina
&lt;/h3&gt;

&lt;p&gt;Você sabe que precisa se organizar, algumas tarefas precisam ser diluídas em vários dias, um pouco cada dia, outras precisam ser feitas de uma vez só!&lt;br&gt;
Para dar seu melhor precisa respeitar seu tempo de descanso e reservar o melhor momento possível para suas atividades.&lt;/p&gt;

&lt;h3&gt;
  
  
  Autonomia
&lt;/h3&gt;

&lt;p&gt;Você definitivamente não precisa de alguém ditando os próximos passos, com as ferramentas certas não haverá dificuldade em se planejar. Material, apostila, grade curricular? Não, você faz o seu próprio curso de ação, sem perdas de tempo e direto ao ponto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Persistência
&lt;/h3&gt;

&lt;p&gt;Movido pela sua curiosidade e disciplina, a persistência se torna bem simples, uma vez que já faz parte da sua rotina e que está motivado a atingir seus objetivos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Autoconhecimento
&lt;/h3&gt;

&lt;p&gt;Esse tópico é bem importante, pois nada acima é conquistável se você não souber como se aplica à você.&lt;br&gt;
Estuda melhor à noite, ou em grupo? Grava tudo na cabeça ou precisa escrever? Revisitar o conteúdo é importante para você? Usa algum método de memorização?&lt;/p&gt;

&lt;h2&gt;
  
  
  Não tem fórmula perfeita ⚠️
&lt;/h2&gt;

&lt;p&gt;Não há uma fórmula universal para aprender, cada um deve encontrar sua própria forma. Há diferentes formatos de aprendizado, como ler livros, ouvir podcasts, assistir a videoaulas, criar algo sozinho ou em grupo, visitar fóruns e até mesmo ensinar. O importante é experimentar e descobrir qual método funciona melhor para cada pessoa.&lt;/p&gt;

&lt;p&gt;Mesmo com essas características que podem ser adquiridas e melhoradas, ainda assim há algumas ferramentas que serão de grande ajuda na sua jornada de autodidata:&lt;/p&gt;

&lt;h3&gt;
  
  
  Objetivos
&lt;/h3&gt;

&lt;p&gt;Ter clareza sobre o objetivo dos seus estudos é fundamental para traçar um plano eficiente e alcançar o sucesso. É importante definir se você está se preparando para uma prova, se quer aprender uma nova ferramenta, otimizar sua performance ou alcançar uma promoção no trabalho, por exemplo. É necessário ter em mente onde quer chegar e traçar um plano com metas e objetivos claros para alcançar esse fim. Sem essa definição, é fácil se perder e não saber se está progredindo ou não. Portanto, defina sua meta e trabalhe para alcançá-la.&lt;/p&gt;

&lt;h3&gt;
  
  
  Planejamento
&lt;/h3&gt;

&lt;p&gt;O processo de aprendizagem e progresso é uma jornada que exige frequência e comprometimento. Não adianta tentar fazer o trabalho de três meses em um único dia, é preciso ter foco e criar um cronograma realista para alcançar seus objetivos.&lt;/p&gt;

&lt;p&gt;Um dos segredos para atingir suas metas é desmembrá-las em pequenos passos que você possa cumprir com menos esforço. Cada passo deve ser cuidadosamente pensado e planejado, estimando o tempo médio necessário para completá-lo.&lt;/p&gt;

&lt;p&gt;Se, por exemplo, um passo levar mais de duas semanas para ser concluído, é hora de desmembrá-lo ainda mais em pequenas etapas. Isso permitirá que você meça seu progresso de forma mais eficaz e tenha uma sensação de realização à medida que atinge cada pequena meta.&lt;/p&gt;

&lt;p&gt;Ao criar um cronograma e desmembrar seu objetivo em pequenos passos, você pode manter-se comprometido e focado em sua jornada de aprendizado. Com o tempo, você verá seu progresso e conquistas aumentando, o que o motivará ainda mais a continuar em direção ao seu objetivo final.&lt;/p&gt;

&lt;h3&gt;
  
  
  Foco Foco Foco
&lt;/h3&gt;

&lt;p&gt;Lembre-se sempre do seu objetivo maior e mantenha-o em mente todos os dias. Se possível, crie algo visualmente perceptível para lembrá-lo diariamente do que você está trabalhando para alcançar. Essa prática pode ajudá-lo a manter o foco e a disciplina necessários para alcançar seu objetivo, além de ajudar a evitar distrações desnecessárias.&lt;/p&gt;

&lt;h3&gt;
  
  
  Acompanhamento da evolução
&lt;/h3&gt;

&lt;p&gt;Criar o hábito de estudar é importante, mas é igualmente importante avaliar se estamos realmente progredindo em direção aos resultados desejados. Analise os passos já cumpridos, verifique se estão de acordo com suas expectativas e se houve algum atraso ou salto de etapa. Ajuste o planejamento, se necessário, e lembre-se de que todo aprendizado é valioso e não existe um caminho certo ou errado, apenas oportunidades para melhorar.&lt;/p&gt;

&lt;h3&gt;
  
  
  Documente!
&lt;/h3&gt;

&lt;p&gt;Ter um local centralizado para suas notas, ideias e reflexões pode ser uma ferramenta valiosa para continuar a expandir seus conhecimentos e habilidades. Algumas coisas você aprendeu de uma maneira que faz mais sentido para você, e ter um lugar para voltar e revisar esses aprendizados pode ajudar a reforçar seu conhecimento. &lt;/p&gt;

&lt;h3&gt;
  
  
  Troca de experiências
&lt;/h3&gt;

&lt;p&gt;Encontrar canais, grupos, mentores ou mesmo ser mentor de alguém pode ser uma forma super interessante de realizar troca de experiência e se permitir aprender mais do que apenas a teoria sobre o assunto que está estudando. Ensinar é comprovadamente a melhor forma de você conseguir dominar um assunto, e buscar oportunidades para compartilhar seus conhecimentos com outras pessoas pode ajudar a aprimorar sua compreensão e habilidades. Além disso, também é uma oportunidade de se conectar com outras pessoas e aprender com as suas respectivas experiências. A troca de experiências pode ser uma maneira valiosa de obter novas perspectivas e informações sobre um determinado tópico.&lt;/p&gt;

&lt;h3&gt;
  
  
  Levante a barra
&lt;/h3&gt;

&lt;p&gt;Colocar desafios para si mesmo é uma maneira eficaz de evitar a acomodação e garantir que você esteja sempre progredindo. Quando as coisas estão fáceis demais, é importante se desafiar a dar um passo adiante, levantar a barra e ir além do que é confortável. Isso não apenas ajuda a desenvolver novas habilidades e aprimorar as existentes, mas também pode trazer uma sensação de realização e satisfação pessoal. Portanto, não tenha medo de se desafiar e definir metas ambiciosas para si mesmo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Compromisso com o resultado
&lt;/h3&gt;

&lt;p&gt;Para realizar um trabalho bem feito, é necessário ter capricho e compromisso com a qualidade. Além disso, é importante ter cuidado com a sua saúde e bem-estar, pois só assim é possível estar no seu melhor desempenho. Aceitar fazer um trabalho medíocre é um sinal de que não estamos dando o nosso melhor e de que não estamos valorizando a nossa própria capacidade. Por isso, é fundamental ter em mente que não devemos nos acomodar e sempre buscar fazer mais e melhor, com foco no resultado e na excelência.&lt;/p&gt;

&lt;p&gt;Por fim, é importante entender que a jornada de uma pessoa autodidata não tem um fim específico, mas é uma trajetória de melhoria contínua, onde você sempre irá descobrir formas de otimizar seu processo de aprendizado.&lt;/p&gt;

</description>
      <category>learning</category>
      <category>career</category>
      <category>education</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Hackeando sua memória</title>
      <dc:creator>Roberto Costa</dc:creator>
      <pubDate>Fri, 07 Apr 2023 19:15:24 +0000</pubDate>
      <link>https://dev.to/robertheory/hackeando-sua-memoria-579a</link>
      <guid>https://dev.to/robertheory/hackeando-sua-memoria-579a</guid>
      <description>&lt;p&gt;Chega de dar branco sobre um assunto ou ficar esquecendo sempre a mesma coisa.&lt;/p&gt;

&lt;p&gt;Memorizar é uma habilidade fundamental em diversas áreas da nossa vida, mesmo assim há quem não saiba exercitá-la. Assim como há exercícios para trabalhar músculos específicos do nosso corpo, também há alguns que trabalham a nossa capacidade de aprender, lembrar e processar mais informações.&lt;/p&gt;

&lt;p&gt;Aqui pretendo abordar desde as técnicas clássicas até as mais modernas, que podem ajudar a melhorar a sua capacidade de reter informações.&lt;/p&gt;

&lt;h2&gt;
  
  
  Releitura
&lt;/h2&gt;

&lt;p&gt;Uma das técnicas mais comuns, provavelmente você já faz isso quando não lembra de uma parte do conteúdo ou não entendeu direito.&lt;/p&gt;

&lt;p&gt;Quando estamos lendo algo pela primeira vez, é comum reter parcialmente o conteúdo, processando as ideias chave ou alguma parte que chamou mais a atenção.&lt;/p&gt;

&lt;p&gt;No entanto, quando você relê o mesmo texto, pode começar a notar mais profundidade na sua compreensão, pois além do que você já entendeu anteriormente, agora está dedicando um olhar mais minucioso e detalhista sobre o mesmo assunto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Transformar conceitos abstratos em histórias
&lt;/h2&gt;

&lt;p&gt;Essa parece um pouco boba, mas é bem poderosa para memorizar informações abstratas ou muito complexas: a ideia é tornar os conceitos mais tangíveis através de imagens mentais criadas por uma história interessante. Assim, seu cérebro consegue processar de forma mais eficiente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Repetição espaçada
&lt;/h2&gt;

&lt;p&gt;Esta técnica consiste em revisar a informação em intervalos de tempo específicos, antes que você esqueça totalmente - por exemplo, revisar depois de algumas horas, dias ou semanas.&lt;br&gt;
Esse método é bem popular e existem diversos aplicativos que podem te ajudar a revisar tópicos no momento certo para aplicar a técnica de repetição espaçada, como o Anki e Memrise: eles fazem uso de algoritmos para entender quando o conteúdo deve ser revisto e otimizar o processo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ensinar
&lt;/h2&gt;

&lt;p&gt;O ato de ensinar envolve revisar bem o assunto e modelar de forma a facilitar a compreensão de outras pessoas e, melhor ainda, podem aparecer dúvidas e tópicos não cobertos antes. Justamente por isso, essa é uma das atividades que mais ajuda na memorização.&lt;/p&gt;

&lt;p&gt;Um estudo publicado na revista Memory &amp;amp; Cognition por John Nestojko e colaboradores (2014) mostrou que os participantes que ensinaram um conteúdo a outra pessoa lembraram significativamente mais informações em comparação com aqueles que apenas leram o conteúdo diversas vezes.&lt;/p&gt;

&lt;p&gt;Outra pesquisa publicada na revista Learning and Instruction por Ariel Lindorff e colaboradores (2016) mostrou que os estudantes que participaram do ensino colaborativo, no qual tiveram a oportunidade de ensinar uns aos outros, tiveram um desempenho significativamente melhor em testes de retenção de informações em comparação com aqueles que não participaram dessa atividade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mnemônicos
&lt;/h2&gt;

&lt;p&gt;Esse nome difícil consiste em criar associações entre o que você deseja lembrar e alguma outra coisa que facilite a recuperação da informação.&lt;/p&gt;

&lt;p&gt;No entanto, há diversos tipos de mnemônicos:&lt;/p&gt;

&lt;h3&gt;
  
  
  Acrônimos
&lt;/h3&gt;

&lt;p&gt;Formar palavras a partir de iniciais de outras palavras, como na palavra BRICS, que significa em inglês Brazil, Russia, India, China, e South Africa, sendo usado para se referir à um grupo de países, mas você pode usar sua imaginação para fazer os mais diversos acrônimos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Acrósticos
&lt;/h3&gt;

&lt;p&gt;Caracterizada pela formação de frases onde cada palavra representa outra palavra ou conceito.&lt;br&gt;
Há um acróstico muito famoso para lembrar a ordem dos planetas do Sistema Solar, que é: "Minha Vó Tem Muitas Jóias, Saturno Usa Nenhuma”, que associamos à seguinte ordem: Mercúrio, Vênus, Terra, Marte, Júpiter, Saturno, Urano, Netuno.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rimas
&lt;/h3&gt;

&lt;p&gt;Muito usado em escolas e extremamente útil, o uso de rimas para lembrar de informações é bem efetivo para relembrar, como a rima que ajuda a lembrar quantos dias têm cada mês do ano: “30 dias tem setembro, abril, junho e novembro”.&lt;/p&gt;

&lt;h3&gt;
  
  
  Imagens mentais
&lt;/h3&gt;

&lt;p&gt;Essa técnica consiste em criar imagens vívidas e detalhadas de algo para facilitar a recuperação da memória, partindo da ideia de que o cérebro humano é mais propenso a lembrar imagens do que palavras ou números.&lt;/p&gt;

&lt;p&gt;Um exemplo muito forte são os memes que buscam associar conceitos importantes com humor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxrttqmvgyydkz492cz4z.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxrttqmvgyydkz492cz4z.jpeg" alt="Meme 01" width="720" height="554"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqu73gzcikjx1pzu3nctt.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqu73gzcikjx1pzu3nctt.jpg" alt="Meme 02" width="550" height="796"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9eqec0d7n2hcsgxqrqnr.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9eqec0d7n2hcsgxqrqnr.jpg" alt="Meme 03" width="480" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As imagens mentais podem ser ainda mais eficazes quando usadas em conjunto com outras técnicas de memorização, como a repetição espaçada ou a associação de ideias. Por exemplo, se você precisa memorizar uma lista de palavras, pode criar imagens mentais para cada palavra e depois associá-las de alguma forma lógica.&lt;/p&gt;

&lt;h2&gt;
  
  
  Palavras-chave
&lt;/h2&gt;

&lt;p&gt;Por vezes nos deparamos com conceitos complexos ou palavras difíceis, e nesses cenários o uso de palavras-chave pode ser bem útil para simplificar a compreensão geral. Um exemplo é a área da medicina, que possuimuitos termos técnicos difíceis de se lembrar, logo nos seus estudos pode ser muito benéfico o uso desta técnica.&lt;/p&gt;

&lt;p&gt;Um bom exemplo&lt;/p&gt;

&lt;p&gt;Um estudo publicado na revista Applied Cognitive Psychology por Smith e Rothkopf (1984) descobriu que os participantes que usaram palavras-chave para memorizar informações tiveram um desempenho significativamente melhor em testes de retenção do que aqueles que não usaram essa técnica.&lt;/p&gt;

&lt;h2&gt;
  
  
  Método de Loci / Palácio da Memória
&lt;/h2&gt;

&lt;p&gt;Também conhecido por Palácio da Memória, este método foi inventando Simónides de Ceos na Grécia Antiga, e consiste em fazer associações de objetos em locais específicos, criando um tipo de imagem mental para memorizá-los.&lt;br&gt;
De acordo com a história, Simónides teve de abandonar um jantar e após isso, o teto do lugar desabou, de forma deixar todos os corpos irreconhecíveis. Contudo, ele sabia onde cada um estava sentado e, baseado em sua imagem mental, conseguiu identificar cada um.&lt;/p&gt;

&lt;h2&gt;
  
  
  Active recall
&lt;/h2&gt;

&lt;p&gt;Nessa técnica, o objetivo é desafiar a sua memória! Sim, ao invés de simplesmente revisitar o conteúdo que está estudando, tente lembrar ativamente da informação sem consultar, seja tentando explicar ou escrevendo um resumo.&lt;/p&gt;

&lt;p&gt;Para utilizar o active recall, é possível utilizar diversas estratégias, como:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Flashcards: criar cartões com perguntas e respostas para lembrar da informação. Por exemplo, criar um cartão com a pergunta "Qual é a capital do Brasil?" e a resposta "Brasília".&lt;/li&gt;
&lt;li&gt;Testes práticos: fazer testes que desafiam a lembrança da informação. Por exemplo, fazer um teste sobre um capítulo de um livro sem consultá-lo.&lt;/li&gt;
&lt;li&gt;Perguntas e respostas: criar uma lista de perguntas e respostas para lembrar da informação. Por exemplo, criar uma lista de perguntas sobre a história de um país e tentar responder a elas sem olhar para o livro.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;O active recall tem se mostrado uma técnica eficaz de memorização, pois ajuda a fixar a informação na memória de longo prazo. Além disso, também pode ser aplicado em diferentes contextos, como no aprendizado de idiomas, na preparação para exames e na memorização de informações profissionais.&lt;/p&gt;

&lt;h2&gt;
  
  
  Curva de esquecimento
&lt;/h2&gt;

&lt;p&gt;Este conceito vem do psicólogo alemão Hermann Ebbinghaus no final do século XIX, que realiza uma representação gráfica do processo de esquecimento natural após a apresentação de uma informação nova.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqbc93sg0ky9i7evv0g6y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqbc93sg0ky9i7evv0g6y.png" alt="Grafio da curva de esquecimento" width="597" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Depois de aprender algo novo, a retenção deste conhecimento diminui rapidamente nos primeiros minutos, horas e dias. Logo, se você não praticar ou revisitar a informação, terá um aproveitamento bem baixo.&lt;/p&gt;

&lt;p&gt;O método de repetição espaçada é uma medida bem importante para amenizar a curva de esquecimento, e por isso é importante levar a memorização não como algo que você faz uma vez e está bom, mas como um processo contínuo que vai permitir que você retenha mais informações por mais tempo com mais facilidade, assim achatando a curva de esquecimento.&lt;/p&gt;

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

&lt;p&gt;Asana. Aumente a sua capacidade de memória: as 10 principais técnicas de memorização. [online] Disponível em: &lt;a href="https://blog.asana.com/pt-br/education-pt-br/aumente-sua-capacidade-de-memoria/" rel="noopener noreferrer"&gt;https://blog.asana.com/pt-br/education-pt-br/aumente-sua-capacidade-de-memoria/&lt;/a&gt; [Acessado em 7 de abril de 2023].&lt;/p&gt;

&lt;p&gt;Neves, Tiago Ribeiro. "15 melhores técnicas de memorização para estudos, provas e concursos". Estudaqui Blog. 03/01/2022. Disponível em: &lt;a href="https://www.estudaqui.com/blog/concursos/tecnicas-memorizacao-estudos/" rel="noopener noreferrer"&gt;https://www.estudaqui.com/blog/concursos/tecnicas-memorizacao-estudos/&lt;/a&gt; [Acessado em 7 de abril de 2023].&lt;/p&gt;

&lt;p&gt;Equipe Estácio. "CONHEÇA AS 7 MELHORES TÉCNICAS DE MEMORIZAÇÃO QUE EXISTEM". Blog Estácio. 10 de junho de 2021. Disponível em: &lt;a href="https://blog.estacio.br/aluno-estacio/tecnicas-de-memorizacao/" rel="noopener noreferrer"&gt;https://blog.estacio.br/aluno-estacio/tecnicas-de-memorizacao/&lt;/a&gt; [Acessado em 7 de abril de 2023].&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.freepik.com/free-photo/black-relaxed-young-male-manager-practices-yoga-work-place-takes-rest-wellness-avoids-stress_11429853.htm#query=mind%20study&amp;amp;position=47&amp;amp;from_view=search&amp;amp;track=ais" rel="noopener noreferrer"&gt;Image by wayhomestudio&lt;/a&gt; on Freepik&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>career</category>
      <category>learning</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Código limpo de milhões!</title>
      <dc:creator>Roberto Costa</dc:creator>
      <pubDate>Fri, 07 Apr 2023 18:51:10 +0000</pubDate>
      <link>https://dev.to/robertheory/codigo-limpo-de-milhoes-3537</link>
      <guid>https://dev.to/robertheory/codigo-limpo-de-milhoes-3537</guid>
      <description>&lt;p&gt;Seu código é limpo, tudo bem! Mas ele é de milhões?&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é um código limpo?
&lt;/h2&gt;

&lt;p&gt;Gosto de dizer que um código limpo não impõe dificuldades desnecessárias para sua compreensão e busca utilizar a maneira mais eficaz de resolver os problemas propostos.&lt;/p&gt;

&lt;p&gt;Logo, o oposto também é possível, um código incompreensível, que resolve tudo da forma mais complexa, e ainda sim funciona.&lt;/p&gt;

&lt;p&gt;&lt;cite&gt;&lt;br&gt;
Mesmo um código ruim pode funcionar. Mas se ele não for limpo, pode acabar com uma empresa de desenvolvimento. — Robert C. Martin&lt;br&gt;
&lt;/cite&gt;&lt;/p&gt;

&lt;p&gt;Mas se um código ruim funciona, pra que eu devo me preocupar em fazer do jeito certo?&lt;/p&gt;

&lt;h3&gt;
  
  
  Devo me preocupar em aprender isso?
&lt;/h3&gt;

&lt;p&gt;Escrever um código melhor, significa menos esforço (e tempo) para qualquer atividade, seja criativa, manutenção, refatoração, ou até mesmo a admissão de um novo colaborador que ainda não conhece seu código, mas saiba que daqui a 6 meses, você pode não lembrar tudo sobre o que programou, então as outras pessoas não são as únicas que se beneficiam disso.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quem está começando deveria aprender também?
&lt;/h3&gt;

&lt;p&gt;Se você está aprendendo a programar ou mesmo programando há 10 anos, não importa muito, pois o quanto antes aprendermos boas práticas, melhor, mas nunca é tarde para começar.&lt;/p&gt;

&lt;p&gt;Escrever código limpo é um processo de aprendizado e devemos assumir, que para escrever um código muito bom, é necessário começar escrevendo código ruim, este é um passo que não dá para pular, e mesmo depois que você aprender a escrever um código melhor, ainda existirão ocasiões onde você não vai conseguir seguir as boas práticas de um código limpo, por isso, o último tópico deste assunto se chama “Bom Senso”.&lt;/p&gt;

&lt;h2&gt;
  
  
  Aqui vão alguns temas clássicos e comuns que prezam pela qualidade do código escrito
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Nomes
&lt;/h3&gt;

&lt;p&gt;Funções, classes, métodos, argumentos, variáveis, tudo que pode ser nomeado deve possuir um nome explicativo para que a pessoa que esteja lendo não tenha que investigar o que este código faz, mas entender pelo nome.&lt;/p&gt;

&lt;h3&gt;
  
  
  KISS — Keep It Simple Stupid
&lt;/h3&gt;

&lt;p&gt;É comum adicionar complexidade em algo poderia ser bem mais simples, e faz parte de aprender, porém, uma abordagem simples ajuda muito para outras pessoas compreenderem e também para você, depois que passar um bom tempo sem olhar para a sua criação.&lt;/p&gt;

&lt;h3&gt;
  
  
  DRY — Don’t Repeat Yourself
&lt;/h3&gt;

&lt;p&gt;Este conceito incentiva o reuso de código que seria repetido em diversas partes do seu programa, realizando sempre as mesmas tarefas, onde qualquer modificação que fosse necessária, teria de ser feita em todos os locais que todas essas tarefas ocorrem.&lt;/p&gt;

&lt;p&gt;Utilizando este princípio, a pessoa iria reusar o mesmo pedaço de código e sempre que precisasse modificá-lo, esta modificação seria feita em um lugar apenas, tendo efeito em todas as localidades que o utilizam.&lt;/p&gt;

&lt;h3&gt;
  
  
  Regra do escoteiro
&lt;/h3&gt;

&lt;p&gt;Há um princípio do escotismo que diz que, uma vez que você sai da área em que está acampando, você deve deixá-la mais limpa do que quando a encontrou.&lt;/p&gt;

&lt;p&gt;Na programação, este conceito é bem importante pois nem sempre estaremos lidando com um código amigável, mas temos que ter o compromisso de primar pela qualidade do código e das boas práticas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Padrões / Convenções
&lt;/h3&gt;

&lt;p&gt;Um dos pontos mais importantes de um código limpo é a sua padronização, onde devemos definir certas regras que são importantes para a compreensão dos envolvidos, como por exemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Usar camel case ou pascal case nos nomes&lt;/li&gt;
&lt;li&gt;Constantes com nomes em maiúsculo&lt;/li&gt;
&lt;li&gt;Classes com a primeira letra maiúscula&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estes são alguns exemplos que são abordados em projetos reais e costumam ser definidos e seguidos pelos seus colaboradores.&lt;/p&gt;

&lt;h3&gt;
  
  
  Comentários
&lt;/h3&gt;

&lt;p&gt;Comentários no código é um assunto certamente polêmico, alguns acham essencial, outros um pecado, mas a verdade é que depende!&lt;/p&gt;

&lt;p&gt;Depende do projeto que você está, das práticas incentivadas na sua equipe e acima disso tudo, depende de quem escreve o código.&lt;/p&gt;

&lt;p&gt;Um código bem escrito é a sua própria documentação, todas as variáveis e funções tem nomes muito explicativos e só de ler você entende o que está acontecendo, mas nem sempre lidamos com código bem escrito.&lt;/p&gt;

&lt;p&gt;Comentários são um bom recurso para lidar com um código bagunçado pois precisamos deixar claro o que aqueles números mágicos e funções com nomes engraçados fazem.&lt;/p&gt;

&lt;p&gt;Os comentários são seus amigos, eles existem para te ajudar e você deve usar se achar que faz sentido.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tratamento de erros
&lt;/h3&gt;

&lt;p&gt;É inevitável se deparar com erros e comportamentos inesperados na programação, e é uma boa prática realizar tratamentos para eliminar ou minimizar estes problemas, pois se aconteceu uma vez, irá acontecer novamente e é melhor estar preparado para tal.&lt;/p&gt;

&lt;p&gt;Muitas vezes temos erros causados pelo comportamento do usuário, digitando letras onde deveria ter apenas números, por exemplo, e este é outro ponto importante no tratamento de erros, cobrir os erros causados pelo usuário.&lt;/p&gt;

&lt;p&gt;Devemos enxergar o usuário como uma criança:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A maior parte do tempo não sabe o que está fazendo&lt;/li&gt;
&lt;li&gt;Nunca vai saber ou se importar com a consequência dos seus atos e por isso você deve se preocupar por ele&lt;/li&gt;
&lt;li&gt;Deve ser protegido de coisas que não devem ser de sua preocupação (como códigos de erros gigantes)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Bom senso
&lt;/h3&gt;

&lt;p&gt;Mais importante que um milhão de regras é ter bom senso para compreender que as regras são um guia e nem sempre poderemos seguí-las mas devemos buscar reforçá-las, contudo, o objetivo destas regras é ajudar a melhorar a qualidade de código e facilidade de manutenção, mas se achar que estão atrapalhando você e a sua equipe mais do que ajudando, bem, está aí mais uma oportunidade de exercitar seu bom senso!&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://balta.io/blog/clean-code" rel="noopener noreferrer"&gt;Clean Code - Guia e Exemplos - André Baltieri&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.oreilly.com/library/view/clean-code-a/9780136083238/" rel="noopener noreferrer"&gt;Livro Clean Code de Robert C. Martin&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Imagem de capa: &lt;a href="https://www.freepik.com/free-photo/html-css-collage-concept-with-person_36295457.htm#query=code&amp;amp;position=1&amp;amp;from_view=search&amp;amp;track=sph" rel="noopener noreferrer"&gt;Freepik&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cleancode</category>
      <category>programacao</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
