<?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: Cristian Magalhães</title>
    <description>The latest articles on DEV Community by Cristian Magalhães (@cristuker).</description>
    <link>https://dev.to/cristuker</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%2F216224%2F6ab0c57b-ddb0-4ea1-991d-860ca0bdaf45.png</url>
      <title>DEV Community: Cristian Magalhães</title>
      <link>https://dev.to/cristuker</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cristuker"/>
    <language>en</language>
    <item>
      <title>O que é CQRS?</title>
      <dc:creator>Cristian Magalhães</dc:creator>
      <pubDate>Wed, 11 Jun 2025 17:48:51 +0000</pubDate>
      <link>https://dev.to/cristuker/o-que-e-cqrs-19jd</link>
      <guid>https://dev.to/cristuker/o-que-e-cqrs-19jd</guid>
      <description>&lt;p&gt;Eae gente bonita, beleza? Durante meus estudos sobre EDA (Event Driven Architecture) ou Arquitetura orientada a eventos eu esbarrei com a sigla CQRS, que a gente acaba vendo com uma certa frequência em posts pela internet, então resolvi trazer um post dedicado a ela.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que é
&lt;/h3&gt;

&lt;p&gt;A sigla CQRS significa &lt;strong&gt;C&lt;/strong&gt;ommand &lt;strong&gt;Q&lt;/strong&gt;uery &lt;strong&gt;R&lt;/strong&gt;esponsibility &lt;strong&gt;S&lt;/strong&gt;egregation, que traduzindo para o português seria separação de responsabilidade de comando e consulta. De forma bem simples, o CQRS propõe separar as operações feitas pelo software entre comandos e consultas.&lt;/p&gt;

&lt;p&gt;Vamos às definições, no contexto do CQRS um comando é toda operação que muda o estado, ou seja, update, delete, insert, qualquer comando de escrita. Enquanto uma consulta o nome diz por si só, é apenas uma consulta nos dados.&lt;/p&gt;

&lt;h3&gt;
  
  
  Para que serve
&lt;/h3&gt;

&lt;p&gt;De forma simples e direta você vai usar o CQRS para segregar comandos e consultas buscando desempenho, pois é comum aliado ao CQRS que você também tenha um banco apenas para consulta e um banco apenas para alterações ou comandos no caso. Porém, não significa que ao usar CQRS você deve trabalhar com dois bancos de dados dessa forma.&lt;/p&gt;

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

&lt;p&gt;Esse texto ficou muito mais curto do que gostaria, porém, a explicação do que é CQRS é bem mais simples do que eu imaginava. Muito do conteúdo que achei usava CQRS e mais alguma coisa para explicar o mesmo, o que acabava atrapalhando um pouco, a meu ver. Então gostaria de deixar esse texto direto e compacto, espero que tenha te ajudado!&lt;/p&gt;

&lt;h3&gt;
  
  
  Fontes
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=cw0oVKCK4iU" rel="noopener noreferrer"&gt;CQRS em 10 minutos // Dicionário do Programador&lt;br&gt;
&lt;/a&gt;&lt;br&gt;
&lt;a href="https://fullcycle.com.br/o-que-e-cqrs-e-quando-utilizar/" rel="noopener noreferrer"&gt;O que é CQRS e quando utilizar?&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Se chegou até aqui, me segue la nas &lt;a href="https://cristiansilva.dev/" rel="noopener noreferrer"&gt;redes vizinhas&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/uWlpPGquhGZNFzY90z/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/uWlpPGquhGZNFzY90z/giphy.gif" alt="thank you dog" width="478" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>webdev</category>
      <category>architecture</category>
      <category>programming</category>
    </item>
    <item>
      <title>Desvendando SQL: Procedures</title>
      <dc:creator>Cristian Magalhães</dc:creator>
      <pubDate>Thu, 20 Mar 2025 11:08:39 +0000</pubDate>
      <link>https://dev.to/cristuker/desvendando-sql-procedures-1nbl</link>
      <guid>https://dev.to/cristuker/desvendando-sql-procedures-1nbl</guid>
      <description>&lt;p&gt;Eae gente bonita, tudo bem com vocês? Continuando nossa série de publicações, hoje nós vamos falar sobre procedures!&lt;/p&gt;

&lt;h3&gt;
  
  
  O que é?
&lt;/h3&gt;

&lt;p&gt;Procedures ou store procedures, é um conjunto de comandos tal qual funções que são armazenados e executados quando necessários, recebendo parâmetros ou não. É comum ser utilizada muitas vezes para reduzir o tráfego na rede, melhorar o desempenho de um banco de dados, criar tarefas agendadas, diminuir riscos, criar rotinas de processamento, etc.&lt;/p&gt;

&lt;p&gt;As procedures são consideradas seguras por muitos porque com o seu uso nenhuma aplicação tem necessidade de ter acesso direto as tabelas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Procedure vs Function
&lt;/h3&gt;

