<?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: Elenndev</title>
    <description>The latest articles on DEV Community by Elenndev (@elenndev).</description>
    <link>https://dev.to/elenndev</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%2F3117428%2F13b6fecc-257c-45d5-b03e-84a0348cf11e.png</url>
      <title>DEV Community: Elenndev</title>
      <link>https://dev.to/elenndev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/elenndev"/>
    <language>en</language>
    <item>
      <title>Stop Storing Secrets in Your Frontend .env File</title>
      <dc:creator>Elenndev</dc:creator>
      <pubDate>Wed, 12 Nov 2025 12:10:07 +0000</pubDate>
      <link>https://dev.to/elenndev/stop-storing-secrets-in-your-frontend-env-file-20i0</link>
      <guid>https://dev.to/elenndev/stop-storing-secrets-in-your-frontend-env-file-20i0</guid>
      <description>&lt;h2&gt;
  
  
  The real deal about env variables
&lt;/h2&gt;

&lt;p&gt;By the time i realized it, i had already started to understand environment variables as an always trusted way to store secret values, which well, isn't completely wrong but not the most effective way to understand them, because env variables behave differently on backend and frontend, so understand this difference is super important to avoid some some tricky and risky situation.&lt;br&gt;
But then how do we define what env variables are? The most intuitive way is to say that they are dynamically set values that are set in the environment where a program executes instead  of directly in the code, making our applications easier to configure, so they have different behaviors depending on the value defined in that environment.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;## value in the development .env file
API_URL=http://localhost:3000/

## value in the prod .env file
API_URL=https://yourdomain/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So since the value isn't explicit in the code, in fact we can say that the value is more secure when we use env variables, you make sure to put the .env file in the .gitignore so git won't track it, and in your backend application code, you use some libraries like dotenv so your app can use these values and since it's a backend application, this value never leaves the server, so yep we're safe so far :).&lt;br&gt;
But when it comes to frontend applications, like React, Vite, etc, we still can use "env variables" but they don't remain secret. They are still env variables because their main functionality, having their value defined within the environment, still remains, but this it's when i remember what i  highlighted in the beginning of how thinking of them as an always trusted way to store values can be dangerous.&lt;/p&gt;
&lt;h2&gt;
  
  
  How frontend deals with env variables
&lt;/h2&gt;

&lt;p&gt;When we run the app, our frontend framework it will produce a static javascript bundle. For example, when we use this in the code:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;secretKey&lt;/span&gt; &lt;span class="o"&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;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;VITE_SECRET_KEY&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;secretKey&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This &lt;code&gt;import.meta.env.VITE_SECRET_KEY&lt;/code&gt; is replaced with the literal value that we put in our .env file. So when we build and run our application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run build
npx vite preview
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open the browser's inspect:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F24sezc73ygfgemm14scb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F24sezc73ygfgemm14scb.png" alt="Screenshot of the browser's inspect" width="294" height="99"&gt;&lt;/a&gt;&lt;br&gt;
Of course you shouldn't &lt;code&gt;console.log&lt;/code&gt; your env variables in backend applications, much less at frontend ones, but on this code i just want to show how the literal value of your env variables is going to reach the client.&lt;/p&gt;

&lt;h2&gt;
  
  
  So i can't use them on the frontend?
&lt;/h2&gt;

&lt;p&gt;Not exactly :p. Using environment variables in the frontend is still something you can do to take advantage of their flexibility and benefits, but only for non-sensitive configuration values such as API endpoints, app modes or even public service keys.&lt;br&gt;
When your frontend needs to use some sensitive information, always use a backend middleware to handle that data securely, so the secret data stays hidden on the server while the frontend still gets access to the functionality it needs.&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>security</category>
      <category>beginners</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Dados, rótulos e aprendizado: Entendendo os processos que moldam a inteligência artificial</title>
      <dc:creator>Elenndev</dc:creator>
      <pubDate>Sat, 11 Oct 2025 23:50:03 +0000</pubDate>
      <link>https://dev.to/elenndev/dados-rotulos-e-aprendizado-entendendo-os-processos-que-moldam-a-inteligencia-artificial-2d25</link>
      <guid>https://dev.to/elenndev/dados-rotulos-e-aprendizado-entendendo-os-processos-que-moldam-a-inteligencia-artificial-2d25</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Essa publicação apresenta uma visão clara e objetiva sobre o processo de rotulagem de dados e paradigmas de aprendizagem que formam o treinamento de modelos de IA, servindo como base sólida para um estudo mais aprofundado posteriormente.&lt;/p&gt;




&lt;h2&gt;
  
  
  Rotulagem de dados
&lt;/h2&gt;

&lt;p&gt;Podemos definir essa rotulagem como o processo de analisar dados brutos e adicionar rótulos significativos e informativos (tags, anotações, palavras-chave) para que a IA possa aprender com esse dado.&lt;br&gt;
Essa etapa é crucial para o aprendizado de um modelo, pois a qualidade das respostas da IA reflete diretamente a qualidade dos dados com os quais ela foi treinada.&lt;br&gt;
Alguns exemplos de rotulagem de dados:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rotulagem de imagem: Tags relevantes são atribuídos para identificar elementos em uma imagem, permitindo que a IA aprenda a distinguir objetos.&lt;/li&gt;
&lt;li&gt;Rotulagem de texto: Adiciona informações úteis ao material escrito para que a IA possa identificar o assunto e os tópicos do conteúdo, diagnosticar erros e sugerir melhorias.&lt;/li&gt;
&lt;li&gt;Rotulagem de áudio: Converter dados de áudio para material escrito e extrair dados relevantes como identificar emoções.&lt;/li&gt;
&lt;li&gt;Rotulagem de vídeo: Atribuir tags avançadas para que a IA consiga identificar objetos no vídeo, compreender o acontecimento de ações na cena e contexto do momento.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agora que o conceito desse processo e a sua importância já estão claros, vamos compreender as diferentes maneiras de se realizar a rotulagem dos dados.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tipos de rotulagem de dados
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Rotulagem manual: A Rotulagem é feita manualmente por equipes humanas, essa abordagem é aplicada principalmente em cenários em que a consequência de falha é alta, pois embora seja uma opção mais lenta, garante a alta qualidade dos rótulos.&lt;/li&gt;
&lt;li&gt;Rotulagem automatizada: O modelo de machine learning que irá ter a responsabilidade de realizar a rotulagem, portanto esses modelos devem ser capazes de identificar padrões para descobrirem as regras de rotulagem. Aumenta a eficiência do processo, porém se tornam mais vulneráveis a replicação de vieses que os dados originais podem carregar.&lt;/li&gt;
&lt;li&gt;Rotulagem semi-automatizada: A rotulagem é feita com a IA que aprende com dados que já foram previamente rotulados, em seguida, a equipe humana vai revisar e corrigir essa rotulagem. Combinando a rotulagem manual e automatizada, essa proposta acelera o processo e mantém a qualidade dos dados.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Paradigmas de aprendizagem
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Supervisionada
&lt;/h4&gt;

&lt;p&gt;Essa aprendizagem incorpora uma &lt;strong&gt;visão empirista&lt;/strong&gt;, aonde o conhecimento é construído a partir de experiências. Isso significa que o algoritmo aprende a partir de um conjunto de dados rotulado e que cada amostra do treinamento possui uma &lt;strong&gt;entrada-saída&lt;/strong&gt; esperada.&lt;br&gt;
Durante o treinamento o modelo faz previsões para cada amostra e no final compara os resultados obtidos com os rótulos reais para ajustar os parâmetros e minimizar erros.&lt;br&gt;
A aprendizagem supervisionada tem o objetivo de treinar a máquina para descobrir o padrão e as relações existentes entre os dados, comumente utilizada em classificar imagens e realizar filtros.&lt;/p&gt;

