<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Gizelly Steffannny on Medium]]></title>
        <description><![CDATA[Stories by Gizelly Steffannny on Medium]]></description>
        <link>https://medium.com/@gizlly?source=rss-eeca27bb87a6------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*XfzfvkdRzKLmIHHg6HRscQ.jpeg</url>
            <title>Stories by Gizelly Steffannny on Medium</title>
            <link>https://medium.com/@gizlly?source=rss-eeca27bb87a6------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Wed, 20 May 2026 23:05:12 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@gizlly/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Mensageria: Compreendendo a Comunicação Assíncrona ]]></title>
            <link>https://gizlly.medium.com/mensageria-compreendendo-a-comunica%C3%A7%C3%A3o-ass%C3%ADncrona-06ab89ef2a30?source=rss-eeca27bb87a6------2</link>
            <guid isPermaLink="false">https://medium.com/p/06ab89ef2a30</guid>
            <category><![CDATA[message-broker]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[messaging]]></category>
            <category><![CDATA[rabbitmq]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Gizelly Steffannny]]></dc:creator>
            <pubDate>Mon, 27 May 2024 02:40:31 GMT</pubDate>
            <atom:updated>2024-05-27T02:40:31.797Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BwiBleHAAcPZu0QPwS0KAQ.jpeg" /></figure><p>Mensageria é muito mais do que um jargão técnico. É uma ferramenta poderosa que revoluciona a forma como sistemas interagem e se comunicam entre si. Imagine uma rede complexa de sistemas distribuídos, cada um com sua própria tarefa e responsabilidade. Como garantir uma troca eficiente e confiável de informações entre eles? A resposta está na mensageria, pronta para facilitar essa interação.</p><p>Neste artigo, vamos explorar a fundo o conceito de mensageria. Vamos entender como ela permite a comunicação assíncrona entre diferentes partes de uma aplicação, proporcionando flexibilidade, escalabilidade e resiliência. Prepare-se para desvendar os segredos por trás dessa ferramenta fundamental no arsenal de qualquer desenvolvedor. 👨🏻‍💻✨</p><h3>O que é a Mensageria?</h3><p>Mensageria é uma maneira de fazer diferentes partes de um sistema trocarem informações de forma assíncrona, sem precisar esperar uma pela outra, as mensagens são enviadas e recebidas de forma independente. Isso torna a comunicação mais flexível e resistente a falhas, ideal para sistemas grandes e distribuídos.</p><h4>Componentes Fundamentais</h4><p>Para entender bem como a mensageria funciona, é importante conhecer os componentes principais:</p><ol><li><strong>Producer:</strong> É quem envia as mensagens. Pode ser uma aplicação, serviço ou qualquer parte do sistema que precisa comunicar algo a outro componente.</li><li><strong>Consumer:</strong> É quem recebe as mensagens. Também pode ser uma aplicação, serviço ou parte do sistema que precisa processar a mensagem recebida.</li><li><strong>Message Broker:</strong> É o correio central que gerencia as mensagens. Ele recebe, organiza, armazena e entrega as mensagens para os consumidores quando eles estão prontos para recebê-las.</li></ol><h4>Tipos de Comunicação</h4><p>Existem dois tipos principais de comunicação na mensageria:</p><ol><li><strong>Point-to-Point (Ponto a Ponto)</strong>: Nesse modelo, cada mensagem é enviada de um produtor para um único consumidor. É como enviar uma carta registrada que só o destinatário pode receber.</li><li><strong>Publish/Subscribe (Publicar/Assinar)</strong>: Nesse modelo, um produtor envia uma mensagem para vários consumidores ao mesmo tempo. É como postar algo nas redes sociais, onde todos os seguidores recebem a atualização.</li></ol><h3>Como Funciona um Serviço de Mensageria?</h3><p>Agora que você conhece os componentes e os tipos de comunicação, vamos ver como um serviço de mensageria funciona na prática:</p><p><strong>Produção da Mensagem</strong></p><ul><li><strong>Envio:</strong> Quando uma parte do sistema, chamada de produtor, tem uma mensagem para enviar, ela cria essa mensagem e a envia para o Message Broker. Por exemplo, pode ser um pedido de compra enviado por um sistema de e-commerce.</li><li><strong>Formato da Mensagem: </strong>As mensagens geralmente têm um formato padronizado (JSON, XML, etc.) para garantir que todos os componentes possam entender seu conteúdo.</li></ul><p><strong>Gerenciamento pelo Message Broker</strong></p><ul><li><strong>Recebimento:</strong> O Message Broker recebe a mensagem do produtor. Ele atua como intermediário, garantindo que a mensagem seja entregue corretamente.</li><li><strong>Armazenamento:</strong> Se o consumidor ainda não está pronto para processar a mensagem, o Message Broker armazena a mensagem temporariamente. Ele mantém as mensagens em filas (para comunicação ponto a ponto) ou em tópicos (para comunicação publicar/assinar).</li><li><strong>Distribuição:</strong> Quando o consumidor está pronto, o Message Broker entrega a mensagem. Ele pode fazer isso imediatamente ou depois, dependendo da disponibilidade do consumidor.</li></ul><p><strong>Consumo da Mensagem</strong></p><ul><li><strong>Recepção:</strong> Quando o consumidor está pronto para processar a mensagem, ele solicita ao Message Broker para receber a mensagem.</li><li><strong>Processamento:</strong> O consumidor então processa a mensagem. Isso pode significar atualizar um banco de dados, enviar um e-mail, ou qualquer outra ação que o sistema precise realizar.</li></ul><p><strong>Acknowledge (Reconhecimento)</strong></p><ul><li><strong>Confirmação de Recebimento:</strong> Após processar a mensagem, o consumidor envia uma confirmação de recebimento (acknowledge) ao Message Broker. Isso indica que a mensagem foi recebida e processada com sucesso.</li><li><strong>Remoção da Mensagem:</strong> Depois de receber a confirmação, o Message Broker pode remover a mensagem da fila ou do tópico, garantindo que não será processada novamente.</li></ul><p><strong>Resiliência e Escalabilidade</strong></p><ul><li><strong>Resiliência:</strong> Se o consumidor estiver temporariamente indisponível, o Message Broker pode manter a mensagem até que o consumidor esteja pronto, garantindo que nenhuma mensagem seja perdida.</li><li><strong>Escalabilidade:</strong> O sistema pode ser escalado facilmente adicionando mais produtores e consumidores, sem alterar a arquitetura do Message Broker. Isso permite lidar com grandes volumes de mensagens de forma eficiente.</li></ul><h4>Exemplo Prático em Java com Spring Boot usando o RabbitMQ</h4><p>Para ilustrar como tudo isso funciona na prática, vamos configurar um serviço de mensageria usando RabbitMQ com Spring Boot. Este exemplo mostrará como configurar um produtor e um consumidor de mensagens.</p><p><strong>Configuração Inicial<br></strong>Primeiro, precisamos adicionar a dependência do RabbitMQ no arquivo pom.xml do seu projeto:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/4a18638ddd698e3160aa85848125f73b/href">https://medium.com/media/4a18638ddd698e3160aa85848125f73b/href</a></iframe><p><strong>Configuração do RabbitMQ<br></strong>Em seguida, configuramos o RabbitMQ no nosso projeto. Crie uma classe de configuração chamada RabbitConfig:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/43dad1c720e9e4a9c65c129b6dc457ee/href">https://medium.com/media/43dad1c720e9e4a9c65c129b6dc457ee/href</a></iframe><p><strong>Produtor de Mensagens<br></strong>Vamos criar uma classe responsável por publicar mensagens. Aqui está o código da classe BoardCreatedEventPublisher:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/7189327bfe8c366a40065329aaca538c/href">https://medium.com/media/7189327bfe8c366a40065329aaca538c/href</a></iframe><p><strong>Consumidor de Mensagens<br></strong>Vamos criar uma classe responsável por consumir as mensagens. Aqui está o código da classe BoardCreatedEventListener:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/502197baba9238fb1ff389e4c001e279/href">https://medium.com/media/502197baba9238fb1ff389e4c001e279/href</a></iframe><p><strong>Chamando o Produtor de Mensagens<br></strong>Finalmente, vamos integrar o código que chama a classe para publicar uma mensagem toda vez que um novo board é criado pelo usuário:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/f3fec2a940bbee77756ac33958033f19/href">https://medium.com/media/f3fec2a940bbee77756ac33958033f19/href</a></iframe><p>Neste exemplo, configuramos um sistema de mensageria utilizando o Message Broker RabbitMQ. Primeiramente, estabelecemos um exchange direto chamado board-exchange e uma fila chamada board-created-queue. Em seguida, definimos um binding que associa a fila board-created-queue ao exchange board-exchange, garantindo que as mensagens do tipo BoardCreatedEvent sejam corretamente roteadas para esta fila.</p><p>Embora não tenhamos abordado os detalhes sobre exchanges e bindings, são conceitos fundamentais em sistemas de mensageria. Eles definem as regras de roteamento das mensagens entre produtores e consumidores, garantindo sua entrega adequada.</p><p>No código do produtor, criamos uma classe chamada BoardCreatedEventPublisher, responsável por enviar mensagens para o exchange board-exchange usando o RabbitTemplate. Este template é uma ferramenta fornecida pelo Spring Boot para simplificar a publicação de mensagens em um exchange RabbitMQ.</p><p>Por outro lado, no código do consumidor, implementamos a classe BoardCreatedEventListener, que é anotada com @RabbitListener. Isso indica ao Spring Boot que esta classe é um consumidor de mensagens e deve ser notificada sempre que houver uma mensagem na fila board-created-queue. Ao receber uma mensagem, o método handleBoardCreatedEvent é invocado para processar a mensagem recebida.</p><p>Com isso, estabelecemos um fluxo de comunicação assíncrona entre os diferentes componentes do sistema, onde o produtor envia mensagens para o exchange e o consumidor as recebe da fila associada.</p><h3>Conclusão</h3><p>Exploramos neste artigo o poder da mensageria e sua capacidade de revolucionar a comunicação assíncrona entre sistemas distribuídos. Desde o estabelecimento de filas e troca de mensagens até a implementação de produtores e consumidores, vimos como a mensageria pode proporcionar flexibilidade, escalabilidade e resiliência aos nossos sistemas.</p><h3>Fim 😗🖖🏻</h3><p>Com isso, encerro por aqui e espero que este artigo tenha contribuído para o seu entendimento da mensageria e suas aplicações. Mantenha-se atualizado e explore os conceitos apresentados em seus próximos projetos.</p><p>— Você pode me seguir no <a href="https://www.linkedin.com/in/gizellysteffanny/">LinkedIn</a> e no <a href="https://github.com/gizellysteffanny">Github</a> também. 💖</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=06ab89ef2a30" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Criando Código de Qualidade: O Poder das Convenções de Nomenclatura]]></title>
            <link>https://gizlly.medium.com/criando-c%C3%B3digo-de-qualidade-o-poder-das-conven%C3%A7%C3%B5es-de-nomenclatura-b41f68b739a?source=rss-eeca27bb87a6------2</link>
            <guid isPermaLink="false">https://medium.com/p/b41f68b739a</guid>
            <category><![CDATA[clean-code]]></category>
            <category><![CDATA[code]]></category>
            <category><![CDATA[naming-conventions]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Gizelly Steffannny]]></dc:creator>
            <pubDate>Tue, 15 Aug 2023 04:26:50 GMT</pubDate>
            <atom:updated>2023-08-15T04:26:50.794Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*quWTwFNheNYftg_XaYRwXw.jpeg" /><figcaption>Convenções de nomenclatura</figcaption></figure><p>Se você é desenvolvedor, sabe como é importante escrever código que seja não apenas funcional, mas também legível e compreensível. Uma das maneiras mais eficazes de atingir esse objetivo é seguir as convenções de nomenclatura. Essas regras e práticas estabelecidas tornam seu código mais consistente e facilitam a colaboração com outros desenvolvedores. Neste artigo, vou te apresentar algumas das principais convenções de nomenclatura e como você pode aplicá-las no seu código.</p><h3>Camel Case e Pascal Case: Um Mundo de Letras</h3><p>Uma das convenções mais comuns é o Camel Case e o Pascal Case. No Camel Case, as palavras são escritas juntas e a primeira letra de cada palavra subsequente é maiúscula. Já no Pascal Case, a primeira letra também é maiúscula. Isso é particularmente útil quando estamos nomeando variáveis e funções.</p><h4>Exemplos:</h4><ul><li>Camel Case: <br>userImageProfile, getUserByEmail, userService</li><li>Pascal Case: <br>UserImageProfile, GetUserByEmail, UserService</li></ul><h3>Snake Case e Kebab Case: Separando as Palavras</h3><p>Outra abordagem é usar o Snake Case e o Kebab Case, em que as palavras são separadas por underscores ou hífens, respectivamente. O Snake Case é mais comum em linguagens como Python, enquanto o Kebab Case é frequentemente usado em URLs e nomes de diretórios e arquivos.</p><h4>Exemplos:</h4><ul><li>Snake Case: <br>user_image_profile, get_user_by_email, set_user_phone</li><li>Kebab Case: <br>user-by-email, user-list, user-list-component</li></ul><h3>Convenções da Linguagem de Programação</h3><p>Lembre-se de que diferentes linguagens de programação podem ter suas próprias convenções de nomenclatura. É essencial seguir essas convenções específicas da linguagem para tornar o código mais familiar para a comunidade.</p><h3>Exemplo Prático</h3><p>Vamos dar uma olhada em um exemplo de código que incorpora essas convenções:</p><pre>class GreetingsWorld:<br>    def __init__(self, your_name):<br>        self.your_name = your_name<br>    <br>    def say_hello(self):<br>        print(&quot;Hello, &quot; + self.your_name)<br><br><br>greeting = GreetingsWorld(&quot;Gizelly&quot;)<br>greeting.say_hello()  # output: &quot;Hello, Gizelly&quot;</pre><h3>Conclusão</h3><p>Dominar as convenções de nomenclatura é um passo fundamental para escrever código limpo e compreensível. Ao aderir a essas práticas, você não apenas facilita a colaboração com outros desenvolvedores, mas também torna seu código mais profissional e de alta qualidade.</p><p>Lembre-se, a consistência é a chave. Escolha uma convenção siga em todo o código. Com nomes descritivos que revelem a finalidade das variáveis, funções ou classes. Evite abreviações obscuras que possam confundir outros desenvolvedores. Com isso você estará no caminho certo para se tornar um desenvolvedor de alto nível!</p><h3>Fim 😗🖖🏻</h3><p>Com isso, encerro por aqui e espero que esse artigo tenha contribuído para o seu entendimento das principais convenções de nomenclatura. Mantenha esses conceitos em mente ao escreve seu próximo código e aproveite os benefícios de um desenvolvimento mais suave e colaborativo.</p><p>— Você pode me seguir no <a href="https://www.linkedin.com/in/gizellysteffanny/">LinkedIn</a> e no <a href="https://github.com/gizellysteffanny">Github</a> também. 💖</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b41f68b739a" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Tipos de Subjects no RxJS]]></title>
            <link>https://gizlly.medium.com/tipos-de-subjects-no-rxjs-1e0b8cc74287?source=rss-eeca27bb87a6------2</link>
            <guid isPermaLink="false">https://medium.com/p/1e0b8cc74287</guid>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[frontend]]></category>
            <category><![CDATA[developer]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[rxjs]]></category>
            <dc:creator><![CDATA[Gizelly Steffannny]]></dc:creator>
            <pubDate>Mon, 30 Jan 2023 13:00:00 GMT</pubDate>
            <atom:updated>2023-01-30T13:00:00.767Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*U-OIJkduK4TMkIMLGlmLMw.jpeg" /></figure><p>O RxJS é uma biblioteca JavaScript para programação reativa que permite trabalhar com fluxos de dados de forma assíncrona e encadeável. Um dos principais conceitos da programação reativa é o Subject, que é um tipo especial de Observable que permite que um ou mais valores sejam emitidos para um ou mais Observers.</p><blockquote>Existem vários tipos de Subjects no RxJS, cada um com características e utilidades específicas. Neste artigo, vamos ver os principais tipos de Subjects e exemplos de como usá-los.</blockquote><h4>Subject</h4><p>O Subject é o tipo mais básico de Subject e representa um Observable e um Observer ao mesmo tempo. Isso significa que, além de ser capaz de emitir valores para os seus Observers, ele também pode ser usado como um Observer para se inscrever em outros Observables.</p><p><strong>Exemplo:</strong></p><pre>const subject = new Subject();<br><br>// Emitir um valor para os Observers<br>subject.next(1);<br><br>// Inscrever-se em um Observable<br>subject.subscribe(value =&gt; console.log(value));</pre><h4>BehaviourSubject</h4><p>O BehaviourSubject é um tipo de Subject que armazena o último valor emitido e o envia para qualquer Observer que se inscrever nele. Isso é útil quando precisamos armazenar o estado do Subject e enviá-lo para novos Observers que se inscreverem nele.</p><p><strong>Exemplo:</strong></p><pre>const subject = new BehaviourSubject(0); // Inicializando o BehaviourSubject com o valor 0<br><br>// Emitir um novo valor<br>subject.next(1);<br><br>// Inscrever-se no Subject<br>subject.subscribe(value =&gt; console.log(value)); // Imprime o valor 1</pre><h4>ReplaySubject</h4><p>O ReplaySubject é um tipo de Subject que armazena todos os valores emitidos e os envia para qualquer Observer que se inscrever nele. Isso é útil quando queremos que todos os Observers recebam todos os valores emitidos pelo Subject, independentemente de quando eles se inscreverem.</p><p><strong>Exemplo:</strong></p><pre>const subject = new ReplaySubject();<br><br>// Emitir alguns valores<br>subject.next(1);<br>subject.next(2);<br>subject.next(3);<br><br>// Inscrever-se no Subject<br>subject.subscribe(value =&gt; console.log(value)); // Imprime os valores 1, 2 e 3</pre><h4>AsyncSubject</h4><p>O AsyncSubject é um tipo de Subject que só emite o último valor emitido quando o Subject é completado. Isso é útil quando queremos que todos os Observers recebam o último valor emitido pelo Subject assim que ele for completado.</p><p><strong>Exemplo:</strong></p><pre>const subject = new AsyncSubject();<br><br>// Emitir alguns valores<br>subject.next(1);<br>subject.next(2);<br><br>// Inscrever-se no Subject<br>subject.subscribe(value =&gt; console.log(value)); // Não imprime nenhum valor<br><br>// Emitir o último valor e completar o Subject<br>subject.next(3);<br>subject.complete();<br><br>// Inscrever-se no Subject<br>subject.subscribe(value =&gt; console.log(value)); // Imprime o valor 3</pre><h4>MulticastObservable</h4><p>O MulticastObservable é um tipo de Observable que permite que múltiplos Observers se inscrevam nele e recebam os mesmos valores emitidos. Isso é conseguido usando um Subject como intermediário entre o Observable e os Observers.</p><p><strong>Exemplo:</strong></p><pre>// Criar um Observable<br>const sourceObservable = of(1, 2, 3);<br><br>// Criar um Subject<br>const subject = new Subject();<br><br>// Criar um MulticastObservable usando o Subject como intermediário<br>const multicastedObservable = sourceObservable.pipe(multicast(subject));<br><br>// Inscrever-se no MulticastObservable<br>multicastedObservable.subscribe(value =&gt; console.log(value));<br>multicastedObservable.subscribe(value =&gt; console.log(value));<br><br>// Iniciar a emissão de valores<br>multicastedObservable.connect();</pre><p>Espero que esses exemplos ajudem a entender os diferentes tipos de Subjects do RxJS e como usá-los em aplicações reativas. Existem outros tipos de Subjects, como o PublishSubject, que não foram mencionados aqui, mas o objetivo foi apresentar os tipos mais comuns e úteis.</p><h4>Fim 😗🖖🏻</h4><p>Com isso, encerro por aqui e espero que esse artigo tenha ajudado a compreender melhor os Subjects e como usá-los em suas aplicações.</p><p>— Você pode me seguir no <a href="https://www.linkedin.com/in/gizellysteffanny/">LinkedIn</a> e no <a href="https://github.com/gizellysteffanny">Github</a> também. 💖</p><h4>Referências 🧐</h4><p><a href="https://www.learnrxjs.io/">Introduction | Learn RxJS</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1e0b8cc74287" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Otimize o carregamento de scripts em suas páginas com async e defer]]></title>
            <link>https://gizlly.medium.com/otimize-o-carregamento-de-scripts-em-suas-p%C3%A1ginas-com-async-e-defer-7a532da91c81?source=rss-eeca27bb87a6------2</link>
            <guid isPermaLink="false">https://medium.com/p/7a532da91c81</guid>
            <category><![CDATA[software]]></category>
            <category><![CDATA[frontend]]></category>
            <category><![CDATA[developer]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[javascript]]></category>
            <dc:creator><![CDATA[Gizelly Steffannny]]></dc:creator>
            <pubDate>Tue, 17 Jan 2023 13:16:16 GMT</pubDate>
            <atom:updated>2023-01-17T13:16:16.834Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*TK4KYwIFcRDuUk03g4MDPw.jpeg" /></figure><p>Quando carregamos um script em uma página, o navegador para de carregar o conteúdo da página até que o script seja baixado e executado. Isso pode afetar negativamente o tempo de carregamento da página, especialmente se o script for grande ou demorar muito para ser carregado.</p><blockquote>Para evitar esse problema, podemos usar as tags async e defer para indicar ao navegador como deve tratar o script. Vamos ver como cada uma dessas tags funciona.</blockquote><h4>Async</h4><p>A tag async indica ao navegador que o script deve ser baixado e executado assincronamente, ou seja, enquanto o navegador continua carregando o conteúdo da página. Isso significa que o script não vai parar o carregamento da página e será executado assim que for baixado.</p><p>Vejamos um exemplo de como usar a tag async:</p><pre>&lt;script src=&quot;script.js&quot; async&gt;&lt;/script&gt;</pre><p>No exemplo acima, adicionamos a tag async ao script para indicar ao navegador que ele deve ser carregado e executado assincronamente.</p><h4>Defer</h4><p>A tag defer também indica ao navegador que o script deve ser baixado e executado assincronamente, mas com uma diferença importante: o script só será executado quando todo o conteúdo da página tiver sido carregado.</p><p>Vejamos um exemplo de como usar a tag defer:</p><pre>&lt;script src=&quot;script.js&quot; defer&gt;&lt;/script&gt;</pre><p>No exemplo acima, adicionamos a tag defer ao script para indicar ao navegador que ele deve ser baixado assincronamente, mas só deve ser executado quando todo o conteúdo da página tiver sido carregado.</p><h4>Qual a diferença entre async e defer?</h4><p>A principal diferença entre async e defer é que a tag async indica ao navegador que o script deve ser executado assim que for baixado, enquanto a tag defer indica que o script só deve ser executado quando todo o conteúdo da página tiver sido carregado.</p><p>Outra diferença é que os scripts marcados com defer são executados na ordem em que aparecem na página, enquanto os scripts marcados com async podem ser executados em qualquer ordem. Isso pode ser importante se você tiver scripts que dependem uns dos outros.</p><h4>Fim 😗🖖🏻</h4><p>Com isso, encerro por aqui e espero tenha ajudado a entender como funcionam as tags async e defer e como elas podem ser usadas para otimizar o carregamento de scripts em suas páginas web.</p><p>— Você pode me seguir no <a href="https://www.linkedin.com/in/gizellysteffanny/">LinkedIn</a> e no <a href="https://github.com/gizellysteffanny">Github</a> também. 💖</p><h4>Referências 🧐</h4><p><a href="https://developer.mozilla.org/pt-BR/">MDN Web Docs</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7a532da91c81" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Padronização de mensagens de commit com o Husky]]></title>
            <link>https://gizlly.medium.com/padroniza%C3%A7%C3%A3o-de-mensagens-de-commit-com-o-husky-63cd04a8a9e2?source=rss-eeca27bb87a6------2</link>
            <guid isPermaLink="false">https://medium.com/p/63cd04a8a9e2</guid>
            <category><![CDATA[husky]]></category>
            <category><![CDATA[commit]]></category>
            <category><![CDATA[frontend]]></category>
            <category><![CDATA[git]]></category>
            <category><![CDATA[javascript]]></category>
            <dc:creator><![CDATA[Gizelly Steffannny]]></dc:creator>
            <pubDate>Mon, 09 Jan 2023 15:14:13 GMT</pubDate>
            <atom:updated>2023-01-09T15:14:13.520Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*NF74CXAk7-40KCe5UjTtGg.jpeg" /></figure><p>O Husky é uma ferramenta incrível que pode ajudar a padronizar as mensagens de commit em seu projeto. Ele funciona como um hook do git e pode ser configurado para validar e formatar as mensagens de commit antes que elas sejam enviadas para o repositório. Isso é útil para garantir que todas as mensagens de commit sejam escritas de acordo com um padrão específico e sejam consistentes com o resto do projeto.</p><p>Para começar a usar o Husky em seu projeto, basta instalá-lo como uma dependência do npm.</p><pre>npm install husky --save-dev</pre><p>Em seguida, basta adicionar as configurações do Husky ao arquivo package.json.</p><pre>&quot;husky&quot;: {<br>  &quot;hooks&quot;: {<br>    &quot;commit-msg&quot;: &quot;commitlint -E HUSKY_GIT_PARAMS&quot;<br>  }<br>}</pre><p>Essa configuração específica do Husky irá usar o commitlint para validar e formatar as mensagens de commit. Você também pode usar outras ferramentas, como o Conventional Commits, para ajudar a padronizar as mensagens de commit.</p><p>Além disso, é importante configurar o commitlint com as regras de formatação desejadas. Isso pode ser feito adicionando o commitlint-config-padrão como uma dependência do npm e adicionando as configurações ao arquivo package.json.</p><pre>npm install @commitlint/config-conventional --save-dev</pre><pre>&quot;commitlint&quot;: {<br>  &quot;extends&quot;: [<br>    &quot;@commitlint/config-conventional&quot;<br>  ]<br>}</pre><p>Agora, toda vez que um commit for realizado no seu projeto, o Husky irá validar a mensagem de commit de acordo com as regras configuradas pelo commitlint. Se a mensagem de commit não estiver de acordo com o padrão especificado, o Husky exibirá uma mensagem de erro e o commit não será enviado.</p><p>O uso do Husky é uma ótima maneira de garantir que todas as mensagens de commit em um projeto sejam padronizadas e de fácil compreensão. Isso ajuda a manter o histórico de commit limpo e organizado, facilitando a colaboração com outros desenvolvedores e a manutenção do projeto ao longo do tempo.</p><h4>Fim 😗🖖🏻</h4><p>Com isso, encerro por aqui e espero que com dica rápida te ajude a manter o histórico de commit limpo e organizado.</p><p>— Você pode me seguir no <a href="https://www.linkedin.com/in/gizellysteffanny/">LinkedIn</a> e no <a href="https://github.com/gizellysteffanny">Github</a> também. 💖</p><h4>Referências 🧐</h4><ul><li><a href="https://typicode.github.io/husky/#/">Husky - Git hooks</a></li><li><a href="https://www.conventionalcommits.org/en/v1.0.0/">Conventional Commits</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=63cd04a8a9e2" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[O que são os componentes Smart e Dumb e como usá-los no Angular?]]></title>
            <link>https://gizlly.medium.com/o-que-s%C3%A3o-os-componentes-smart-e-dumb-e-como-us%C3%A1-los-no-angular-adb29565ea39?source=rss-eeca27bb87a6------2</link>
            <guid isPermaLink="false">https://medium.com/p/adb29565ea39</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[frontend]]></category>
            <category><![CDATA[components]]></category>
            <category><![CDATA[angular]]></category>
            <category><![CDATA[typescript]]></category>
            <dc:creator><![CDATA[Gizelly Steffannny]]></dc:creator>
            <pubDate>Fri, 06 Jan 2023 13:51:58 GMT</pubDate>
            <atom:updated>2023-01-06T13:51:58.313Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_LS4XkFGJD8r9PQzuW8S8g.jpeg" /><figcaption>Componentes Smart e Dumb no Angular</figcaption></figure><p>Os componentes Smart e Dumb são dois tipos de componentes que podem ser usados no Angular. Eles diferem na forma como lidam com dados e lógica de negócios. Enquanto os componentes Smart (também conhecidos como componentes inteligentes ou componentes controladores) possuem lógica de negócios e tomam decisões importantes, os componentes Dumb (também conhecidos como componentes burros ou componentes de apresentação) são responsáveis apenas por apresentar dados e delegar decisões importantes para os componentes Smart.</p><p>Usar componentes Smart e Dumb é uma ótima maneira de manter a complexidade do código sob controle e garantir que cada componente tenha uma responsabilidade bem definida. Isso pode ajudar a tornar o código mais fácil de entender e manter, além de tornar a aplicação mais escalável.</p><p>Vejamos um exemplo prático de como os componentes Smart e Dumb podem ser usados no Angular. Suponha que tenhamos um componente Smart chamado “ProdutoListaComponent” que é responsável por exibir uma lista de produtos e permitir que o usuário adicione novos produtos à lista. Esse componente possui uma propriedade “produtos” que é um array de produtos e um método “adicionarProduto()” que adiciona um novo produto ao array.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/3cb5288dc6c99a3afdef9545ee59ed91/href">https://medium.com/media/3cb5288dc6c99a3afdef9545ee59ed91/href</a></iframe><p>Agora, vamos criar um componente Dumb chamado “ProdutoItemComponent” que é responsável por exibir cada item da lista de produtos.</p><p>Esse componente possui uma propriedade “produto” que é um objeto de produto e um método “removerProduto()” que remove o produto da lista. No entanto, ao invés de manipular os dados da lista diretamente, o componente Dumb delega essa tarefa para o componente Smart, através de um evento “removerProduto”.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/9387538059e7c25592958fabd4d40364/href">https://medium.com/media/9387538059e7c25592958fabd4d40364/href</a></iframe><p>Agora, vamos usar o componente Dumb “ProdutoItemComponent” no template do componente Smart “ProdutoListaComponent”. Vamos iterar sobre o array de produtos e passar cada item como entrada para o componente Dumb. Além disso, vamos criar um evento “removerProduto” que é disparado pelo componente Dumb quando o usuário clica no botão “Remover”. O componente Smart vai ouvir esse evento e remover o produto da lista.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/917e4aa435b17a8697b9fcb17cd39879/href">https://medium.com/media/917e4aa435b17a8697b9fcb17cd39879/href</a></iframe><p>Esse exemplo mostra como os componentes Smart e Dumb podem ser usados em conjunto no Angular para criar uma aplicação mais organizada e fácil de manter. O componente Smart “ProdutoListaComponent” é responsável por armazenar e manipular os dados da lista de produtos, enquanto o componente Dumb “ProdutoItemComponent” é responsável apenas por apresentar cada item da lista. Isso divide as responsabilidades de forma clara e ajuda a manter o código mais organizado.</p><p>Além disso, o uso de componentes Smart e Dumb permite que os componentes Dumb sejam reutilizados em diferentes contextos, pois eles são totalmente independentes e não possuem lógica de negócios. Isso pode ajudar a tornar a aplicação mais escalável e evitar a duplicação de código.</p><p>Em resumo, os componentes Smart e Dumb são uma ótima maneira de dividir as responsabilidades em uma aplicação Angular. Os componentes Smart lidam com lógica de negócios e tomam decisões importantes, enquanto os componentes Dumb são responsáveis apenas por apresentar dados e delegar decisões importantes para os componentes Smart. Isso pode ajudar a tornar o código mais fácil de entender e manter, além de tornar a aplicação mais escalável.</p><h4>Fim 😗🖖🏻</h4><p>Com isso, encerro por aqui e espero que essas dicas te ajude a escrever um código mais limpo.</p><p>— Você pode me seguir no <a href="https://www.linkedin.com/in/gizellysteffanny/">LinkedIn</a> e no <a href="https://github.com/gizellysteffanny">Github</a> também. 💖</p><h4>Referências 🧐</h4><p><a href="https://angular.io/docs">Angular</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=adb29565ea39" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[3 maneiras de reduzir código JavaScript]]></title>
            <link>https://gizlly.medium.com/3-maneiras-de-reduzir-c%C3%B3digo-javascript-597366c3d57?source=rss-eeca27bb87a6------2</link>
            <guid isPermaLink="false">https://medium.com/p/597366c3d57</guid>
            <category><![CDATA[javascript-tips]]></category>
            <category><![CDATA[js]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[short-circuit]]></category>
            <dc:creator><![CDATA[Gizelly Steffannny]]></dc:creator>
            <pubDate>Wed, 30 Mar 2022 12:00:31 GMT</pubDate>
            <atom:updated>2022-03-30T19:15:32.855Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="3 formas para reduzir código JavaScript" src="https://cdn-images-1.medium.com/max/1024/1*hcFLzrY9FR1_lhF9leLiFA.jpeg" /><figcaption>Formas de reduzir código JavaScript</figcaption></figure><p>Existem diferentes formas de escrever a mesma regra de negocio no código. Além disso, cada linguagem de programação fornece diferentes sintaxes para executar uma tarefa.</p><p>Hoje vou te mostrar 3 caminhos diferentes que vão diminuir linhas de código, torná-lo menos verboso e de melhor compreensão. Mostrarei também o antes e depois de alguns códigos implementados usando os conceitos apresentados.</p><h4>Operador Condicional Ternário 👩🏻‍✈️</h4><p>É um operador usado frequentemente como um atalho para a instrução if. Utilizá-lo pode deixar o código mais limpo, visto que um bloco condicional if costuma a ter no mínimo cinco linhas que podem ser substituídas por apenas uma.</p><p><strong>Sintaxe:</strong></p><pre>(condição) ? valor1 : valor2</pre><p>Se a condição for verdadeira, o operador retornará o valor de valor1; se não, ele retorna o valor de valor2. Por exemplo, vamos retornar uma mensagem diferente baseada no valor da variável maiorDeIdade.</p><p><strong>Exemplo com o bloco condicional tradicional: 😀</strong></p><pre>if (maiorDeIdade &gt;= 18) {<br>   return &#39;Maior de idade&#39;;<br>} else {<br>   return &#39;Menor de idade&#39;;<br>}</pre><p><strong>Exemplo com o operador ternário: 🤩</strong></p><pre>(maiorDeIdade &gt;= 18) ? &#39;Maior de idade&#39; : &#39;Menor de idade&#39;;</pre><h4><strong>Short-Circuiting 🩳</strong></h4><p>É uma maneira de encurtar verificações desnecessárias em nossas condicionais. Ela é usada quando queremos simplificar uma condição if.</p><p>Por exemplo, precisamos chamar a função buscarUsuarioPorId, apenas se a variável usuarioId tiver um valor verdadeiro.</p><p><strong>Exemplo com a instrução if: 😀</strong></p><pre>if (usuarioId) {<br>   buscarUsuarioPorId(usuarioId);<br>}</pre><p><strong>Exemplo com a short-circuiting: 🤩</strong></p><pre>usuarioId &amp;&amp; buscarUsuarioPorId(usuarioId);</pre><h4>Optional Chaining 🔗</h4><p>É um operador que simplifica o acesso a valores de objetos aninhados quando é possível que uma referência ou função seja indefinida ou nula.</p><blockquote><a href="https://gizlly.medium.com/typescript-optional-chaining-d94456f0aac0">Saiba mais sobre ele🤌🏻</a></blockquote><p>Ele vai verificar a existência das propriedades do objeto e retornar false se a propriedade não existir.</p><p>Considere o seguinte objeto: 💁🏻‍♀️</p><pre>const pessoa = {<br>   nome: &#39;Gizelly&#39;,<br>   email: &#39;gi@test.com&#39;,<br>   endereco: {<br>      rua: &#39;Rua Z, n.10&#39;<br>   }<br>}</pre><p><strong>Exemplo com o bloco condicional tradicional: 😀</strong></p><pre>if (pessoa.endereco) {<br>   if(pessoa.endereco.rua) {<br>      console.log(pessoa.endereco.rua);<br>   }<br>}</pre><pre>// ou</pre><pre>if (pessoa.endereco &amp;&amp; pessoa.endereco.rua) {<br>   console.log(pessoa.endereco.rua);<br>}</pre><p><strong>Exemplo com o Optional Chaining: 🤩</strong></p><pre>console.log(pessoa?.endereco?.rua);</pre><h4><strong>+Bônus 😎</strong></h4><h4><strong>Coalescência nula 👌🏻</strong></h4><p>É uma forma de retornar um valor padrão quando lidarmos com um null ou undefined.</p><blockquote><a href="https://gizlly.medium.com/typescript-optional-chaining-d94456f0aac0">Saiba mais sobre ele🤌🏻</a></blockquote><p>Ele encurta o código em relação ao if-else, que pode tornar o código ainda mais curto. Vamos usar de exemplo o objeto pessoa criado anteriormente.</p><p><strong>Exemplo sem o operador de coalescência nula: 😀</strong></p><pre>return pessoa?.email ? pessoa.email : &#39;E-mail não cadastrado!&#39;</pre><p><strong>Exemplo com o operador de coalescência nula: 🤩</strong></p><pre>return pessoa?.email ?? &#39;E-mail não cadastrado!</pre><h4>Fim 😗🖖🏻</h4><p>Com isso, encerro por aqui e espero que essas dicas te ajude a escrever um código mais limpo.</p><p>— Você pode me seguir no <a href="https://www.linkedin.com/in/gizellysteffanny/">LinkedIn</a> e no <a href="https://github.com/gizellysteffanny">Github</a> também. 💖</p><h4>Referências 🧐</h4><p><a href="https://developer.mozilla.org/pt-BR/">MDN Web Docs</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=597366c3d57" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Registrando funções no JavaScript]]></title>
            <link>https://gizlly.medium.com/registrando-fun%C3%A7%C3%B5es-no-javascript-763cc40afc88?source=rss-eeca27bb87a6------2</link>
            <guid isPermaLink="false">https://medium.com/p/763cc40afc88</guid>
            <category><![CDATA[js]]></category>
            <category><![CDATA[front-end-development]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[frontend]]></category>
            <dc:creator><![CDATA[Gizelly Steffannny]]></dc:creator>
            <pubDate>Mon, 29 Nov 2021 06:38:21 GMT</pubDate>
            <atom:updated>2021-11-29T06:56:04.695Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*3Y7UBcisE2Qy6n1K8Ue5Rw.jpeg" /><figcaption>Funções em JavaScript</figcaption></figure><p>Existem duas formas de registrar funções no JavaScript, function expression e function declaration, hoje vamos conhecer cada uma delas e suas respectivas diferenças.</p><h4><strong>Function declaration</strong></h4><p>Uma <strong>declaração de função </strong>(ou function declaration) define uma função com os parâmetros especificados sem a necessidade de uma atribuição de variável. Ela é declarada usando a palavra-chave <em>function</em>.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/065a360d73dba7e97d4cd9abb25676d5/href">https://medium.com/media/065a360d73dba7e97d4cd9abb25676d5/href</a></iframe><h4>Function expression</h4><p>Uma <strong>Expressão de Função </strong>(ou function expression)<strong> </strong>funciona exatamente como uma <strong><em>function declaration</em></strong>, porém são funções anônimas, elas não possuem nomes e são executadas assim que são definidas.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/664b25577fddb6ae5865703a771eefbb/href">https://medium.com/media/664b25577fddb6ae5865703a771eefbb/href</a></iframe><p>A partir do ECMAScript 2015, foi introduzida as <strong><em>Arrow Functions</em></strong>(ou funções de seta), que é uma<strong> function expression</strong> com uma sintaxe mais curta, elas são bastante aplicadas em funções que recebem callbacks. Veja o exemplo abaixo de uma <em>arrow function</em> sendo usada como parâmetro na função<strong> map()</strong>:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/f8e3799d6579a19d8665109639f7c275/href">https://medium.com/media/f8e3799d6579a19d8665109639f7c275/href</a></iframe><h4>Qual é a diferença entre as duas?</h4><p>A principal diferença é que a <strong>function declaration </strong>pode ser chamada antes de ser declarada sem que haja qualquer erro, já com a <strong>function expression </strong>não é possível, vai ser lançado um erro.</p><h3>Referências</h3><p><a href="https://developer.mozilla.org/pt-BR/">MDN Web Docs</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=763cc40afc88" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Typescript: optional chaining]]></title>
            <link>https://gizlly.medium.com/typescript-optional-chaining-d94456f0aac0?source=rss-eeca27bb87a6------2</link>
            <guid isPermaLink="false">https://medium.com/p/d94456f0aac0</guid>
            <category><![CDATA[es2020]]></category>
            <category><![CDATA[optional-chaining]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[javascript-tips]]></category>
            <dc:creator><![CDATA[Gizelly Steffannny]]></dc:creator>
            <pubDate>Wed, 03 Jun 2020 00:03:03 GMT</pubDate>
            <atom:updated>2021-09-20T21:51:37.688Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*AzJhs7EOVaO7rxmg9qUnXg.jpeg" /><figcaption>Optional chaining</figcaption></figure><p>Um recurso bastante útil do typescript(v3.7) é o optional chaining, ele é uma maneira de simplificar o acesso a valores de objetos aninhados quando é possível que uma referência ou função seja indefinida ou nula.</p><p>Para entender melhor, vamos usar um exemplo:</p><pre>let user = {nome: &#39;&#39;, email: &#39;&#39;, address: null};<br>let street = user.address.street; // Error</pre><p>O trecho de código acima irá lançar um erro:</p><pre>`Uncaught TypeError: Cannot read property &#39;street&#39; of null`</pre><p>Isso acontece por que estamos tentando acessar uma propriedade ou chamar um método em um objeto<strong> </strong>null ou<strong> </strong>undefined. Fazendo uma verificação conseguimos resolver esse problema:</p><pre>let user = {nome: &#39;’, email: &#39;’, address: null};<br>if (user &amp;&amp; user.address &amp;&amp; user.address.street) {<br>  let street = user.address.street;<br>  console.log(street) // undefined<br>}</pre><p>Usando o optional chaining mas conhecido como “?.”, essa sintaxe se torna bem mais enxuta.<br>O código acima pode ser escrito da seguinte maneira:</p><pre>let user = {nome: &#39;&#39;, email: &#39;&#39;, address: null};<br>let street = user?.address?.street;</pre><pre>console.log(street) // undefined</pre><p>Outro recurso é o operador de <strong>coalescência nula </strong>“??”, ele é uma forma de retornar um valor padrão quando lidarmos com um null ou undefined.</p><p>Vamos combiná-lo com o optional chaining, reescrevendo nosso código:</p><pre>let user = {nome: &#39;&#39;, email: &#39;&#39;, address: null};<br>let street = user?.address?.street ?? &#39;address not found&#39;; </pre><pre>console.log(street) // &quot;address not found&quot;</pre><p>Como podemos notar o uso desses recursos nos ajuda a reduzir a quantidade de código, simplificando a leitura e a manutenção.</p><h4>Referências</h4><ul><li><a href="https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html">Documentation - TypeScript 3.7</a></li><li><a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Operators/Optional_chaining">Encadeamento opcional</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d94456f0aac0" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Operações em Array com ES6+]]></title>
            <link>https://gizlly.medium.com/opera%C3%A7%C3%B5es-em-array-com-es6-ebbe7e3b3bfd?source=rss-eeca27bb87a6------2</link>
            <guid isPermaLink="false">https://medium.com/p/ebbe7e3b3bfd</guid>
            <category><![CDATA[es6]]></category>
            <category><![CDATA[es6-js]]></category>
            <category><![CDATA[js]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[arrays]]></category>
            <dc:creator><![CDATA[Gizelly Steffannny]]></dc:creator>
            <pubDate>Tue, 25 Feb 2020 04:09:27 GMT</pubDate>
            <atom:updated>2021-09-13T04:30:44.225Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*QVU8rvWq8GhgiKfLTVLc7g.jpeg" /><figcaption>Operações em Array</figcaption></figure><p>Antigamente para manipular array era preciso usar o famoso for, ou muitas vezes recorrendo a biblioteca de terceiros, para percorrer de forma menos verbosa e conseguir um bom resultado.</p><p>Com <strong>ES6 </strong>temos algumas funcionalidades que servem para percorrer, manipular, encontrar valores dentro do array, de uma forma muito mais prática.</p><p>Vamos começar definido um array com alguns valores:</p><p>const arr = [1, 5, 3, 8, 2, 6];</p><p>A primeira função que vamos conhecer é o map()que percorre um array, executa uma ação e contrói um novo array.</p><p>No exemplo abaixo estamos somando cada item do array com a sua respectiva posição. Em resumo, o map percorre cada item do nosso array e executa a soma que definimos:</p><p>const newArr = arr.map((item, index) =&gt; item + index);<br>//[1, 6, 5, 11, 6, 11]</p><p>A próxima função que vamos conhecer é o reduce() que itera os itens de um array retornando um valor único.</p><p>Por exemplo, se precisamos calcular a soma de todos os itens do nosso array:</p><p>const sum = arr.reduce((accumulator, currentValue) =&gt; accumulator + currentValue);<br>//25</p><p>Seguindo com as funções, temos também o filter() que como o nome sugere, ele filtra os itens do array que passaram pela condição implementada retornando assim um novo array. Para retornar todos os números pares do nosso array usamos o seguinte exemplo:</p><p>const pairNumbers = arr.filter(item =&gt; item % 2 === 0);<br>//[8,2,6]</p><p>A informação que vem dentro do filter, precisa obrigatoriamente de um retorno booleano (true/false).</p><p>Por fim e não menos importante temos o find() para verificar se existe uma informação dentro do array, caso seja encontrada a mesma é retornada, caso contrário retorna undefined.</p><p>const find = arr.find(item =&gt; item === 8);<br>// 8</p><p>Mas e se tivesse mais de um item com o valor 8 ? nesse caso, o find sempre vai retornar o primeiro item encontrado.</p><p>Como vimos, com os recursos do ES6 podemos escrever códigos mais limpo e menos verboso.</p><p><strong>Referência:</strong><br><a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array">https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ebbe7e3b3bfd" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>