&lt;p&gt;Bom, se você me acompanha, deve ter lido ou visto que postei um artigo falando sobre como usar &lt;strong&gt;function&lt;/strong&gt; no SQL, então para que você não saia daqui com mais dúvidas, vou explicar um pouco da diferença entre os dois.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Característica&lt;/th&gt;
&lt;th&gt;Procedure&lt;/th&gt;
&lt;th&gt;Function&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Retorna valor?&lt;/td&gt;
&lt;td&gt;Opcional (pode retornar conjunto de resultados)&lt;/td&gt;
&lt;td&gt;Sim (obrigatório)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modifica dados?&lt;/td&gt;
&lt;td&gt;Sim (pode executar &lt;code&gt;INSERT&lt;/code&gt;, &lt;code&gt;UPDATE&lt;/code&gt;, &lt;code&gt;DELETE&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Não (apenas leitura)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pode ser chamada em &lt;code&gt;SELECT&lt;/code&gt;?&lt;/td&gt;
&lt;td&gt;Não&lt;/td&gt;
&lt;td&gt;Sim&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Uso principal&lt;/td&gt;
&lt;td&gt;Executar processos complexos&lt;/td&gt;
&lt;td&gt;Retornar um cálculo ou transformação&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Como usar?
&lt;/h3&gt;

&lt;p&gt;Agora vamos botar a mão na massa! Aqui vou deixar o &lt;a href="https://gist.github.com/Cristuker/9e27da6b2c2b24dfcde405bbf9dd4b9d" rel="noopener noreferrer"&gt;link&lt;/a&gt; para que você possa criar o mesmo banco de dados que o meu.&lt;/p&gt;

&lt;p&gt;Vamos a um exemplo bem simples, vamos criar uma procedure que altera o status de todas as tarefas para &lt;em&gt;pending&lt;/em&gt;. Porém, o status antigo será passado por parâmetro.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;create&lt;/span&gt; &lt;span class="k"&gt;or&lt;/span&gt; &lt;span class="k"&gt;replace&lt;/span&gt; &lt;span class="k"&gt;procedure&lt;/span&gt; &lt;span class="n"&gt;updateStatusToPending&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;oldStatus&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;language&lt;/span&gt; &lt;span class="n"&gt;plpgsql&lt;/span&gt;
&lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="err"&gt;$$&lt;/span&gt;
&lt;span class="k"&gt;declare&lt;/span&gt;
    &lt;span class="c1"&gt;-- Declaração de variaveis&lt;/span&gt;
&lt;span class="k"&gt;begin&lt;/span&gt;
    &lt;span class="k"&gt;update&lt;/span&gt; &lt;span class="n"&gt;todos&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'pending'&lt;/span&gt; &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;oldStatus&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="err"&gt;$$&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Feito isso, agora nós temos uma procedure que altera todos os status para pending.&lt;/p&gt;

&lt;p&gt;Diferente da &lt;strong&gt;function&lt;/strong&gt; que usamos o &lt;strong&gt;select&lt;/strong&gt; para chamar, aqui nós vamos usar a palavra-chave &lt;strong&gt;call&lt;/strong&gt; como no exemplo abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;call&lt;/span&gt; &lt;span class="n"&gt;updateStatusToPending&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'completed'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após rodarmos esse script e consultar o banco, veremos que não existe mais nenhum todo com status &lt;em&gt;completed&lt;/em&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;É importante pontuar que na sintaxe da procedure existe um local correto para a declaração de variáveis, as mesmas não podem ser criadas em qualquer momento no script.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Vamos finalizar excluindo a procedure do nosso banco com o comando abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;drop&lt;/span&gt; &lt;span class="k"&gt;procedure&lt;/span&gt; &lt;span class="n"&gt;updateStatusToPending&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui finalizo esse breve texto sobre procedure, fique a vontade para mandar dúvidas e sugestões nos comentários.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fontes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.devmedia.com.br/introducao-aos-stored-procedures-no-sql-server/7904" rel="noopener noreferrer"&gt;Introdução aos Stored Procedures no SQL Server&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Se chegou até aqui, me segue la nas &lt;a href="https://cristiansilva.dev/" rel="noopener noreferrer"&gt;redes vizinhas&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/uWlpPGquhGZNFzY90z/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/uWlpPGquhGZNFzY90z/giphy.gif" alt="thank you dog" width="478" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>sql</category>
      <category>programming</category>
      <category>database</category>
    </item>
    <item>
      <title>Desvendando SQL: Views</title>
      <dc:creator>Cristian Magalhães</dc:creator>
      <pubDate>Tue, 18 Mar 2025 11:54:23 +0000</pubDate>
      <link>https://dev.to/cristuker/desvendando-sql-views-4f34</link>
      <guid>https://dev.to/cristuker/desvendando-sql-views-4f34</guid>
      <description>&lt;p&gt;Eae gente bonita, tudo bem com vocês? Seguindo a revisão de SQL, dessa vez vamos falar sobre Views, então pega um cafezinho e &lt;em&gt;vamobora&lt;/em&gt;!&lt;/p&gt;

&lt;h3&gt;
  
  
  O que é?
&lt;/h3&gt;

&lt;p&gt;Podemos chamar uma view de “tabela virtual”, por ser criada com base em uma query definida no momento da sua criação e toda vez que a view é consultada a query é rodada novamente trazendo o resultado da query definida na sua criação.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como usar
&lt;/h3&gt;

&lt;p&gt;Antes de começar vou deixar o aqui o &lt;a href="https://gist.github.com/Cristuker/9e27da6b2c2b24dfcde405bbf9dd4b9d" rel="noopener noreferrer"&gt;link&lt;/a&gt; com os scripts para a criação do banco e também o seu diagrama abaixo:&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%2Fn1w5uaehqh5uuktac6s3.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%2Fn1w5uaehqh5uuktac6s3.png" alt=" " width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos criar uma view para ver todas as tarefas pendentes, para isso vamos usar o SQL abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;REPLACE&lt;/span&gt; &lt;span class="k"&gt;VIEW&lt;/span&gt; 
    &lt;span class="n"&gt;user_pending_tasks&lt;/span&gt; &lt;span class="c1"&gt;--nome da view&lt;/span&gt;
&lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="c1"&gt;-- após o as é inserido o SQL que irá alimentar essa view&lt;/span&gt;
    &lt;span class="k"&gt;SELECT&lt;/span&gt; 
        &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="nv"&gt;"todo id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; 
    &lt;span class="k"&gt;FROM&lt;/span&gt; 
        &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt; 
        &lt;span class="k"&gt;INNER&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;todos&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; 
    &lt;span class="k"&gt;WHERE&lt;/span&gt; 
        &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'pending'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após rodarmos esse script a view será que criada no nosso banco de dados e se consultarmos também o nosso diagrama poderemos ve-lá também.&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%2Fhb89wil6y82qe6rstlna.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%2Fhb89wil6y82qe6rstlna.png" alt=" " width="478" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com a nossa view criada vamos executar da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT * FROM user_pending_tasks;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Então teremos o seguinte resultado: &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%2F51ab422pi9gsm186b0j3.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%2F51ab422pi9gsm186b0j3.png" alt=" " width="800" height="308"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Caso algum &lt;em&gt;todo&lt;/em&gt; seja atualizado para &lt;em&gt;completed&lt;/em&gt; ou qualquer outro status diferente de &lt;em&gt;pending&lt;/em&gt; ao rodar a view novamente, o resultado mostrado será alterado.&lt;/p&gt;

&lt;p&gt;Você também pode atualizar e até mesmo excluir uma view usando o comando DROP VIEW e ALTER VIEW.&lt;/p&gt;

&lt;p&gt;Espero ter ajudado a entender o conceito das views e também ter dado uma base para saber quais caminhos percorrer agora e quando usa-lá. &lt;/p&gt;




&lt;p&gt;Se chegou até aqui, me segue la nas &lt;a href="https://cristiansilva.dev/" rel="noopener noreferrer"&gt;redes vizinhas&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/uWlpPGquhGZNFzY90z/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/uWlpPGquhGZNFzY90z/giphy.gif" alt="thank you dog" width="478" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>webdev</category>
      <category>programming</category>
      <category>sql</category>
    </item>
    <item>
      <title>Desvendando SQL: Functions</title>
      <dc:creator>Cristian Magalhães</dc:creator>
      <pubDate>Wed, 12 Mar 2025 16:51:05 +0000</pubDate>
      <link>https://dev.to/cristuker/desvendando-sql-functions-26c3</link>
      <guid>https://dev.to/cristuker/desvendando-sql-functions-26c3</guid>
      <description>&lt;p&gt;Eae gente bonita, tudo bem com vocês? Continuando os posts sobre SQL hoje venho trazer para vocês o que é uma Function e como usa-lá.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que é
&lt;/h3&gt;

&lt;p&gt;Como o próprio nome diz uma &lt;strong&gt;Function&lt;/strong&gt; é uma função em SQL que podemos declarar e rodar quando quiser, como, por exemplo, em uma &lt;a href="https://dev.to/cristuker/desvendando-sql-trigger-f32"&gt;trigger&lt;/a&gt;. Nesse caso as funções do SQL diferem somente a sintaxe das funções de uma linguagem de programação comum.&lt;/p&gt;

&lt;p&gt;Assim como nas linguagens de programação que usamos no dia a dia, o SQL também tem algumas funções pré-definidas como funções de string, data e coisas do tipo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como usar
&lt;/h3&gt;

&lt;p&gt;Vamos aprofundar um pouco mais e usar um exemplo bem simples.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;FUNCTION&lt;/span&gt; &lt;span class="n"&gt;somar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;integer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;integer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;RETURNS&lt;/span&gt; &lt;span class="nb"&gt;integer&lt;/span&gt;
&lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="s1"&gt;'select $1 + $2;'&lt;/span&gt;
&lt;span class="k"&gt;LANGUAGE&lt;/span&gt; &lt;span class="k"&gt;SQL&lt;/span&gt;
&lt;span class="k"&gt;RETURNS&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;INPUT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui podemos ver como funciona a sintaxe de uma função SQL, a sua declaração começa com &lt;code&gt;CREATE FUNCTION&lt;/code&gt; ou &lt;code&gt;CREATE OR REPLACE FUNCTION&lt;/code&gt; caso você queira substituir uma função já existente no seu banco de dados. Em seguida vem o nome da função e os tipos dos parâmetros passados e também a sua quantidade. É importante observar também que o tipo de retorno é definido logo no início da declaração e esse pode um banco, ou mesmo fazer referência ao tipo de uma coluna em uma tabela.&lt;br&gt;
As funções são definidas dentro do &lt;strong&gt;AS&lt;/strong&gt; e os seus parâmetros são usados o número da posição, que foram declarados &lt;code&gt;$1&lt;/code&gt;. Como no exemplo estou usando o PostgreSQL é necessário também informar a linguagem.&lt;/p&gt;
&lt;h3&gt;
  
  
  Exemplos
&lt;/h3&gt;

&lt;p&gt;Vamos criar uma função simples. No caso abaixo irei criar uma função que lista todos as tarefas de um usuário.&lt;/p&gt;

&lt;p&gt;Link com o script para criar o banco de dados &lt;a href="https://gist.github.com/Cristuker/9e27da6b2c2b24dfcde405bbf9dd4b9d" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;REPLACE&lt;/span&gt; &lt;span class="k"&gt;FUNCTION&lt;/span&gt; &lt;span class="n"&gt;getAllTodos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;userId&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;RETURNS&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nv"&gt;"title"&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="nv"&gt;"description"&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="nv"&gt;"status"&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="err"&gt;$$&lt;/span&gt;
    &lt;span class="k"&gt;BEGIN&lt;/span&gt;
        &lt;span class="k"&gt;RETURN&lt;/span&gt; &lt;span class="n"&gt;QUERY&lt;/span&gt; &lt;span class="k"&gt;SELECT&lt;/span&gt;
            &lt;span class="nv"&gt;"t"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nv"&gt;"t"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nv"&gt;"t"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;"status"&lt;/span&gt;
        &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;todos&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;
        &lt;span class="k"&gt;inner&lt;/span&gt; &lt;span class="k"&gt;join&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;
        &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt;$$&lt;/span&gt; &lt;span class="k"&gt;LANGUAGE&lt;/span&gt; &lt;span class="n"&gt;plpgsql&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após rodar esse script a função será criada no nosso banco, caso queira apagar e recriar basta rodar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;DROP&lt;/span&gt; &lt;span class="k"&gt;FUNCTION&lt;/span&gt; &lt;span class="n"&gt;getAllTodos&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora vamos rodar a function, para rodar fazemos da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;getAllTodos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E então teremos o seguinte resultado:&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%2F4gyup27hcet9tetbmmuh.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%2F4gyup27hcet9tetbmmuh.png" alt=" " width="516" height="272"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bem simples não é mesmo? Claro que a abordagem desse texto é te dar uma base e ajudar a entender o que é cada coisa para que no futuro você tenha uma base melhor para fazer pesquisas e saber o que e quando deve usar algo. No final do texto vou deixar alguns links com mais detalhes.&lt;/p&gt;

&lt;p&gt;Espero ter ajudado, caso tenha alguma dúvida fique a vontade para comentar!&lt;/p&gt;




&lt;p&gt;Se chegou até aqui, me segue la nas &lt;a href="https://cristiansilva.dev/" rel="noopener noreferrer"&gt;redes vizinhas&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/xULW8v7LtZrgcaGvC0/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/xULW8v7LtZrgcaGvC0/giphy.gif" alt="thank you dog" width="375" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Fontes:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.devmedia.com.br/utilizacao-de-functions-no-postgresql/33188" rel="noopener noreferrer"&gt;Utilização de Functions no PostgreSQL&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://medium.com/@rayato159/how-to-write-and-use-a-function-on-postgresql-database-cc0ce2bf04c9" rel="noopener noreferrer"&gt;How to write and use a function on PostgreSQL Database&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>braziliandevs</category>
      <category>sql</category>
      <category>database</category>
      <category>programming</category>
    </item>
    <item>
      <title>Desvendando SQL: Trigger</title>
      <dc:creator>Cristian Magalhães</dc:creator>
      <pubDate>Thu, 27 Feb 2025 16:42:04 +0000</pubDate>
      <link>https://dev.to/cristuker/desvendando-sql-trigger-f32</link>
      <guid>https://dev.to/cristuker/desvendando-sql-trigger-f32</guid>
      <description>&lt;p&gt;Eae gente bonita, tudo bem com vocês? Depois de um bom tempo sem escrever aqui resolvi voltar e trazer um pouco mais da minha trilha de estudos para vocês e a bola da vez é o SQL. Existem alguns termos e siglas que nós vemos com frequência, até mesmo usamos e muitas vezes não sabemos exatamente o que é, então separei alguns e vou trazer aqui para vocês nas próximas semanas. Sugestões de temas são sempre bem-vindas!&lt;/p&gt;

&lt;p&gt;Bom como é de costume gosto sempre de passar pelo que é, para que serve e como esse é o meu primeiro post sobre SQL, eu vou dar uma breve introdução a sigla e depois trago um post mais detalhado sobre o assunto.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é SQL?
&lt;/h2&gt;

&lt;p&gt;SQL = Structured Query Language é uma linguagem usada pelos bancos de dados para criação, modelagem e estruturação de banco de dados e também para manipulação dos dados dentro do banco. Sempre que ler ou ouvir o termo "banco sql" se refere a um banco que usa essa linguagem como padrão, apesar de em alguns casos os bancos terem algumas especifidades. Quando ler sobre bancos NoSQL, são bancos que &lt;strong&gt;NÃO&lt;/strong&gt; usam a linguagem SQL por padrão como um MongoDB por exemplo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trigger
&lt;/h2&gt;




&lt;h3&gt;
  
  
  O que é
&lt;/h3&gt;

&lt;p&gt;Trigger ou com uma tradução livre e direta "gatilho", são funções SQL que são pré programadas e executadas de acordo com uma alteração no banco de dados seja uma alteração de DML (Data Manipulation Language) ou DDL (Data Definition Language), sendo mais direto, você pode criar uma trigger que será executada antes ou depois de um &lt;strong&gt;INSERT&lt;/strong&gt;, &lt;strong&gt;DELETE&lt;/strong&gt;, &lt;strong&gt;TRUNCATE&lt;/strong&gt;  e &lt;strong&gt;UPDATE&lt;/strong&gt; que são alterações nos dados do banco, como também pode fazer o mesmo para alterações na estrutura do banco de dados como em &lt;strong&gt;CREATE&lt;/strong&gt;, &lt;strong&gt;ALTER&lt;/strong&gt; e &lt;strong&gt;DROP&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Na prática
&lt;/h3&gt;

&lt;p&gt;Bom antes de mostrar o exemplo primeiro é importante deixar claro algumas coisas, o banco que usarei aqui será o PostgreSQL, ele cria a suas triggers de uma forma um pouco diferente dos demais bancos mas nada para se preocupar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gist.github.com/Cristuker/9e27da6b2c2b24dfcde405bbf9dd4b9d" rel="noopener noreferrer"&gt;Script para criar o banco&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O nosso banco:&lt;/strong&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%2Fn6y7vyr132pobuedsifi.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%2Fn6y7vyr132pobuedsifi.png" alt=" " width="417" height="261"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Mãos a obra!
&lt;/h2&gt;

&lt;p&gt;Primeiros nós vamos criar a função que será executada na trigger. Essa função é bem simples era irá adicionar a data de criação na coluna createdAt para cada usuário que for inserido na tabela.&lt;br&gt;
É importante deixar claro que para esse tipo de caso existem formas MUITO mais simples e melhores de se fazer esse tipo de operação, mas para caso de estudo vamos seguir dessa forma.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;REPLACE&lt;/span&gt; &lt;span class="k"&gt;FUNCTION&lt;/span&gt; &lt;span class="n"&gt;setData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;RETURNS&lt;/span&gt; &lt;span class="k"&gt;TRIGGER&lt;/span&gt;
    &lt;span class="k"&gt;LANGUAGE&lt;/span&gt; &lt;span class="n"&gt;PLPGSQL&lt;/span&gt;
    &lt;span class="k"&gt;AS&lt;/span&gt; 
    &lt;span class="err"&gt;$$&lt;/span&gt;
&lt;span class="k"&gt;BEGIN&lt;/span&gt;
    &lt;span class="k"&gt;update&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;RETURN&lt;/span&gt; &lt;span class="k"&gt;NEW&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt;$$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;O que essa função faz? Bom basicamente ela atualiza a coluna created_at com a data do momento que está sendo executada.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Agora com a nossa função criada nós vamos associa-la a um trigger&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;create&lt;/span&gt; &lt;span class="k"&gt;trigger&lt;/span&gt; &lt;span class="n"&gt;setDataOnInsert&lt;/span&gt;
  &lt;span class="k"&gt;after&lt;/span&gt;
&lt;span class="k"&gt;insert&lt;/span&gt;
    &lt;span class="k"&gt;on&lt;/span&gt;
    &lt;span class="n"&gt;users&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;each&lt;/span&gt; &lt;span class="k"&gt;row&lt;/span&gt;
 &lt;span class="k"&gt;execute&lt;/span&gt; &lt;span class="k"&gt;procedure&lt;/span&gt; &lt;span class="n"&gt;setData&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O que esse codigo faz? Basicamente aqui nós estamos criando o trigger, ele será executa &lt;strong&gt;APÓS - AFTER&lt;/strong&gt; um &lt;strong&gt;INSERT&lt;/strong&gt; na tabela &lt;strong&gt;USERS (ON USERS)&lt;/strong&gt; para cada linha inserida.&lt;/p&gt;

&lt;p&gt;Agora vamos testar, basta rodar um insert, que a trigger será ativada&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;insert&lt;/span&gt; &lt;span class="k"&gt;into&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;values&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Cristian'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'cristian123122@email.com'&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 consultar e verificar se deu tudo certo.&lt;/p&gt;

&lt;p&gt;Agora podemos filtrar ou apenas dar um select em todos os dados da base e veremos que o último registro inserido está com a coluna create_at preenchida&lt;/p&gt;

&lt;p&gt;Espero ter ajudado, caso tenha alguma duvida fique a vontade para comentar!&lt;/p&gt;




&lt;p&gt;Se chegou até aqui, me segue la nas &lt;a href="https://cristiansilva.dev/" rel="noopener noreferrer"&gt;redes vizinhas&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/xULW8v7LtZrgcaGvC0/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/xULW8v7LtZrgcaGvC0/giphy.gif" alt="thank you dog" width="375" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>sql</category>
      <category>braziliandevs</category>
      <category>webdev</category>
      <category>backend</category>
    </item>
    <item>
      <title>[Design Patterns] Trabalhando com Factories</title>
      <dc:creator>Cristian Magalhães</dc:creator>
      <pubDate>Wed, 14 Aug 2024 14:50:15 +0000</pubDate>
      <link>https://dev.to/cristuker/design-patterns-trabalhando-com-factories-51hi</link>
      <guid>https://dev.to/cristuker/design-patterns-trabalhando-com-factories-51hi</guid>
      <description>&lt;p&gt;Eae gente bonita, beleza?&lt;/p&gt;

&lt;p&gt;Continuando nossos estudos e abrindo mais uma série de conteúdo por aqui, hoje irei falar sobre o design pattern Factory.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é um design pattern?
&lt;/h2&gt;

&lt;p&gt;Começando do começo, um design pattern ou padrão de projeto é uma solução conhecida para um problema conhecido. Existem vários tipos de design patterns para se aprender e conhecer. Você não precisa saber todos de cabeça e cada detalhe de implementação, porém é importante que você conheça a existência e o problema que ele soluciona para saber o que e onde procurar. O site &lt;a href="https://refactoring.guru/pt-br/design-patterns" rel="noopener noreferrer"&gt;Refactoring Guru&lt;/a&gt; contém uma lista de padrões de projetos e suas explicações em português, recomendo muito que tenha ele salvo nos seus favoritos.&lt;/p&gt;

&lt;p&gt;É muito importante saber trabalhar e conhecer padrões de projetos, pois assim nós usamos formas conhecidas de se trabalhar e deixamos de reinventar a roda, além de mantermos uma codebase mais organizada e fácil de se dar manutenção no futuro.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tipos de padrões?
&lt;/h2&gt;

&lt;p&gt;Existem tipos de padrões? Sério? Sim!! Como dito anteriormente, um padrão de projeto é uma solução conhecida para um problema conhecido e bom, existem vários tipos de problemas na área de T.I., na verdade, não falta problema. Então vou te apresentar os tipos de padrões de projetos.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Criacionais:&lt;/strong&gt; Os padrões criacionais fornecem mecanismos de criação de objetos que aumentam a flexibilidade e a reutilização de código.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Estruturais:&lt;/strong&gt; Os padrões estruturais explicam como montar objetos e classes em estruturas maiores, enquanto ainda mantém as estruturas flexíveis e eficientes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Comportamentais:&lt;/strong&gt; Os padrões comportamentais cuidam da comunicação eficiente e da atribuição de responsabilidades entre objetos.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  O Padrão Factory
&lt;/h2&gt;

&lt;p&gt;Bom agora que você já sabe o que é um padrão de projeto ou design pattern, vamos falar um pouco sobre o padrão em questão, o padrão &lt;strong&gt;Factory.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O padrão Factoryé um padrão &lt;em&gt;criacional&lt;/em&gt;, ou seja, é uma forma de criar objetos. A tradução de Factory é fábrica, então não tem como ser mais claro que isso, um padrão usado para criar coisas.&lt;/p&gt;

&lt;p&gt;A ideia do padrão Factoryé centralizar as dependências em um só lugar e expor apenas o que precisa ser realmente usado. Vamos a um exemplo. Eu crio um Factory para criar um UserService. Bom o que o userService precisa? De um repository para se comunicar com o banco de dados e das informações do banco para o repository se conectar e fazer as operações necessárias. Para fazer isso nós criamos uma Factory que busca e centraliza todas essas dependências e expõe o userService prontinho para usarmos como no exemplo abaixo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserFactory&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;createInstance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;db&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;Database&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;connectionString&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mongodb://localhost:27017/test&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt; &lt;span class="c1"&gt;// Criando conexão com o banco&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dbConnection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Conectando ao banco&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userRepository&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;UserRepository&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;dbConnection&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt; &lt;span class="c1"&gt;// Passando conexão do banco para o repository, pois o mesmo depende da conexão&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userService&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;UserService&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;userRepository&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt; &lt;span class="c1"&gt;// Passando o repository para o service, pois o mesmo depende do repository&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;userService&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Retornar o service pronto para uso!&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;Espero que tenha ficado claro o que é uma Factory para você! Se tiver alguma dúvida e sugestão, fique a vontade para comentar. Em breve trarei mais padrões de projetos para o blog. &lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://refactoring.guru/pt-br/design-patterns" rel="noopener noreferrer"&gt;Refactoring Guru&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Se chegou até aqui, me segue la nas &lt;a href="https://cristiansilva.dev/" rel="noopener noreferrer"&gt;redes vizinhas&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/xULW8v7LtZrgcaGvC0/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/xULW8v7LtZrgcaGvC0/giphy.gif" alt="thank you dog" width="375" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>braziliandevs</category>
      <category>programming</category>
    </item>
    <item>
      <title>Uma breve introdução a microsserviços</title>
      <dc:creator>Cristian Magalhães</dc:creator>
      <pubDate>Mon, 05 Aug 2024 14:31:43 +0000</pubDate>
      <link>https://dev.to/cristuker/arquitetura-uma-breve-introducao-a-microsservicos-4alj</link>
      <guid>https://dev.to/cristuker/arquitetura-uma-breve-introducao-a-microsservicos-4alj</guid>
      <description>&lt;p&gt;Eae gente bonita, beleza?&lt;/p&gt;

&lt;p&gt;Estou me aprofundando mais em arquitetura e gostaria de começar falando sobre microsserviços. Vejo que é uma das arquiteturas mais usadas e requisitadas nas vagas hoje em dia. Então bora pegar um café e aproveitar a leitura!&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%2Fbkvbq4icmd3tq3zbdhkh.gif" 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%2Fbkvbq4icmd3tq3zbdhkh.gif" alt="Coffee gif" width="350" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O que são microsserviços
&lt;/h2&gt;

&lt;p&gt;Quando comecei na área de desenvolvimento eu achava que um microsserviço era algo super complexo feito pelos deuses da programação, porém vamos começar desmistificando isso. Um microsserviço é apenas uma aplicação comum, como a API que você desenvolveu no seu curso de backend.&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%2Fye2q0287gz5nlds3zfe5.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%2Fye2q0287gz5nlds3zfe5.png" alt=" " width="491" height="301"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Acima eu peguei um exemplo da AWS, fazendo uma comparação entre a arquitetura de microsserviços e monólito. Aqui podemos perceber claramente como funciona um projeto que usa arquitetura de microsserviços, nele são criados vários projetos(API) onde cada API tem apenas uma responsabilidade, assim tornando ela &lt;strong&gt;micro&lt;/strong&gt; então a ideia básica de se trabalhar com microsserviços é separar responsabilidades em projetos separados.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que eles fazem
&lt;/h2&gt;

&lt;p&gt;Bom existem alguns critérios para dizer se o projeto é ou não um microsserviços e iremos passar pelos eles agora:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Objetivo claro:&lt;/strong&gt; Cada serviço tem que ter um objetivo claro, a aplicação não precisa ser necessariamente pequena. Porém, é importante que tem um objetivo claro para sua existência e sua responsabilidade no contexto que está inserida.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Forma um ecossistema:&lt;/strong&gt; Todos os serviços juntos devem criar um ecossistema ou contexto como no exemplo acima. Cada serviço se complementa de forma indireta, o que resulta em uma aplicação completa. Um microsserviço jamais seria uma aplicação completa.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Autônomos:&lt;/strong&gt; Eles são autônomos, ou seja, um serviço consegue fazer o seu trabalho mesmo que outro serviço caia. Caso o serviço de usuários caia, o de threads e posts irão continuar funcionando e fazendo o seu trabalho normalmente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Comunicação:&lt;/strong&gt; Se comunicam o tempo todo. Não é necessário ser de forma direta usando REST ou gRPC, por exemplo. Porém, é importante que eles se comuniquem e que um componha o outro. Vamos a um exemplo, o serviço de Posts precisa saber quem foi o usuário que enviou o post correto? Para isso eles se comunicam, por exemplo, para pegar informações complementares do usuário em questão que está enviando o post.&lt;/p&gt;

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

&lt;p&gt;Esse é apenas um post de introdução sobre microsserviços, irei continuar me aprofundando mais no assunto e trazer aqui para vocês.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/pt/microservices/" rel="noopener noreferrer"&gt;O que são microsserviços? by AWS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se chegou até aqui, me segue la nas &lt;a href="https://cristiansilva.dev/" rel="noopener noreferrer"&gt;redes vizinhas&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/xULW8v7LtZrgcaGvC0/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/xULW8v7LtZrgcaGvC0/giphy.gif" alt="thank you dog" width="375" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>architecture</category>
      <category>beginners</category>
      <category>node</category>
    </item>
    <item>
      <title>JavaScript: Alterando a prioridade de execução</title>
      <dc:creator>Cristian Magalhães</dc:creator>
      <pubDate>Wed, 03 Jul 2024 12:13:45 +0000</pubDate>
      <link>https://dev.to/cristuker/javascript-alterando-a-prioridade-de-execucao-472p</link>
      <guid>https://dev.to/cristuker/javascript-alterando-a-prioridade-de-execucao-472p</guid>
      <description>&lt;p&gt;Eae gente bonita, beleza? Continuando nossos estudos em JavaScript, dessa vez eu irei falar algo muito interessante que é "e se nós pudessemos colocar coisas na frente da nossa pilha de execução" ou de uma forma mais simples, alterar a ordem de execução das funções do JavaScript, maneiro né? Então hoje vou te passar algumas formas de fazer isso. Recomendo também que leia o post sobre &lt;a href="https://dev.to/cristuker/javascript-o-que-e-callstack-3358"&gt;callstack&lt;/a&gt; e também sobre &lt;a href="https://dev.to/cristuker/estrutura-de-dados-o-que-e-uma-pilha-296p"&gt;pilha&lt;/a&gt;.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;A Callstack&lt;/li&gt;
&lt;li&gt;Como alterar a ordem&lt;/li&gt;
&lt;li&gt;Ordem de prioridade das funções&lt;/li&gt;
&lt;li&gt;Referências&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A Callstack
&lt;/h2&gt;

&lt;p&gt;Antes de começarmos a alterar e colocar coisas como prioridade é importante entendermos o que é a callstack e para isso precisamos entender também o que é uma pilha. Tenho artigo explicando os dois eles vão estar no começo e no fim do post. Vamos dar uma passada bem rápida antes de começarmos: bom uma pilha é a exatamente como uma pilha de moedas ou roupas, o primeiro item a entrar é o último a sair e o ultimo a entrar é o primeiro a sair, da mesma forma como empilhamos moedas uma em cima da outra e depois tiramos a primeira de cima e assim por diante. A Callstack não é muito diferente disso porém ao invés de falarmos de moedas estamos falando de funções onde uma função vai chamando a outra.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como alterar a ordem
&lt;/h2&gt;

&lt;p&gt;Essa parte é de fato a mais simples. Para fazer isso nós temos as seguintes opções: process.nextTick, setImmediate, setTimeout e interval. E todas são executadas da mesma maneira, passando uma função de callback com as instruções que serão executadas.&lt;/p&gt;

&lt;p&gt;Abaixo um exemplo:&lt;br&gt;
&lt;/p&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;Event&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:events&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;event&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;Event&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;eventName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;counter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;eventName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&amp;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="s1"&gt;counter update&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;myCounter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;counter&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;proxy&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;Proxy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;myCounter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;set&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;propertyKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;newValue&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="s1"&gt;proxy&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;newValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;propertyKey&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;eventName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;newValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;propertyKey&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;propertyKey&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;newValue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;

    &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;object&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;prop&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// console.log('chamou', { object, prop });&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;object&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;prop&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="nf"&gt;setInterval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;clearInterval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;nextTick&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;proxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&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;Aqui nós temos um exemplo que usei também para aprender sobre o Proxy o tema do ultimo post, mas vai funciona bem. De forma simples esse exemplo conta de 0 a 10. Porém com a adição do &lt;code&gt;process.nextTick&lt;/code&gt; o contador irá iniciar em 2 e não em 0 pois foi alterada a prioridade de execução.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ordem de prioridade das funções
&lt;/h2&gt;

&lt;p&gt;Acima eu citei 4 funções que alteram a prioridade na pilha de execução. Porém se ultilizarmos todas juntas existe uma ordem entre elas que será seguida, que é a seguinte:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;process.nextTick&lt;/li&gt;
&lt;li&gt;setImmediate&lt;/li&gt;
&lt;li&gt;setTimeout&lt;/li&gt;
&lt;li&gt;setInterval&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;É importante dizer que apesar do process.nextTick parecer a melhor função a ser usada, o seu uso não é recomendado sendo uma má prática, pois ela da prioridade total na pilha de execução atrapalhando o ciclo de vida do node.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/cristuker/javascript-o-que-e-callstack-3358"&gt;Javascript: O que é Callstack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/cristuker/estrutura-de-dados-o-que-e-uma-pilha-296p"&gt;Estrutura de dados: Pilha&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Espero que tenha sido claro e tenha ajudado a entender um pouco mais sobre o assunto, fique a vontade para dúvidas e sugestões abaixo!&lt;/p&gt;

&lt;p&gt;Se chegou até aqui, me segue la nas &lt;a href="https://cristiansilva.dev/" rel="noopener noreferrer"&gt;redes vizinhas&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/xULW8v7LtZrgcaGvC0/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/xULW8v7LtZrgcaGvC0/giphy.gif" alt="thank you dog" width="375" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>braziliandevs</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>JavaScript: Interceptando objetos com Proxy</title>
      <dc:creator>Cristian Magalhães</dc:creator>
      <pubDate>Fri, 28 Jun 2024 11:58:31 +0000</pubDate>
      <link>https://dev.to/cristuker/javascript-interceptando-objetos-com-proxy-17bm</link>
      <guid>https://dev.to/cristuker/javascript-interceptando-objetos-com-proxy-17bm</guid>
      <description>&lt;p&gt;Eae gente bonita, beleza? Continuando a nossa série de posts descobrindo novas funções no JavaScript dessa vez irei falar sobre o Proxy e como usar suas funções mais básicas para poder interceptar ações em objetos.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Como assim interceptar?&lt;/li&gt;
&lt;li&gt;Na prática&lt;/li&gt;
&lt;li&gt;Conclusão&lt;/li&gt;
&lt;li&gt;Referências&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Como assim interceptar?
&lt;/h2&gt;

&lt;p&gt;Bom caso você não saiba exatamente do que estou falando nós vamos "participar" ou melhor dizendo executar uma função entre o momento que a ação de ler ou atribuir valores é feita até a sua conclusão e para isso iremos ultilizar o objeto &lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Proxy" rel="noopener noreferrer"&gt;Proxy&lt;/a&gt;. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;É importante dizer que não vou passar método a método do objeto. A ideia é conhecer ele e ir explorando conforme a necessidade.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Na prática
&lt;/h2&gt;

&lt;p&gt;Vamos ao que interessa, executar o código e ver na prática tudo funcionando, abaixo vou colocar um trecho de código com o proxy interceptando as ações dos objetos e algumas explicações&lt;br&gt;
&lt;/p&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;pessoa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Cristian&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;saldo&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="na"&gt;idade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;objetoComProxy&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;Proxy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pessoa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;set&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;propertyKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;newValue&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="s1"&gt;set&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;propertyKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;newValue&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;propertyKey&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;newValue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;object&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;prop&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="s1"&gt;get&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;object&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;prop&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;object&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;prop&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="nx"&gt;pessoa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;saldo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="c1"&gt;// nada acontece, nenhum log é mostrado&lt;/span&gt;

&lt;span class="c1"&gt;// primeiro o get será logado para buscar o valor da propriedade e em seguida o set&lt;/span&gt;
&lt;span class="c1"&gt;// pois estamos usando o objeto com proxy&lt;/span&gt;
&lt;span class="nx"&gt;objetoComProxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;saldo&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="cm"&gt;/**
 * LOG:
 * get { object: { nome: 'Cristian', saldo: 100, idade: 25 }, prop: 'saldo' }
    set {
    target: { nome: 'Cristian', saldo: 100, idade: 25 },
    propertyKey: 'saldo',
    newValue: 200
    }
 */&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;objetoComProxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// get { object: { nome: 'Cristian', saldo: 200, idade: 25 }, prop: 'nome' } e depois Cristian&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;É importante notar que apesar do objeto original ter sido alterado também as funções do Proxy não são executadas, apenas no objeto "proxyado".&lt;/p&gt;

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

&lt;p&gt;Apesar de um texto bem simples a ideia de hoje foi poder conhecer sobre o Proxy e também aumentar a nossa caixa de ferramentas do JavaScript. Fique a vontade para deixar dúvidas e sugestões.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Proxy" rel="noopener noreferrer"&gt;Proxy MDN&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Espero que tenha sido claro e tenha ajudado a entender um pouco mais sobre o assunto, fique a vontade para dúvidas e sugestões abaixo!&lt;/p&gt;

&lt;p&gt;Se chegou até aqui, me segue la nas &lt;a href="https://cristiansilva.dev/" rel="noopener noreferrer"&gt;redes vizinhas&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/xULW8v7LtZrgcaGvC0/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/xULW8v7LtZrgcaGvC0/giphy.gif" alt="thank you dog" width="375" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>javascript</category>
      <category>node</category>
      <category>beginners</category>
    </item>
    <item>
      <title>JavaScript: Trabalhando com Set</title>
      <dc:creator>Cristian Magalhães</dc:creator>
      <pubDate>Tue, 25 Jun 2024 11:36:00 +0000</pubDate>
      <link>https://dev.to/cristuker/javascript-trabalhando-com-set-1k9b</link>
      <guid>https://dev.to/cristuker/javascript-trabalhando-com-set-1k9b</guid>
      <description>&lt;p&gt;Eae gente bonita, beleza? Vamos continuar nos aprofundando nas estruturas do JavaScript e dessa vez vamos falar sobre o Set a estrutura de dado e não o número.&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%2F6j13kazut81kogcdgidx.gif" 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%2F6j13kazut81kogcdgidx.gif" alt="Gif risada" width="245" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;O que é o Set?&lt;/li&gt;
&lt;li&gt;Métodos&lt;/li&gt;
&lt;li&gt;Exemplos&lt;/li&gt;
&lt;li&gt;Conclusão&lt;/li&gt;
&lt;li&gt;Referências&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  O que é o Set?
&lt;/h2&gt;

&lt;p&gt;De forma simples e objetiva, o Set é um objeto que armazena valores de tipo primitivos até referência a objetos. Porém, o seu grande diferencial e trunfo é pelo fato de não armazenar items repetidos, assim, o Set se torna uma ótima opção para filtrar itens repetidos de uma lista.&lt;/p&gt;

&lt;h2&gt;
  
  
  Métodos
&lt;/h2&gt;

&lt;p&gt;O Set é bem parecido com objeto &lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Map" rel="noopener noreferrer"&gt;Map&lt;/a&gt;, porém com uma diferença que muda muito a sua utilização a ausência do método &lt;code&gt;get&lt;/code&gt; e isso se deve ao fato do objeto &lt;code&gt;Map&lt;/code&gt; ser uma estrutura de chave-valor e o Set não. Logo, toda vez que você precisar encontrar um item dentro de um Set você precisará percorrer a lista toda.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exemplos
&lt;/h2&gt;

&lt;p&gt;Primeiro, vamos ver um exemplo do uso do Set para remover items duplicados de uma lista&lt;br&gt;
&lt;/p&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;arr1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;arr2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;arr3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;arr1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arr2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// -&amp;gt; [ '0', '0', '1', '2', '2', '3' ]&lt;/span&gt;

&lt;span class="c1"&gt;// Agora com o uso do Set&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="kd"&gt;set&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;Set&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// vamos instanciar o set&lt;/span&gt;
&lt;span class="c1"&gt;// agora vamos adicionar cada item dos dois arrays a ele.&lt;/span&gt;
&lt;span class="nx"&gt;arr1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kd"&gt;set&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; 
&lt;span class="nx"&gt;arr2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kd"&gt;set&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="c1"&gt;// resultado&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="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;set&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;// -&amp;gt; ['0', '1', '2', '3']&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Viu como é simples? Sem necessidade de fazer uma iteração dentro da outra ou criar lógica desnecessária.&lt;/p&gt;

&lt;p&gt;Vamos a mais um exemplo, dessa vez mostrando a diferença entre listas e também as interseções&lt;br&gt;
&lt;/p&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;users01&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;Set&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cris&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;joao&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vitor&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;users02&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;Set&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;matheus&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ney&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cris&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;intersection&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;Set&lt;/span&gt;&lt;span class="p"&gt;([...&lt;/span&gt;&lt;span class="nx"&gt;users01&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;users02&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&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="nx"&gt;intersection&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// -&amp;gt; Set(1) { 'cris' }&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;difference&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;Set&lt;/span&gt;&lt;span class="p"&gt;([...&lt;/span&gt;&lt;span class="nx"&gt;users01&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;users02&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&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="nx"&gt;difference&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// -&amp;gt; Set(2) { 'joao', 'vitor' }&lt;/span&gt;

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

&lt;/div&gt;



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

&lt;p&gt;Bom, nesse texto quis trazer um pouco sobre o Set para vocês, é importante dizer que não me aprofundo pois a ideia é não te transformar em um especialista do objeto mas sim te apresentar as ferramentas de formas simples e fácil, dessa forma você sempre vai saber o que fazer e pelo o que pesquisar para resolver os seus problemas.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Map" rel="noopener noreferrer"&gt;Map MDN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Set" rel="noopener noreferrer"&gt;Set MDN&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Espero que tenha sido claro e tenha ajudado a entender um pouco mais sobre o assunto, fique a vontade para dúvidas e sugestões abaixo!&lt;/p&gt;

&lt;p&gt;Se chegou até aqui, me segue la nas &lt;a href="https://cristiansilva.dev/" rel="noopener noreferrer"&gt;redes vizinhas&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/xULW8v7LtZrgcaGvC0/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/xULW8v7LtZrgcaGvC0/giphy.gif" alt="thank you dog" width="375" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Foto de &lt;a href="https://unsplash.com/pt-br/@flowforfrank?utm_content=creditCopyText&amp;amp;utm_medium=referral&amp;amp;utm_source=unsplash" rel="noopener noreferrer"&gt;Ferenc Almasi&lt;/a&gt; na &lt;a href="https://unsplash.com/pt-br/fotografias/uma-tela-de-computador-com-um-monte-de-texto-sobre-ele-oCm8nPkE40k?utm_content=creditCopyText&amp;amp;utm_medium=referral&amp;amp;utm_source=unsplash" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>braziliandevs</category>
      <category>beginners</category>
      <category>node</category>
    </item>
    <item>
      <title>JavaScript: O que é Symbol?</title>
      <dc:creator>Cristian Magalhães</dc:creator>
      <pubDate>Wed, 19 Jun 2024 14:28:32 +0000</pubDate>
      <link>https://dev.to/cristuker/javascript-o-que-e-symbol-38l0</link>
      <guid>https://dev.to/cristuker/javascript-o-que-e-symbol-38l0</guid>
      <description>&lt;p&gt;Eae gente bonita, beleza? Continuo a jornada de "aprofundamento" em JavaScript e quanto mais eu aprendo mais eu quero escrever e compartilhar com vocês. Dessa vez vou falar um pouco sobre o &lt;code&gt;Symbol&lt;/code&gt; que para mim o motivo da sua existência sempre foi um mistério.&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%2Flxditmid4a0hdhe6wnfg.gif" 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%2Flxditmid4a0hdhe6wnfg.gif" alt="Misterio gif" width="480" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;O que é Symbol&lt;/li&gt;
&lt;li&gt;Criando propriedades "privadas"&lt;/li&gt;
&lt;li&gt;Mas por que "privado"&lt;/li&gt;
&lt;li&gt;Symbols e comportamentos padrão&lt;/li&gt;
&lt;li&gt;Referências&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  O que é Symbol
&lt;/h2&gt;

&lt;p&gt;Começando do começo, o Symbol é um tipo primitivo no JavaScript, ele é usado para criar valores, funções privadas e até mesmo para interceptar um comportamento padrão de um objeto no JavaScript. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Mas não se esqueça de uma coisa, no JavaScript TUDO é objeto.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Apenas para confirmar que o symbol é um tipo primitivo&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nc"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;foo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;symbol&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Criando propriedades "privadas"
&lt;/h2&gt;

&lt;p&gt;Com o Symbol podemos criar algumas propriedades quase privadas. Abaixo um exemplo&lt;br&gt;
&lt;/p&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;uniqueKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;userName&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;

&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;userName&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;value normal object&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;uniqueKey&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;value from symbol&lt;/span&gt;&lt;span class="dl"&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="s1"&gt;getting object&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;uniqueKey&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// "value from symbol"&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="s1"&gt;getting object&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;userName&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// "value normal object"&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="s1"&gt;getting object&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;userName&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)]);&lt;/span&gt; &lt;span class="c1"&gt;// undefined&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No exemplo nós criamos a &lt;code&gt;uniqueKey&lt;/code&gt;com o &lt;code&gt;Symbol&lt;/code&gt;com o valor &lt;code&gt;userName&lt;/code&gt; e um objeto &lt;code&gt;user&lt;/code&gt;. Primeiro colocamos um valor na propriedade &lt;code&gt;user["userName"]&lt;/code&gt; e depois fazemos a mesma coisa com a propriedade &lt;code&gt;user[uniqueKey]&lt;/code&gt; e você pode pensar, bom o symbol tem o mesmo valor que é userName, então o valor foi sobrescrito mas na verdade não. O Symbol cria um outro endereço de memória e uma propriedade diferente.&lt;br&gt;
Ok, então se eu criar um Symbol com o mesmo valor eu consigo acessar? Errado novamente. Como disse o Symbol cria um novo endereço na memória logo o terceiro console log retorna undefined. Por isso que com ele nós podemos criar variáves e métodos privados, pois os mesmos só serão acessados se o Symbol usado for exportado junto.&lt;/p&gt;
&lt;h2&gt;
  
  
  Mas por que "privado"
&lt;/h2&gt;

&lt;p&gt;Bom imagino que deve ter percebido o uso excessivo das aspas em privado isso acontece porque nós podemos saber quais são o symbols existentes. Vamos a mais um exemplo:&lt;br&gt;
&lt;/p&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;uniqueKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;userName&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;func&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;soma&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;

&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;uniqueKey&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;value from symbol&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;func&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;n2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;n1&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;n2&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="s1"&gt;symbols&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getOwnPropertySymbols&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="c1"&gt;// symbols [ Symbol(userName), Symbol(soma) ]&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Como podemos ver no exemplo acima os Symbols desse objeto não são privados. Com um simples método do &lt;code&gt;Object&lt;/code&gt; nós podemos ver o Symbols existentes, porém não podemos acessá-los ou ler suas implementações.&lt;/p&gt;

&lt;h2&gt;
  
  
  Symbols e comportamentos padrão
&lt;/h2&gt;

&lt;p&gt;Com o Symbol nós podemos alterar alguns comportamentos padrão dos objetos, como por exemplo como um objeto será lido por uma função de iterator ou convertido para string.&lt;/p&gt;

&lt;p&gt;Vamos aos exemplos!&lt;br&gt;
&lt;/p&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;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;c&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;b&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;a&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para podermos ler o objeto acima em um iterator(for, forEach, map) nós precisariamos usar alguma função como Objeto.entries ou Object.keys para transformar as chaves em um array e ler propriedade por propriedade.&lt;/p&gt;

&lt;p&gt;Mas e se quiséssemos que esse objeto fosse lido de forma correta por um iterator? Bom nós podemos mudar esse comportamento, como no exemplo abaixo&lt;br&gt;
&lt;/p&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;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;iterator&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;c&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;b&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;a&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="nf"&gt;next&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="na"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dessa forma podemos apenas chamar uma função de iterator e o nosso objeto será lido sem problema algum. O mesmo vale para &lt;code&gt;toString&lt;/code&gt; por exemplo e por ai vai. Caso queira saber recomendo pesquisar sobre prototypes no JavaScript.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol" rel="noopener noreferrer"&gt;Symbol - MDN&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Espero que tenha sido claro e tenha ajudado a entender um pouco mais sobre o assunto, fique a vontade para dúvidas e sugestões abaixo!&lt;/p&gt;

&lt;p&gt;Se chegou até aqui, me segue la nas &lt;a href="https://cristiansilva.dev/" rel="noopener noreferrer"&gt;redes vizinhas&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/xULW8v7LtZrgcaGvC0/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/xULW8v7LtZrgcaGvC0/giphy.gif" alt="thank you dog" width="375" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>braziliandevs</category>
      <category>beginners</category>
      <category>node</category>
    </item>
    <item>
      <title>O que é strict mode no JavaScript?</title>
      <dc:creator>Cristian Magalhães</dc:creator>
      <pubDate>Mon, 27 May 2024 12:59:23 +0000</pubDate>
      <link>https://dev.to/cristuker/o-que-e-strict-mode-no-javascript-16cb</link>
      <guid>https://dev.to/cristuker/o-que-e-strict-mode-no-javascript-16cb</guid>
      <description>&lt;p&gt;E aí, gente bonita, beleza? Retomando os estudos em JS, hoje vou falar um pouco para vocês sobre o strict mode. Então pega um cafezinho e vem comigo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problemas da linguagem
&lt;/h2&gt;

&lt;p&gt;Caso você seja novo na linguagem e não saiba, o JavaScript é uma linguagem muito poderosa e com ela você pode fazer muita coisa, mas quando eu digo muita coisa, é MUITA COISA mesmo. Coisas que não deveriam ser feitas. Costumo dizer que essa liberdade do JS é uma das melhores e piores coisas da linguagem.&lt;/p&gt;

&lt;p&gt;Agora você me pergunta: &lt;strong&gt;que coisas são essas?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;E aqui estou para te dizer alguns problemas da linguagem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pode atribuir valores a variáveis não declaradas.&lt;/li&gt;
&lt;li&gt;Você pode usar o operador delete em variáveis e funções.&lt;/li&gt;
&lt;li&gt;Nomes de parâmetros duplicados são permitidos fora do &lt;em&gt;strict mode&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Caso queira ver mais alguns problemas da linguagem, recomendo a leitura do repositório &lt;a href="https://github.com/denysdovhan/wtfjs" rel="noopener noreferrer"&gt;What the f*ck JavaScript?&lt;/a&gt;. Conhecer os problemas da linguagem é tão importante quanto os seus pontos fortes.&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%2F7x3l0sk3399pld2c7ufz.gif" 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%2F7x3l0sk3399pld2c7ufz.gif" alt="WTF" width="268" height="274"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Como eu resolvo isso?
&lt;/h2&gt;

&lt;p&gt;Ok, realmente temos alguns problemas na linguagem, mas para evitar todos logo de cara você não precisa ler todo o repositório do &lt;a href="https://github.com/denysdovhan/wtfjs" rel="noopener noreferrer"&gt;What the f*ck JavaScript?&lt;/a&gt; de uma vez só. Você pode usar o famoso 'use strict'; no topo dos seus arquivos. Assim, você vai ativar o modo estrito para todo o arquivo e todos esses problemas da linguagem vão aparecer como erros no seu console e você vai poder resolvê-los antes de enviar para o ar!&lt;/p&gt;

&lt;p&gt;É importante lembrar que muitas bibliotecas já usam o strict mode por debaixo dos panos, assim como compiladores como Babel e TypeScript. Então você deve se preocupar mais com o uso do strict mode quando for trabalhar com JS puro.&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%2Fvve4r20bo8xoyxj2916x.gif" 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%2Fvve4r20bo8xoyxj2916x.gif" alt="YES" width="480" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Dito tudo isso, hoje vimos que o nosso amado JS não é só feito de coisas boas, apesar de ainda serem muitas rsrs. Recomendo fortemente a leitura do repositório &lt;a href="https://github.com/denysdovhan/wtfjs" rel="noopener noreferrer"&gt;What the f*ck JavaScript?&lt;/a&gt; e, caso queira saber o que mais o modo estrito do JavaScript resolve, eu deixei alguns links de referências.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://www.w3schools.com/js/js_strict.asp" rel="noopener noreferrer"&gt;W3S Schools&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Espero que tenha sido claro e tenha ajudado a entender um pouco mais sobre o assunto, fique a vontade para dúvidas e sugestões abaixo!&lt;/p&gt;

&lt;p&gt;Se chegou até aqui, me segue la nas &lt;a href="https://cristiansilva.dev/" rel="noopener noreferrer"&gt;redes vizinhas&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/xULW8v7LtZrgcaGvC0/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/xULW8v7LtZrgcaGvC0/giphy.gif" alt="thank you dog" width="375" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>braziliandevs</category>
    </item>
  </channel>
</rss>