&lt;h4&gt;
  
  
  Não supervisionada
&lt;/h4&gt;

&lt;p&gt;Ela se baseia em &lt;strong&gt;teorias construtivistas&lt;/strong&gt; pois o sistema organiza os dados brutos por conta própria, buscando padrões e identificando estruturas.&lt;br&gt;
Nessa abordagem as saídas correspondentes são desconhecidas, se mostrando ideal para cenários em que existe uma grande quantidade de dados não rotulados, por isso, é essencial que os resultados sejam analisados por especialistas para garantir a qualidade das saídas e refinar o modelo, sendo bastante utilizada para simplificar informações e para clusterização.&lt;/p&gt;

&lt;h4&gt;
  
  
  Semi-supervisionada
&lt;/h4&gt;

&lt;p&gt;Esse paradigma combina um conjunto de dados rotulados com dados não rotulados, imitando o aprendizado humano que aprende a partir de experiência e exemplos.&lt;br&gt;
Ela se inicia com o treinamento do algoritmo utilizando o conjunto de dados rotulados e avança usando em seu treinamento os dados não rotulados, dessa forma, os dados rotulados são a base essencial para todo o processo de aprendizado do modelo.&lt;/p&gt;

&lt;h4&gt;
  
  
  Aprendizagem auto-supervisionada
&lt;/h4&gt;

&lt;p&gt;Muito utilizada em NLP (Processamento de linguagem natural, em inglês, &lt;em&gt;Natural Language Processing&lt;/em&gt;), essa abordagem busca gerar rótulos a partir da estrutura dos dados, utilizando os dados não rotulados para criar sinais de treinamento, ou seja, prevendo partes  faltantes das entradas, a partir das partes existentes. &lt;br&gt;
Para serem capazes de fazer isso, os modelos devem passar por tarefas pré-treinamento como prever o próximo token, esses exercícios buscam fazer com o que o modelo possa compreender o contexto e as relações dos dados.&lt;/p&gt;

&lt;h4&gt;
  
  
  Aprendizagem por reforço
&lt;/h4&gt;

&lt;p&gt;Essa aprendizagem se alinha com a abordagem &lt;strong&gt;behaviorista&lt;/strong&gt;, ou seja, o conhecimento é moldado por meio de interações com o ambiente e as recompensas ou penalidades recebidos pelas ações realizadas e espelha processos naturais de aprendizagem.&lt;br&gt;
Nessa forma de aprendizagem ao invés de utilizar dados rotulados ou não rotulados para aprender como nos paradigmas apresentados anteriormente, o modelo aprende a atingir um objetivo em um ambiente incerto, utilizando tentativa e erro para encontrar uma maneira de alcançar aquela meta, recebendo &lt;strong&gt;recompensas ou penalidades&lt;/strong&gt; pelas ações que executa durante o processo.&lt;br&gt;
Embora o engenheiro defina as regras de recompensa, cabe ao modelo descobrir as melhores práticas para maximizar as recompensas.&lt;br&gt;
Um dos desafios para a aplicação dessa paradigma é definir as funções de recompensas pois recompensas mal projetadas pode levar a comportamentos não intencionais.&lt;/p&gt;

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

&lt;p&gt;A rotulagem de dados é o pilar no qual se constrói o aprendizado da inteligencia artificial, e pode ser realizada de diversas maneiras, assim como os paradigmas de aprendizado que oferecem diferentes estratégias de treinamento. &lt;br&gt;
Compreender esses conceitos e diferentes abordagens permite aprimorar a eficiência de modelos éticos e escaláveis.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC10287014/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;What is data labeling?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC10287014/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Bias in artificial intelligence algorithms and recommendations for mitigation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.labelforce.ai/post/the-impact-of-data-labeling-on-ai-bias-and-how-to-mitigate-it" rel="noopener noreferrer"&gt;The Impact of Data Labeling on AI Bias and How to Mitigate It&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://deepsense.ai/blog/what-is-reinforcement-learning-deepsense-ais-complete-guide/" rel="noopener noreferrer"&gt;What is reinforcement learning? deepsense.ai’s complete guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.accenture.com/us-en/blogs/data-ai/learning-paradigms-ai" rel="noopener noreferrer"&gt;Learning paradigms in AI – Understanding how AI learns&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/html/2301.05712v4" rel="noopener noreferrer"&gt;A Survey on Self-supervised Learning: Algorithms, Applications, and Future Trends&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>datascience</category>
      <category>ai</category>
      <category>beginners</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Object Calisthenics: um treino para programadores, não para máquinas</title>
      <dc:creator>Elenndev</dc:creator>
      <pubDate>Tue, 19 Aug 2025 17:46:12 +0000</pubDate>
      <link>https://dev.to/elenndev/object-calisthenics-um-treino-para-programadores-nao-para-maquinas-3hfn</link>
      <guid>https://dev.to/elenndev/object-calisthenics-um-treino-para-programadores-nao-para-maquinas-3hfn</guid>
      <description>&lt;p&gt;Como desenvolvedores o que sempre buscamos é aprimorar a nossa escrita de código, não apenas no sentido de performance, buscando algoritmos mais eficientes, mas também na legibilidade. Afinal, não escrevemos código apenas para a máquina, mas para pessoas, seja outro desenvolvedor ou você mesmo no futuro. Por isso, é fundamental desenvolver utilizando boas práticas, que incluem desde arquiteturas específicas ou simplesmente alguns princípios que quando bem aplicados levam seu código para outro nível.&lt;br&gt;
O que será abordado nesta publicação é o &lt;strong&gt;Object Calisthenics&lt;/strong&gt;, suas regras não só de forma teórica mas também com exemplos trazendo primeiro um código 'bagunçado' e logo em seguida o refatorar aplicando essas regras. &lt;br&gt;
Além desse conceito, ao implementar esse princípio, também serão explicados outros conceitos como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Guardianship Clause;&lt;/li&gt;
&lt;li&gt;Fail-Fast;&lt;/li&gt;
&lt;li&gt;Early Return;&lt;/li&gt;
&lt;li&gt;Primitive Obsession&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Conceito
&lt;/h2&gt;

&lt;p&gt;Primeiro, o que é o Object Calisthenics afinal? Criado por Jeff Bay no seu livro &lt;em&gt;ThoughtWorks Anthology&lt;/em&gt;, é um conjunto de princípios que buscam aprimorar a qualidade do código e tornar mais fácil a manutenção e os testes especificamente na programação orientada a objeto.&lt;br&gt;
São as 9 regras:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Only One Level Of Indentation Per Method&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don’t Use The ELSE Keyword&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wrap All Primitives And Strings&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;First Class Collections&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;One Dot Per Line&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Don’t Abbreviate&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keep All Entities Small&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No Classes With More Than Two Instance Variables&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No Getters/Setters/Properties&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Vamos entender com mais detalhes cada uma delas.&lt;/p&gt;

&lt;p&gt;Antes de prosseguir é importante lembrar que não necessariamente é obrigatório seguir todas as 'regras', vão existir exceções e situações em que o que é definido na regra, pode ser considerado 'negociável'.&lt;/p&gt;


&lt;h2&gt;
  
  
  1. Only One Level Of Indentation Per Method / 2. Don’t Use The ELSE Keyword
&lt;/h2&gt;

&lt;p&gt;Vamos ver as 2 primeiras regras (1. Apenas 1 nível de indentação por método e 2. Não use ELSE) juntas pois elas se completam. &lt;br&gt;
Vamos analisar esse código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Employee&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;department&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"accountant"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s"&gt;"seller"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"sales"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;department&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s"&gt;"administrative"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;department&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;role&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;department&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;department&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
          &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Invalid department"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
          &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Invalid role"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Invalid age"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Invalid name"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este código é bem simples, ele é o método construtor da classe &lt;code&gt;Employee&lt;/code&gt; que faz um conjunto de validações dos valores antes de instanciar de fato a classe e prosseguir com o código. Porém mesmo sendo um código simples, já se percebe de cara a quantidade de if's presentes nesse processo de validação, tornando o código complicado de se ler.&lt;br&gt;
Mas as validações são necessárias para instanciar essa classe, então como podemos arrumar isso sem arruinar a funcionalidade do código?&lt;br&gt;
Neste caso é utilizar o princípio do &lt;code&gt;Guardianship Clause&lt;/code&gt; juntamente com o &lt;code&gt;Fail-Fast&lt;/code&gt; ou o &lt;code&gt;Early Return&lt;/code&gt;. Podemos definir esses 3 termos de forma simples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Guardianship Clause&lt;/strong&gt; são cláusulas que verificam condições necessárias ou inesperadas no inicio de um método.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fail-Fast&lt;/strong&gt; significa algo como errar logo/imediatamente, essa abordagem prioriza a detecção e tratamento imediato de erros e falhas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Early Return&lt;/strong&gt; pode ser traduzido como retornar o mais cedo possível, aqui é priorizado a situação esperada do método/função.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Então vamos começar aplicando isso no nosso código, usando a abordagem do &lt;code&gt;Fail-Fast&lt;/code&gt; na verificação de &lt;code&gt;if (!name.equals(""))&lt;/code&gt; que verifica se &lt;code&gt;name&lt;/code&gt; é um nome válido.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Employee&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;department&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Invalid name"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"accountant"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s"&gt;"seller"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"sales"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;department&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s"&gt;"administrative"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;department&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
          &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
          &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;role&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
          &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;department&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;department&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Invalid department"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Invalid role"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Invalid age"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Note que como estamos usando o Fail-Fast, ao invés de verificar se &lt;code&gt;name&lt;/code&gt; tem um valor válido, estamos verificando se ele tem um valor inválido para assim tratar logo isso, nesse caso retornando um erro e impedindo que a função prossiga já que o dado não é válido.&lt;br&gt;
Com essa mudança fomos de 4 blocos de if-else para 3, agora é só aplicar a mesma lógica nos 3 ifs restantes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Employee&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;department&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Invalid name"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Invalid age"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="s"&gt;"accountant"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="s"&gt;"seller"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Invalid role"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="s"&gt;"sales"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;department&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="s"&gt;"administrative"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;department&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Invalid department"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;role&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;department&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;department&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;E agora temos o código funcionando da mesma forma porém dessa vez muito mais legível, sem &lt;code&gt;else&lt;/code&gt;, e atendendo também a regra de apenas 1 nível de indentação.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Envolva seus tipos primitivos e strings
&lt;/h2&gt;

&lt;p&gt;Muitas vezes acabamos caindo no chamado &lt;strong&gt;Primitive Obsession&lt;/strong&gt;, essa obsessão por tipos primitivos acontece quando usamos tipos primitivos para representar objetos que possuem comportamentos específicos. Essa regra busca eliminar esse problema, encapsulando os tipos primitivos em objetos. &lt;br&gt;
Vamos entender na prática, na forma como código se encontra agora, note como cada atributo tem um comportamento próprio que não são comportamentos primitivos de uma String. Porém as validações dos valores do atributo acontecem dentro do &lt;code&gt;constructor&lt;/code&gt; do objeto &lt;code&gt;Employee&lt;/code&gt;, ao deixar essas verificações espalhadas pela classe, começamos a violar o princípio de &lt;strong&gt;responsabilidade única&lt;/strong&gt; além de tornar o código menos reutilizável e dificultoso de ser incrementado.&lt;br&gt;
Sendo assim, podemos resolver isso criando uma classe pra cada atributo assim a classe é responsável por fazer a sua própria validação ao ser instanciada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Age&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Age&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Invalid age"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;getValue&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Name&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Invalid name"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
   &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getValue&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Role&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Role&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="s"&gt;"accountant"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="s"&gt;"seller"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Invalid role"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getValue&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Department&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Department&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;department&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="s"&gt;"sales"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;department&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="s"&gt;"administrative"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;department&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Invalid department"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;department&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getValue&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Dessa forma, podemos atualizar a classe Employee:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Employee&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Name&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Age&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Role&lt;/span&gt; &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Department&lt;/span&gt; &lt;span class="n"&gt;department&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Employee&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Name&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Age&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Role&lt;/span&gt; &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Department&lt;/span&gt; &lt;span class="n"&gt;department&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;role&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;department&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;department&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. First class collections
&lt;/h2&gt;

&lt;p&gt;Essa regra diz que se você tem uma coleção de elementos, tenha uma classe dedicada a essa coleção, ao invés de usar diretamente a lista como um atributo de outra classe. Mais uma vez vamos esclarecer isso com um exemplo prático, já temos uma classe para o Employee, vamos criar uma classe para a organização:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Company&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Employee&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;LegalName&lt;/span&gt; &lt;span class="n"&gt;legalName&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="no"&gt;CNPJ&lt;/span&gt; &lt;span class="n"&gt;cnpj&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Company&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Employee&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;LegalName&lt;/span&gt; &lt;span class="n"&gt;legalName&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="no"&gt;CNPJ&lt;/span&gt; &lt;span class="n"&gt;cnpj&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;employees&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;legalName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;legalName&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cnpj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cnpj&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Employee&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;getEmployees&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// demais getters...&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para aplicar o &lt;strong&gt;First Class Collections&lt;/strong&gt;, vamos encapsular a coleção dentro de uma classe, assim os comportamentos dessa coleção ficarão dentro da sua classe dedicada, então, criando a classe &lt;code&gt;Employees&lt;/code&gt;, podemos ter métodos exclusivos do &lt;strong&gt;conjunto de instâncias de &lt;code&gt;Employee&lt;/code&gt;,&lt;/strong&gt; como, &lt;code&gt;getters&lt;/code&gt; de funcionários de um cargo (&lt;code&gt;Role&lt;/code&gt;) ou departamento específicos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Employees&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Employee&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Employees&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Employee&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="o"&gt;()){&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Empty employee List"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Employee&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;getValue&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;ByRole&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Role&lt;/span&gt; &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
    &lt;span class="c1"&gt;// restante do código&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
   &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;ByDepartment&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Department&lt;/span&gt; &lt;span class="n"&gt;department&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
    &lt;span class="c1"&gt;// restante do código&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="c1"&gt;// outros métodos da **lista** como adicionar um novo employee, remover employees de um departamento especifico, etc...&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Agora podemos atualizar a classe &lt;code&gt;Company&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Company&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Employees&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;LegalName&lt;/span&gt; &lt;span class="n"&gt;legalName&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="no"&gt;CNPJ&lt;/span&gt; &lt;span class="n"&gt;cnpj&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Company&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Employees&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;LegalName&lt;/span&gt; &lt;span class="n"&gt;legalName&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="no"&gt;CNPJ&lt;/span&gt; &lt;span class="n"&gt;cnpj&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;employees&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;legalName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;legalName&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cnpj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cnpj&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Employees&lt;/span&gt; &lt;span class="nf"&gt;getEmployees&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. One Dot Per Line
&lt;/h2&gt;

&lt;p&gt;Vamos adicionar ao &lt;code&gt;Department&lt;/code&gt; um chefe do departamento:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Employee&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// restante do código ...&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Department&lt;/span&gt; &lt;span class="nf"&gt;getDepartment&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;department&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

 &lt;span class="c1"&gt;// restante do código ...&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;



&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Department&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// restante do código ...&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;DepartmentHead&lt;/span&gt; &lt;span class="n"&gt;departmentHead&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// restante do código ...&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;DepartmentHead&lt;/span&gt; &lt;span class="nf"&gt;getDepartmentHead&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;departmentHead&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DepartmentHead&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Name&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Age&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Role&lt;/span&gt; &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// constructor da classe&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Name&lt;/span&gt; &lt;span class="nf"&gt;getName&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Dessa forma para por exemplo, ter acesso ao nome do chefe do departamento que um &lt;code&gt;Employee&lt;/code&gt; X faz parte, teríamos que usar algo como:&lt;br&gt;
&lt;code&gt;employee.getDepartment().getDepartmentHead().getName().getValue()&lt;/code&gt;.&lt;br&gt;
Quantos pontos aqui né? Da maneira atual, geramos uma espécie de cadeia de chamadas o que resulta na exposição da estrutura da classe sem necessidade pra isso, além de dificultar a leitura do trecho do código. &lt;br&gt;
Podemos resolver isso fazendo com que os objetos tenham métodos que expressem claramente suas intenções, assim ao invés usar o método &lt;code&gt;getDepartment&lt;/code&gt; para obter o objeto de departamento do &lt;code&gt;Employee&lt;/code&gt; e só depois buscar o nome do &lt;code&gt;DepartmentHead&lt;/code&gt;, usamos métodos que vão retornar os valores específicos para isso, vamos esclarecer isso no código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Employee&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// restante do código ...&lt;/span&gt;

 &lt;span class="c1"&gt;// antes:&lt;/span&gt;
  &lt;span class="c1"&gt;// public Department getDepartment() {&lt;/span&gt;
    &lt;span class="c1"&gt;// return this.department;&lt;/span&gt;
  &lt;span class="c1"&gt;// }&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getDepartmentHead&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;department&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDepartmentHead&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// restante do código ...&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Department&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// restante do código&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getDepartmentHead&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// código antigo: return this.departmentHead;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;departmentHead&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getName&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DepartmentHead&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// restante do código&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getName&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// código antigo:  return this.name;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getValue&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Feito isso, agora para obter o mesmo valor que tentamos antes, precisamos de:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// antes: employee.getDepartment().getDepartmentHead().getName().getValue();&lt;/span&gt;
&lt;span class="n"&gt;employee&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDepartmentHead&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  6. Don’t Abbreviate
&lt;/h2&gt;

&lt;p&gt;Essa regra é bem simples e nem precisa de código para entender, não abrevie!&lt;br&gt;
Mas embora o conceito dela seja simples, muitas vezes violamos essa regra sem nem mesmo perceber. Talvez você já se viu em uma situação em que usou a abreviação como uma forma de fugir da repetição de código, mas aqui já entramos em outro ponto, o problema não está na repetição em si, e sim em algo mais profundo na estrutura do código. Ao seguir essa regra, conseguimos perceber falhas de design que antes poderiam passar despercebidas.&lt;/p&gt;
&lt;h2&gt;
  
  
  7. Keep All Entities Small
&lt;/h2&gt;

&lt;p&gt;Essa regra diz para mantermos nossas classes pequenas, com no máximo 50 linhas, e naturalmente isso não é nem um pouco fácil e muitas vezes pode se tornar até inviável a depender da complexidade da entidade, isso frequentemente é discutido na comunidade dev, alguns preferem usar essa regra tendo em mente 150 linhas, outros 200, enfim.&lt;br&gt;
Mas como havia dito no início dessa publicação, essas regras são um conjunto de princípios para conseguir alcançar boas práticas, e não uma fórmula perfeita que se seguida rigidamente entrega o melhor software do mundo.&lt;br&gt;
Assim, não tem problema a sua classe passar de 50 linhas, desde que as linhas que constroem essa classe, sejam de fato necessárias, então colocar essa regra em prática é se certificar que o que pode ser reduzido na classe, foi reduzido mas sempre de forma coerente. &lt;/p&gt;
&lt;h2&gt;
  
  
  8. No Classes With More Than Two Instance Variables
&lt;/h2&gt;

&lt;p&gt;Essa regra diz que não devemos ter mais de 2 instâncias de variável em uma classe, o objetivo dela é reforçar a coesão e composição da classe, pois se uma classe tem vários atributos, isso é um sinal de que ela está assumindo mais responsabilidades do que ela deveria.&lt;br&gt;
Para isso vamos analisar os atributos da classe &lt;code&gt;Employee&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Employee&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Name&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Age&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Role&lt;/span&gt; &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Department&lt;/span&gt; &lt;span class="n"&gt;department&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// restante do código ...&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;De forma geral, para solucionar esse problema, o que fazemos é quebrar o objeto em objetos menores pra melhor representar o conceito que a classe representa. No nosso exemplo, o nome e a idade são informações pessoais do colaborador, enquanto Cargo e departamento são informações empresariais, então vamos agrupar e corrigir isso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PersonalInfo&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Name&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Age&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;PersonalInfo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Name&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Age&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// getters e setters&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;JobInfo&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Role&lt;/span&gt; &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Department&lt;/span&gt; &lt;span class="n"&gt;department&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;JobInfo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Role&lt;/span&gt; &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Department&lt;/span&gt; &lt;span class="n"&gt;department&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;role&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;department&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;department&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

 &lt;span class="c1"&gt;// getters e setters&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Employee&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;PersonalInfo&lt;/span&gt; &lt;span class="n"&gt;personalInfo&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;JobInfo&lt;/span&gt; &lt;span class="n"&gt;jobInfo&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Employee&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;PersonalInfo&lt;/span&gt; &lt;span class="n"&gt;personalInfo&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;JobInfo&lt;/span&gt; &lt;span class="n"&gt;jobInfo&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;personalInfo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;personalInfo&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;jobInfo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jobInfo&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// restante do código ...&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  9. No Getters/Setters/Properties
&lt;/h2&gt;

&lt;p&gt;Essa regra busca acabar com a exposição de dados internos através dos getters, setters ou propriedades que ao invés de encapsular o comportamento, apenas expõem os dados, violando o o comportamento orientado a objeto.&lt;br&gt;
Vamos ao exemplo no nosso código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;JobInfo&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Role&lt;/span&gt; &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="c1"&gt;// restante do código&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setRole&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Role&lt;/span&gt; &lt;span class="n"&gt;newRole&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;role&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;newRole&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

 &lt;span class="c1"&gt;// restante do código ...&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Da forma atual, para atualizar a informação do cargo, usaríamos o &lt;code&gt;setRole&lt;/code&gt;, o que funcionaria, sim, porém vamos lembrar que estamos falando de uma classe, um objeto com seus comportamentos, então algo como mudança de cargo, são ações do contexto, como por exemplo, ser promovido:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;JobInfo&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Role&lt;/span&gt; &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="c1"&gt;// restante do código ...&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;promoteToManager&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;role&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Role&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"manager"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// restante do código ...&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

&lt;p&gt;O Object Calisthenics não é uma receita perfeita que deve ser seguida à risca, mas um conjunto de exercícios (o nome calistenia não é a toa xd) que nos faz enxergar pontos de melhoria e desenvolver bons costumes quando escrevemos nosso código.&lt;br&gt;
No final das contas, o objetivo é escrever um código que não somente a máquina vai entender e executar, mas que outros desenvolvedores possam compreender, evoluir e manter ao longo do tempo.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>MVC X Flux: A diferença entre essas arquiteturas de desenvolvimento</title>
      <dc:creator>Elenndev</dc:creator>
      <pubDate>Wed, 18 Jun 2025 13:29:22 +0000</pubDate>
      <link>https://dev.to/elenndev/mvc-x-flux-a-diferenca-entre-essas-arquiteturas-de-desenvolvimento-2ild</link>
      <guid>https://dev.to/elenndev/mvc-x-flux-a-diferenca-entre-essas-arquiteturas-de-desenvolvimento-2ild</guid>
      <description>&lt;p&gt;O MVC e o Flux são arquiteturas de desenvolvimento de software populares por prezarem a separação das responsabilidades em uma aplicação, buscando isolar a interface da lógica de negócio. &lt;br&gt;
Embora ambas compartilhem esse princípio, elas também apresentam diferenças na forma de aplicar e estruturar o fluxo de dados e é isso que será abordado nessa publicação.&lt;/p&gt;

&lt;h2&gt;
  
  
  MVC
&lt;/h2&gt;

&lt;p&gt;Começando com a arquitetura mais velha dentre as duas, o MVC foi desenvolvido para criar um padrão de arquitetura que separasse a aplicação em camadas reduzindo a dependência entre interface, lógica e controle.&lt;br&gt;
As camadas em questão são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model&lt;/strong&gt;: É o &lt;em&gt;Business Object Model (Objeto Modelo do Negócio)&lt;/em&gt;. Sua responsabilidade é gerenciar e controlar a forma como os dados se comportam por meio das funções lógicas se comportam. Ele é o detentor dos dados e recebe as informações do &lt;strong&gt;Controller&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Controller&lt;/strong&gt;: Camada responsável por intermediar as requisições enviadas pelo &lt;strong&gt;View&lt;/strong&gt; com as respostas fornecidas pelo &lt;strong&gt;Model&lt;/strong&gt;, processando os dados e repassando para outras camadas. De forma simplista, ele controla a comunicação entre os dados e a interação do usuário.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;View&lt;/strong&gt;: Camada responsável por apresentar as informações de forma visual ao usuário e enviar as requisições para o &lt;strong&gt;Controller&lt;/strong&gt;.
Então quando uma interação acontece, a interface, ou seja, a View, irá se comunicar com o Controller e este vai enviar os dados para o Model que irá realizar as operações necessárias para atualizar o estado da aplicação, assim o Model pode enviar a resposta para o Controller para que ele atualize a View com as novas informações ou pode tamém se comunicar diretamente com a View. 
Assim o fluxo de dados é &lt;strong&gt;bidirecional&lt;/strong&gt;, pois a View pode receber atualizações tanto do Model quanto do Controller.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Problemas ao escalar com o MVC e o surgimento do Flux
&lt;/h2&gt;

&lt;p&gt;O Flux foi desenvolvido pelo Facebook com a intenção de ser uma arquitetura que pudesse compensar os problemas que surgem quando se tenta escalar aplicações grandes usando o padrão MVC em interfaces altamente interativas.&lt;br&gt;
O fluxo &lt;strong&gt;bidirecional&lt;/strong&gt; do MVC em grandes aplicações criavam caminhos cruzados de atualizações e assim, geravam complexidade e imprevisibilidade, tornando difícil entender quem mudou o quê na aplicação e podendo surgir problemas de sincronização de estado.&lt;br&gt;
Então o Flux apresenta um fluxo de dados &lt;strong&gt;unidirecional&lt;/strong&gt;, facilitando o rastreamento e manutenção em aplicações complexas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Entendo o Flux
&lt;/h3&gt;

&lt;p&gt;Como vimos, o Flux é uma arquitetura de desenvolvimento de software que divide a aplicação em camadas e cria um fluxo unidirecional. &lt;br&gt;
As camadas em questão são as seguintes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stores: Responsável por gerenciar o &lt;strong&gt;estado&lt;/strong&gt; da aplicação, ela é atualizada cada vez que uma ação é realizada.&lt;/li&gt;
&lt;li&gt;Dispatcher: Objeto que gerencia as &lt;strong&gt;actions&lt;/strong&gt; que entram no sistema, quando uma ação surge, ele passa essa ação para os &lt;strong&gt;stores&lt;/strong&gt; registrados.&lt;/li&gt;
&lt;li&gt;View: É o componente de &lt;strong&gt;interface&lt;/strong&gt; do usuário, ele é responsável por renderizar a UI e lidar comas interações do usuário. Ele sofrerá uma re-renderização a cada vez que o &lt;strong&gt;Store&lt;/strong&gt; muda de estado.
Nesse modelo, a interação do usuário gera um evento, uma action, e esta vai despachar o evento para modificar os dados, essas alterações irão mudar o store de dados e por fim este irá enviar um evento de atualização para a View.
O fluxo é &lt;strong&gt;unidirecional&lt;/strong&gt; pois o dispatcher garante que todas as actions passem por ele e a View escuta somente a Store para poder se atualizar.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Principais diferenças
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;MVC&lt;/th&gt;
&lt;th&gt;Flux&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A view é atualizada quando o Model Muda&lt;/td&gt;
&lt;td&gt;A view é atualizada quando a Store muda&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;View pode ser atualizada pelo Controller e pelo Model&lt;/td&gt;
&lt;td&gt;View atualizada somente quando a Store mudar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Múltiplos pontos de modificação&lt;/td&gt;
&lt;td&gt;Caminho único de atualização&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;p&gt;Cada uma dessas arquiteturas já se provarão ser eficientes e eficazes no desenvolvimento de software, ambas apresentam vantagens para o desenvolvedor e compartilham semelhanças. Entender as diferenças entre elas ajuda a escolher qual é a mais adequada conforme a complexidade da aplicação, garantindo um desenvolvimento claro, organizado e escalável.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>WebSocket: entenda como essa ponte de dados funciona</title>
      <dc:creator>Elenndev</dc:creator>
      <pubDate>Mon, 09 Jun 2025 20:35:28 +0000</pubDate>
      <link>https://dev.to/elenndev/websocket-entenda-como-essa-ponte-de-dados-funciona-936</link>
      <guid>https://dev.to/elenndev/websocket-entenda-como-essa-ponte-de-dados-funciona-936</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Se você já desenvolveu aplicações que precisam se comunicar em tempo real como chats, jogos online ou sistemas de notificação, provavelmente já ouviu falar do WebSocket. Mas você realmente entende o que é esse protocolo e o que acontece "por baixo dos panos" quando uma conexão WebSocket é estabelecida?&lt;br&gt;
Esse post pretende explicar os conceitos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Definição de protocolo&lt;/li&gt;
&lt;li&gt;Definição do WebSocket e relação com HTTP&lt;/li&gt;
&lt;li&gt;WebSocket handshake&lt;/li&gt;
&lt;li&gt;Web Socket Frames&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Entendendo conceitos primordiais
&lt;/h2&gt;

&lt;p&gt;Antes de partir para explicação sobre o protocolo Web Socket, é essencial termos um entendimento sólido sobre o que é um protocolo afinal.&lt;br&gt;
Um &lt;strong&gt;protocolo&lt;/strong&gt; pode ser entendido como um conjunto de regras que ditam como as informações transmitidas em uma conexão são formatadas, transportadas, recebidas e interpretadas entre os dispositivos de uma rede. Ou seja, é o que permite que sua aplicação desenvolvida com Java, possa se comunicar com uma API desenvolvida com Python por exemplo, independente da linguagem de programação usada para construir o programa, o protocolo é a linguagem comum que torna possível essa comunicação.&lt;/p&gt;
&lt;h3&gt;
  
  
  Como essa comunicação acontece?
&lt;/h3&gt;

&lt;p&gt;Como dito anteriormente, o protocolo dita como uma comunicação vai ser formatada para ser enviada pela rede de uma API para outra, logo naturalmente é necessário que ambos os lados dessa comunicação estejam seguindo &lt;strong&gt;o mesmo protocolo&lt;/strong&gt;.&lt;br&gt;
Talvez você se pergunte, "como assim o dado precisa ser formatado antes de ser enviado?", isso acontece pois quando se trata de rede, resumindo para facilitar a compreensão, os dados transportados na rede são dados em linguagem de máquina, o velho 0 e 1.&lt;br&gt;
Então se você quer enviar a string &lt;code&gt;"Hello world"&lt;/code&gt;, antes ela é transformada em código binário, e ai sim, esse valor binário é o valor que vai ser transmitido na rede.&lt;br&gt;
Cada protocolo tem suas próprias regras para fazer essa "tradução", então essa mesma string, ao ser formatada por diferentes protocolos, se tornará um código binário diferente. Por isso a comunicação só vai funcionar se ambos os lados da conexão usarem o mesmo protocolo, além é claro de outros detalhes de segurança.&lt;/p&gt;
&lt;h2&gt;
  
  
  Entendendo o WebSocket
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;WebSocket&lt;/strong&gt; é um protocolo que permite uma conexão &lt;strong&gt;contínua, persistente e bidirecional&lt;/strong&gt; entre aparelhos, ou seja, é o protocolo que torna possível uma comunicação de via dupla entre o client e o server através de uma mesma conexão.&lt;br&gt;
Então enquanto com HTTPS estamos acostumados com esse fluxo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Ficwvlkkvs3yhng1nsjva.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Ficwvlkkvs3yhng1nsjva.png" alt="Diagrama sobre fluxo do protocolo HTTPS" width="800" height="1040"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nesse protocolo uma conexão é &lt;strong&gt;iniciada&lt;/strong&gt; com uma requisição e assim que o server envia a response, ela é &lt;strong&gt;encerrada&lt;/strong&gt;. &lt;br&gt;
Com o WebSocket, o negócio é diferente:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fbawlt8ewtw1z68mue255.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fbawlt8ewtw1z68mue255.png" alt="Diagrama sobre fluxo do protocolo HTTPS" width="800" height="1186"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos nos aprofundar nessa solicitação, aceitação de conexão e no conceito dos frames mais para frente, mas nesse momento, o que quero destacar é que uma vez feita a conexão, o client consegue enviar e receber várias mensagens do servidor, dentro da mesma conexão.&lt;br&gt;
Uma outra forma de visualizar a diferença do fluxo de comunicação nesses protocolos, é entender uma conexão como uma ponte:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Flio8s1cijh0am3lnkct8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Flio8s1cijh0am3lnkct8.png" alt="Desenho ilustrativo da diferença entre os protocolos HTTPS e WebSocket" width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enquanto no HTTPS essa ponte suporta apenas uma comunicação feita em uma direção por vez, com o WebSocket, varias mensagens, como carros, podem passar por essa ponte em diferentes direções ao mesmo tempo.&lt;/p&gt;
&lt;h2&gt;
  
  
  Como iniciar uma conexão com o WebSocket
&lt;/h2&gt;
&lt;h3&gt;
  
  
  WebSocket handshake
&lt;/h3&gt;

&lt;p&gt;Embora o &lt;strong&gt;websocket e o http&lt;/strong&gt; sejam protocolos distintos, precisamos utilizar o protocolo http para conseguir iniciar uma conexão websocket. &lt;br&gt;
Vamos entender isso melhor voltando para aquele diagrama que apresentei inicialmente:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fl58vzoln2o2ydq9d65xd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fl58vzoln2o2ydq9d65xd.png" alt="Trecho do diagrama do protocolo websocket" width="347" height="222"&gt;&lt;/a&gt;&lt;br&gt;
Começamos com o &lt;strong&gt;Client handshake request&lt;/strong&gt;, que é quando o client faz uma request &lt;strong&gt;GET HTTP&lt;/strong&gt; com um header que solicita um &lt;strong&gt;upgrade&lt;/strong&gt; para o protocolo WebSocket. Essa requisição vai ser basicamente assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="nf"&gt;GET&lt;/span&gt; &lt;span class="nn"&gt;/chat&lt;/span&gt; &lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt;
&lt;span class="na"&gt;Host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;example.com:8000&lt;/span&gt;
&lt;span class="na"&gt;Upgrade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;websocket&lt;/span&gt;
&lt;span class="na"&gt;Connection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Upgrade&lt;/span&gt;
&lt;span class="na"&gt;Sec-WebSocket-Key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dGhlIHNhbXBsZSBub25jZQ==&lt;/span&gt;
&lt;span class="na"&gt;Sec-WebSocket-Version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;13&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora o que acontece é o &lt;strong&gt;Server handshake response&lt;/strong&gt; que é uma response especial que indica se o server aceita ou não a mudança do protocolo atual (HTTP) para o protocolo WebSocket:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt; &lt;span class="m"&gt;101&lt;/span&gt; &lt;span class="ne"&gt;Switching Protocols&lt;/span&gt;
&lt;span class="na"&gt;Upgrade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;websocket&lt;/span&gt;
&lt;span class="na"&gt;Connection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Upgrade&lt;/span&gt;
&lt;span class="na"&gt;Sec-WebSocket-Accept&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;s3pPLMBiTxaQ9kYGzzhZRbK+xOo=&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em caso de aprovação e sucesso dessa mudança de protocolo, a resposta do servidor sempre será uma resposta de status &lt;code&gt;101&lt;/code&gt;, qualquer outro status será entendido pelo client como um erro nesse handshake.&lt;br&gt;
Então até o momento, ainda estamos utilizando o protocolo http, uma vez que esse processo de handshake é finalizado com sucesso, ai sim é realizado a troca de protocolo. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Flc562kpihq8aiwt52bvz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Flc562kpihq8aiwt52bvz.png" alt="Ilustração de um handshake de sucesso" width="800" height="236"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  WebFrames
&lt;/h2&gt;

&lt;p&gt;Agora que entendemos como essa conexão é iniciada, vamos analisar como a comunicação nela acontece. Enquanto o HTTP como já sabemos é uma comunicação feita através de responses e requests, o WebSocket utiliza &lt;strong&gt;frames&lt;/strong&gt; para se comunicar, esses frames são unidades de informação, uma estrutura de dados que consiste basicamente em um header e um payload. Existem vários tipos de Frames que podem ser classificados como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Control Frames&lt;/strong&gt;: Frames que comunicam o estado sobre o WebSocket, é divido em vários tipos como &lt;code&gt;close frame&lt;/code&gt; que é usado para encerrar uma conexão, os &lt;code&gt;pings&lt;/code&gt; e &lt;code&gt;closing handshake&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Frames&lt;/strong&gt;: Frames que carregam os dados da comunicação. Os Data Frames podem ser fragmentados, ou seja, 1 informação pode ser divida em vários frames para ser transportada. Esses data frames também possuem seus tipos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vamos observar a estrutura básica de um frame, disponibilizado pelo &lt;a href="https://datatracker.ietf.org/doc/html/rfc6455#section-5" rel="noopener noreferrer"&gt;Datatracker&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F9gwicfc8wbfyzj7se0is.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F9gwicfc8wbfyzj7se0is.png" alt="Exemplo de frame básico" width="647" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos analisar as partes fundamentais dessa estrutura:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;FIN&lt;/code&gt;: O primeiro bit do byte, este informa se o frame é o último fragmento ou não daquela informação. Se for &lt;code&gt;1&lt;/code&gt; é o fragmento final, se for &lt;code&gt;0&lt;/code&gt; significa que existem mais fragmentos para serem recebidos para que a mensagem seja considerada completa.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;OPCODE&lt;/code&gt;: Composto pelos últimos 4 bits do primeiro byte. Esses &lt;strong&gt;4 bits&lt;/strong&gt; definem o tipo de frame.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tipos de Data Frame
&lt;/h3&gt;

&lt;p&gt;Quando falamos de &lt;code&gt;Data Frames&lt;/code&gt;, eles são divididos em diferentes tipos e como mostrado anteriormente, esse tipo é determinado no &lt;code&gt;OPCODE&lt;/code&gt;. Por exemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;0001 = Informa que é um text frame, que contém um text data codificado em UTF-8.&lt;/li&gt;
&lt;li&gt;0010 = Informa que é um binary frame, ou seja, contém conteúdo binário.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;O protocolo Web Socket permite uma conexão de duas direções e persistente, tornando possível um melhor desempenho em aplicações que exigem uma troca de dados em tempo real como por exemplo um aplicativo de chat. &lt;br&gt;
Embora na prática, ao implementar esse protocolo em projetos, é comum comum utilizar bibliotecas que facilitam esse processo pro desenvolvedor como por exemplo o &lt;a href="https://socket.io" rel="noopener noreferrer"&gt;Socket.IO&lt;/a&gt; em aplicações com Javascript, é fundamental termos conhecimento de como esses processos funcionam.&lt;br&gt;
Um exemplo desse protocolo funcionando na prática, desenvolvido com React e NodeJs, pode ser &lt;a href="https://github.com/elenndev/chat-nownow" rel="noopener noreferrer"&gt;conferido no GitHub&lt;/a&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Leituras que auxiliaram essa publicação:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers" rel="noopener noreferrer"&gt;Writing WebSocket servers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://websocket.org/guides/websocket-protocol/" rel="noopener noreferrer"&gt;WebSocket&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://datatracker.ietf.org/doc/html/rfc6455#section-5.2" rel="noopener noreferrer"&gt;Datatracker&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Desvendando SSR, CSR, SSG e RSC: Entenda de vez essas siglas do React e Next.js</title>
      <dc:creator>Elenndev</dc:creator>
      <pubDate>Sat, 03 May 2025 18:30:08 +0000</pubDate>
      <link>https://dev.to/elenndev/desvendando-ssr-csr-ssg-e-rsc-entenda-de-vez-essas-siglas-do-react-e-nextjs-4d4a</link>
      <guid>https://dev.to/elenndev/desvendando-ssr-csr-ssg-e-rsc-entenda-de-vez-essas-siglas-do-react-e-nextjs-4d4a</guid>
      <description>&lt;p&gt;Quando decidi ir além do react e me aprofundar nos estudos com Next.JS frequentemente me via cercada por essa sopa de letrinhas, SSR, CSR, RSC, quantas siglas ein?&lt;br&gt;
Em muitos momentos esses conceitos se relacionam e por terem nomes semelhantes podem ser facilmente confundidos principalmente quando estamos iniciando nos estudos. &lt;br&gt;
Esse post tem o objetivo de esclarecer o conceito, diferença e aplicação dos seguintes termos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SSR&lt;/li&gt;
&lt;li&gt;SSG&lt;/li&gt;
&lt;li&gt;CSR&lt;/li&gt;
&lt;li&gt;React Component&lt;/li&gt;
&lt;li&gt;React Element&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Diferença iniciais
&lt;/h2&gt;

&lt;p&gt;Antes de se aprofundar nos conceitos um por um, é importante esclarecer o que para mim é a chave para diferenciar eles:&lt;br&gt;
O SSR (Server Side Rendering), CSR (Client Side Rendering) e SSG (Static Site Generation) se referem a estratégia de renderização em &lt;strong&gt;nível de página&lt;/strong&gt;, já o RSC (React Server Components) se refere a &lt;strong&gt;renderização dos componentes&lt;/strong&gt; que posteriormente formarão a página, ou seja, enquanto o output do SSR e CSR é o HTML, o output de um RSC é uma notação customizada, semelhante a um JSON que descreve como deve ser feita a renderização do componente, se essa última parte ficou um pouco confusa, não se preocupe, iremos nos aprofundar com um exemplo logo adiante mas é importante lembrar das diferença chave: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SSR, CSR, SSG: Nível de página&lt;/li&gt;
&lt;li&gt;RSC: Nível de componente.
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  CSR
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Conceito
&lt;/h3&gt;

&lt;p&gt;O CSR é a estratégia de renderizar o UI no navegador. Logo após fazer a requisição, a resposta que o servidor entregará será ao invés da página pronta, um &lt;strong&gt;html vazio&lt;/strong&gt; e o pacote de javascript que contém todas as instruções para gerar a página completa, ao chegar no navegador esse código é rodado e a página é computada já com interatividade. &lt;br&gt;
A vantagem é que quando a página é renderizada pela primeira vez ela já será interativa, a desvantagem é que quando o usuário recebe a resposta da sua requisição, ele ainda precisa esperar o código ser rodado no navegador para gerar de fato a página e enquanto isso ele vai ficar visualizando aquela famosa página em branco.&lt;/p&gt;
&lt;h3&gt;
  
  
  Exemplo na prática
&lt;/h3&gt;

&lt;p&gt;Esse é o conceito que temos contato direto ao trabalhar com React, veja um exemplo simples de um &lt;code&gt;App.tsx&lt;/code&gt; que renderiza um componente react&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app.tsx&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Homepage&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;./pages/Home/Homepage&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&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="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Homepage&lt;/span&gt;&lt;span class="p"&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;App&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Homepage.tsx&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Homepage&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;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Esse log aparecerá no console do navegador!&lt;/span&gt;&lt;span class="dl"&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;(&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Esse é o h1 do componente Homepage!&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&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="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;Homepage&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O output será algo como:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fgnxrtlrtrv74sy29fblc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fgnxrtlrtrv74sy29fblc.png" alt="output do código react" width="655" height="345"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Primeiro, note que o &lt;code&gt;console.log&lt;/code&gt; aparece no console do navegador, além disso ali temos o nosso &lt;code&gt;h1&lt;/code&gt;que foi renderizado dentro da &lt;code&gt;div&lt;/code&gt; com o &lt;code&gt;id root&lt;/code&gt;. Agora desative o javascript da página no navegador e recarregue a página. Vamos ver o que aparece agora:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fia5651ap73tbiwbw8745.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fia5651ap73tbiwbw8745.png" alt="output do código como javascript do navegador desativado" width="653" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Uma página em branco que contém apenas a &lt;code&gt;div root&lt;/code&gt;, além disso o &lt;code&gt;console.log&lt;/code&gt; também não está aparecendo, o que aconteceu?&lt;br&gt;
Aqui o servidor fez a parte dele, ele enviou o código react que o navegador precisa rodar para renderizar o UI, mas como desativamos o javascript do navegador ele não conseguiu completar sua missão de renderizar a página.&lt;/p&gt;
&lt;h2&gt;
  
  
  SSR (Server Side Rendering), SSG (Static Site Generation) e RSC (React Server Components)
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Conceitos
&lt;/h3&gt;

&lt;p&gt;Vamos começar com SSR E SSG pois ambos são bastante semelhantes e passam pelo mesmo processo de "hidratação" da página.&lt;br&gt;
O &lt;strong&gt;SSR&lt;/strong&gt; é a estratégia de renderizar a página completamente no servidor, assim a renderização acontece no server &lt;strong&gt;quando a requisição é feita&lt;/strong&gt;. &lt;br&gt;
Dessa maneira a vantagem é que a resposta da requisição do usuário será a página prontinha, logo o usuário recebe a página rapidamente. &lt;br&gt;
A desvantagem é que esse HTML entregue é completamente estático, a interatividade só é possível depois que acontece o processo de &lt;strong&gt;hydration&lt;/strong&gt; que é uma segunda renderização, vamos entender o que é esse conceito e como ele funciona.&lt;br&gt;
Além do HTML pronto o servidor também envia o pacote javascript, este será &lt;strong&gt;rodado no navegador&lt;/strong&gt; (lembrando que o conteúdo estático da página já está montado) para montar uma DOM virtual e logo em seguida comparar a DOM virtual com a DOM real para que a real seja atualizada com a interatividade.&lt;br&gt;
Esse processo de atualizar a DOM real adicionando interatividade é o que chamados de &lt;strong&gt;hydration&lt;/strong&gt; ou simplesmente &lt;strong&gt;hidratação&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Agora o &lt;strong&gt;SSG&lt;/strong&gt; (Static Site Generation) é bastante semelhante ao SSR pois a renderização também é feita no lado do servidor, a diferença é que enquanto no SSR ela é feita em tempo de requisição, no &lt;strong&gt;SSG&lt;/strong&gt; a renderização é feita no momento do &lt;strong&gt;build da aplicação&lt;/strong&gt;. &lt;br&gt;
Assim no SSG também acontece o método de hydration uma vez que o client recebe o html para que a página tenha interatividade.&lt;/p&gt;
&lt;h3&gt;
  
  
  Diferença entre React Component e React Element
&lt;/h3&gt;

&lt;p&gt;Então antes de prosseguir para os exemplos e ver na prática como o Next lida com os SSR, SSG e afins, precisamos entender realmente o que é um React component e como ele se torna de fato um conteúdo HTML. &lt;br&gt;
É necessário compreender que um &lt;strong&gt;React Component&lt;/strong&gt; é uma função ou classe que retorna um &lt;strong&gt;React Element&lt;/strong&gt;, pode parecer meio abstrato mas podemos facilmente enxergar isso tanto em uma aplicação React como uma aplicação Next, para isso basta importar um componente react e fazer o console.log dele, vamos entender melhor com um exemplo.&lt;br&gt;
Primeiro vamos criar um &lt;code&gt;React Component&lt;/code&gt; que retorna uma div e recebe uma &lt;code&gt;props&lt;/code&gt; que vai ser usada para ser o &lt;code&gt;id&lt;/code&gt; dessa div:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="nx"&gt;idContainer&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="nl"&gt;idContainer&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kr"&gt;string&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;idContainer&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Aqui temos um parágrafo simples&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;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;Agora vamos importar esse componente em uma página mas além de simplesmente renderizar ele, vamos chamar esse container como uma função em um &lt;code&gt;console.log&lt;/code&gt; para ver o output dele:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Container&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Container&lt;/span&gt;&lt;span class="dl"&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Page&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;idContainer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;componenteExemplo&lt;/span&gt;&lt;span class="dl"&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;(&amp;lt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Container&lt;/span&gt; &lt;span class="na"&gt;idContainer&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;componenteExemplo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&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 vamos observar o console.log que colocamos no terminal:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fuj139lvy6xgoyi8r1gd1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fuj139lvy6xgoyi8r1gd1.png" alt="output do console.log" width="526" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O que estamos vendo aqui é o &lt;strong&gt;React Element&lt;/strong&gt; que o React Component &lt;code&gt;Container&lt;/code&gt; retorna, logo assim fica fácil de compreender que o React Element é um plain object que descreve um componente UI como um DOM node, contendo os seus atributos, os atributos do seus componentes filhos e também do seu componente pai, por exemplo nesse caso o nosso componente é do tipo 'div', ele tem um children que é um 'p' com seus próprios atributos e aqui podemos também ver os atributos do elemento pai que é um Page do servidor. Muito massa né?&lt;/p&gt;




&lt;p&gt;Já estamos familiarizandos com os &lt;code&gt;React Client Components&lt;/code&gt; que vimos logo no começo ao tratar do conceito de CRS, mas no exemplo de agora o que acabamos de ver foi um &lt;code&gt;React Server Component&lt;/code&gt; sendo renderizado no Next.js.&lt;br&gt;
O &lt;strong&gt;RSC&lt;/strong&gt; (React Server Component) entra na história como uma maneira de renderizar o componente react no servidor ao invés do navegador, vamos continuar com o nosso exemplo agora focando no Next.JS, vamos criar um componente &lt;code&gt;Counter&lt;/code&gt; e colocar ele dentro do nosso componente &lt;code&gt;Container&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Componente &lt;code&gt;Counter&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;use client&lt;/span&gt;&lt;span class="dl"&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;useState&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&lt;/span&gt;&lt;span class="dl"&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;(){&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;counter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCounter&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&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;(&amp;lt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Valor: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&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;setCounter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;c&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="si"&gt;}&lt;/span&gt;
        &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'bg-[#ddd]'&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            Adicionar
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&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;Note que adicionamos um &lt;code&gt;'use client'&lt;/code&gt; pois por &lt;strong&gt;padrão todos os componentes dentro da pasta App no Next.js são Server Components&lt;/strong&gt;, então para criar um Client Component temos que adicionar esse 'use client' para declarar isso. &lt;br&gt;
Agora atualizando o nosso &lt;code&gt;Container.tsx&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Counter&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Counter&lt;/span&gt;&lt;span class="dl"&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="nx"&gt;idContainer&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="nl"&gt;idContainer&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kr"&gt;string&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;idContainer&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Aqui temos um parágrafo simples&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;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;No navegador temos:&lt;br&gt;
&lt;a href="https://media2.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%2Fd8mlkj1mu1u6m8nu6rts.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fd8mlkj1mu1u6m8nu6rts.png" alt="output do código" width="225" height="109"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ao clicar no botão, o valor da variável &lt;code&gt;counter&lt;/code&gt; muda e ao mudar seu valor, o conteúdo html muda também. Agora desative o javascript e recarregue a página, de primeira parece que não muda nada, mas ao clicar no botão o comportamento esperado que é a mudança do valor da variável e a renderização que atualiza o UI, não acontece, o que isso significa?&lt;br&gt;
Esse é um exemplo de SSG, que é o comportamento padrão do Next.JS para renderização no servidor, ele renderizou a página no momento do build, e quando atualizamos a página a requisição é feita ao server que já está guardando a página pronta e apenas à envia, como desativamos o javascript no navegador o processo de hydration não aconteceu portanto não temos interatividade. Existem várias formas de mudar esse comportamento para SSR ao invés de SSG no Nextjs mas esse não é o foco desse post.&lt;/p&gt;




&lt;p&gt;Então, na prática, qual a diferença entre um React Server Component e um React Client Component no Next.js e no React?&lt;br&gt;
O React é voltado para componentes que rodam no client, ou seja, ele transforma os React Elements em DOM por meio da renderização no navegador. Já o Next.js, nos permite que os componentes sejam executados tanto no cliente quanto no servidor.&lt;/p&gt;

&lt;p&gt;Componentes do client, que são aqueles marcados como "client" em um app Next.js são renderizados duas vezes: primeiro no servidor (para gerar HTML inicial) e depois no cliente, onde ocorre a hidratação.&lt;br&gt;
Enquanto os React Server Components (RSCs) são executados exclusivamente no servidor e enviados ao cliente como HTML ou como payload serializado. Eles não têm interatividade direta nem acesso a APIs do navegador (como useState, useEffect), e por isso não passam por hidratação.&lt;/p&gt;

&lt;p&gt;--&lt;br&gt;
Espero que esse conteúdo tenha ajudado a esclarecer as principais diferenças entre essas siglas tão comuns no universo do React e do Next.js. Se você curtiu, compartilhe com quem também está nessa jornada de aprendizado. Até a próxima! 🚀&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>react</category>
      <category>ssr</category>
      <category>csr</category>
    </item>
  </channel>
</rss>
