<?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>Forem: Gustavo Inocencio</title>
    <description>The latest articles on Forem by Gustavo Inocencio (@ino_gu).</description>
    <link>https://forem.com/ino_gu</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%2F409022%2F9efd499d-acd2-473f-9cfe-83546701aa8f.jpg</url>
      <title>Forem: Gustavo Inocencio</title>
      <link>https://forem.com/ino_gu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ino_gu"/>
    <language>en</language>
    <item>
      <title>Resolvendo problemas de integração entre interfaces com padrões de projeto</title>
      <dc:creator>Gustavo Inocencio</dc:creator>
      <pubDate>Mon, 18 Jul 2022 15:02:32 +0000</pubDate>
      <link>https://forem.com/ino_gu/resolvendo-problemas-de-integracao-entre-interfaces-com-padroes-de-projeto-1b45</link>
      <guid>https://forem.com/ino_gu/resolvendo-problemas-de-integracao-entre-interfaces-com-padroes-de-projeto-1b45</guid>
      <description>&lt;h2&gt;
  
  
  Contéudo
&lt;/h2&gt;

&lt;p&gt;Introdução&lt;br&gt;
Decorator&lt;br&gt;
Adapter&lt;br&gt;
Facade&lt;/p&gt;

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

&lt;p&gt;Sabemos ao lidar com sistemas do mundo real que um problema bastante frequente é a necessidade de integração com sistemas de terceiros. Sejam APIs para integração de um ERP, um CRM ou um sistema auxiliar para uma necessidade que os seus clientes tem.&lt;br&gt;
Com isso, nos vemos com o dilema de como fazer para integrar nossos sistemas para se comunicar com esses outros sistemas. Não há tempo, nem mesmo disposição para sempre fazer uma refatoração do sistema para se comunicar a um parceiro.&lt;br&gt;
Nesse artigo trago 3 padrões de projeto que podem ser um guia para essa necessidade.&lt;/p&gt;

&lt;p&gt;Comparativo&lt;br&gt;
Decorator: Acrescenta responsabilidades a uma interface&lt;br&gt;
Adapter: Converte uma interface para outra&lt;br&gt;
Facade: Simplifica uma interface&lt;/p&gt;

&lt;h3&gt;
  
  
  Decorator &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;O Decorator é um padrão de projeto estrutural que permite que você acople novos comportamentos para objetos ao colocá-los dentro de invólucros de objetos que contém os comportamentos.&lt;br&gt;
Comportamento típicos que podem utilizar esse padrão são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Log;&lt;/li&gt;
&lt;li&gt;Cache;
A estrutura normal do Decorator é atuar como um wrapper para o objeto desejado. 
Exemplo de implementação:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IWeatherService innerService = new WeatherService(apiKey);
            IWeatherService withLoggingDecorator = new WeatherServiceLoggingDecorator(innerService, _loggerFactory.CreateLogger&amp;lt;WeatherServiceLoggingDecorator&amp;gt;());
            IWeatherService withCachingDecorator = new WeatherServiceCachingDecorator(withLoggingDecorator, _memoryCache);
            _weatherService = withCachingDecorator;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse código é possível ver que o service &lt;em&gt;innerService&lt;/em&gt; é envolvido pelo Decorator &lt;strong&gt;&lt;em&gt;WeatherServiceLoggingDecorator&lt;/em&gt;&lt;/strong&gt; gerando o service &lt;em&gt;withLoggingDecorator&lt;/em&gt; que por sua vez é envolvido pelo Decorator &lt;strong&gt;&lt;em&gt;WeatherServiceCachingDecorator&lt;/em&gt;&lt;/strong&gt; gerando o service &lt;em&gt;withCachingDecorator&lt;/em&gt; que é o service final.&lt;br&gt;
Uma analogia bastante utilizada é comparar essa implementação com uma cebola e suas camadas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adapter &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;O Adapter é um padrão de projeto estrutural e sua motivação é fazer com que uma interface de uma classe seja convertida para outra interface de acordo com o que o cliente espera.&lt;br&gt;
Existem dois tipos de Adapters que podem ser implementados:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Object adapter - utiliza composição, onde é realizada uma implementação de uma interface&lt;/li&gt;
&lt;li&gt;Class adapter - utiliza herança, onde é realizada uma herança da classe externa&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A aplicabilidade desse padrão de projeto é ser usado quando a interface de uma biblioteca de terceiros ou algo similar não é compatível com o código atual da aplicação. Também pode ser aplicada para casos de chamadas a APIs, onde é necessária ou desejada a separação da parte do código responsável pela conversão dos dados recebidos da parte em que está a lógica de negócio do sistema. Esse padão é útil quando deseja-se utilizar várias implementações onde a estrutura é similar, mas existem diversas fontes externas (como diferentes APIs). Desse modo, todo o trabalho fica como responsabilidade da classe Adapter, separando essa camada do resto do sistema.&lt;/p&gt;

&lt;h3&gt;
  
  
  Facade&lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;O Facade é um padrão de projeto estrutural que fornece uma interface simplificada para uma biblioteca, um framework, ou qualquer conjunto complexo de classes.&lt;br&gt;
Exemplos de usos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Classe muito complexa, onde são necessários apenas alguns dos métodos dela ou que seja apresentado algo mais intuitivo para uso do outro objeto. Uma classe facade faria essa intermediação fornecendo apenas alguns métodos para simplificar a implementação do objeto cliente&lt;/li&gt;
&lt;li&gt;Várias classes com métodos necessários para o objeto cliente. Uma classe facade faria a intermediação para simplificar em apenas 1 método a ser chamado.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>patterns</category>
      <category>designpatterns</category>
    </item>
    <item>
      <title>Banco de dados AWS</title>
      <dc:creator>Gustavo Inocencio</dc:creator>
      <pubDate>Tue, 05 Jul 2022 12:12:45 +0000</pubDate>
      <link>https://forem.com/ino_gu/banco-de-dados-aws-2lk3</link>
      <guid>https://forem.com/ino_gu/banco-de-dados-aws-2lk3</guid>
      <description>&lt;p&gt;Este artigo pretende ser mais um da série de resumos para aqueles que pensam em fazer o exame de AWS Certified Cloud Practitioner. Mais informações encontram-se ao fim do artigo. O assunto desse artigo é banco de dados no AWS.&lt;/p&gt;

&lt;p&gt;A principio deve ser dito que o uso de banco de dados depende da sua necessidade. Existem diversos serviços que podem ser utilizados. Caso seja apenas um lugar para realizar o deploy do seu database, um serviço EC2 resolveria, para se ter completo controle.&lt;br&gt;
Mas caso queira um PaaS para operar e ter controle de um banco de dados, mas não quer se preocupar com sua infraestrutura, o RDS seria a sua opção. &lt;/p&gt;

&lt;p&gt;Uma última opção seriam os SaaS para ter o mínimo de manutenção,  como DynamoDB, Elasticache ou Redshift.&lt;/p&gt;

&lt;h2&gt;
  
  
  RDS
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Opere e escale um banco de dados relacional na Nuvem AWS&lt;/li&gt;
&lt;li&gt;Automatize tarefas administrativas demoradas&lt;/li&gt;
&lt;li&gt;Armazene e transmita dados de forma segura&lt;/li&gt;
&lt;li&gt;Suporta deployment entre multiplas zonas disponíveis&lt;/li&gt;
&lt;li&gt;Bancos disponíveis:

&lt;ul&gt;
&lt;li&gt;MySQL&lt;/li&gt;
&lt;li&gt;PostgresSQL&lt;/li&gt;
&lt;li&gt;MariaDB&lt;/li&gt;
&lt;li&gt;Oracle Database&lt;/li&gt;
&lt;li&gt;SQL Server&lt;/li&gt;
&lt;li&gt;Amazon Aurora &lt;/li&gt;
&lt;/ul&gt;


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

&lt;h2&gt;
  
  
  DynamoDB
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Não-relacional&lt;/li&gt;
&lt;li&gt;Saas, o que quer dizer que está pronto para uso, sem necessidade de nenhuma manutenção ou preparo de infraestrutura ou da camada do banco de dados.&lt;/li&gt;
&lt;li&gt;Fornece as opções de chave-valor ou banco de documentos&lt;/li&gt;
&lt;li&gt;Baixa latência&lt;/li&gt;
&lt;li&gt;Suporta scaling automatizado baseado na configuração&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Amazon Aurora
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Banco de dados relacional compatível com PostgreSQL e MySQL&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Elasticache
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Armazena dados de cache&lt;/li&gt;
&lt;li&gt;Baixa latência&lt;/li&gt;
&lt;li&gt;Suporta Memcached e Redis&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Redshift
&lt;/h2&gt;

&lt;p&gt;Serviço escalável  de Data warehouse que usa SQL para analisar dados estruturados e semiestruturados em data warehouses, bancos de dados operacionais e data lakes, usando hardware e machine learning projetados pela AWS para oferecer a melhor performance de preço em qualquer escala.&lt;/p&gt;

&lt;h2&gt;
  
  
  AWS Database Migration Service
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Serviço para realizar a migração dos dados locais para a nuvem&lt;/li&gt;
&lt;li&gt;Suporta migração contínua ou única de dados&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>aws</category>
      <category>devops</category>
    </item>
    <item>
      <title>Tipos de armazenamento AWS</title>
      <dc:creator>Gustavo Inocencio</dc:creator>
      <pubDate>Mon, 27 Jun 2022 20:40:31 +0000</pubDate>
      <link>https://forem.com/ino_gu/tipos-armazenamentos-aws-17cb</link>
      <guid>https://forem.com/ino_gu/tipos-armazenamentos-aws-17cb</guid>
      <description>&lt;p&gt;Este artigo pretende ser mais um da série de resumos para aqueles que pensam em fazer o exame de AWS Certified Cloud Practitioner. Mais informações encontram-se ao fim do artigo. O assunto desse artigo é armazenamento.&lt;/p&gt;

&lt;p&gt;Existem 3 tipos de armazenamento dentro do AWS.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Armazenamento em blocos&lt;/li&gt;
&lt;li&gt;Armazenamento de objetos&lt;/li&gt;
&lt;li&gt;Armazenamento de arquivos&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Armazenamento em blocos (EBS)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;No armazenamento em blocos, os arquivos são separados em partes iguais (blocos) de dados.&lt;/li&gt;
&lt;li&gt;O armazenamento em bloco é usado para aplicações executadas em instâncias do EC2.&lt;/li&gt;
&lt;li&gt;De acordo com a necessidade pode ser usado um bloco HDD-based ou SSD-based.&lt;/li&gt;
&lt;li&gt;Podem ser associados volumes EBS extras ao seu EC2 de acordo com a demanda.&lt;/li&gt;
&lt;li&gt;Pode ser criado um snapshot, um "momento", uma "fotografia" para ser armazenado e replicado esse momento do EBS em novos blocos.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Armazenamento de objetos (S3)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Cada objeto consiste em dados, metadados e uma chave&lt;/li&gt;
&lt;li&gt;Numa associação com uma biblioteca, o objeto é um livro, onde os dados são os capítulos, os metadados serão as informações do livro como nome e ISBN e a chave é a referência cadastrada desse livro.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esses objetos são armazenados no Amazon Simple Storage Service (S3). Dentro do S3 o local de armazenamento dos objetos é chamado de bucket, onde o limite de armazenamento é virtualmente ilimitado.&lt;/p&gt;

&lt;p&gt;São definidas permissões para o controle de acesso a esses objetos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Classes de armazenamento do Amazon S3
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;STANDARD: 

&lt;ul&gt;
&lt;li&gt;Acessado com grande frequência&lt;/li&gt;
&lt;li&gt;Armazenado em no mínimo três zonas de disponilidade, para replicação de informações&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;STANDARD - IA (Infrequent Access):

&lt;ul&gt;
&lt;li&gt;Acessado com pouca frequência&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;S3 One Zone - IA

&lt;ul&gt;
&lt;li&gt;Apenas em uma zona de disponibilidade&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;S3 Glacier

&lt;ul&gt;
&lt;li&gt;Baixo custo para arquivamento de dados&lt;/li&gt;
&lt;li&gt;Capaz de recuperar em alguns minutos ou horas&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;S3 Glacier Deep Archive

&lt;ul&gt;
&lt;li&gt;Menor custo para arquivamento de dados&lt;/li&gt;
&lt;li&gt;Capaz de recuperar em dentro de 12 horas&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;S3 Intelligent - Tiering

&lt;ul&gt;
&lt;li&gt;Padrão de acesso desconhecidos ou alterados&lt;/li&gt;
&lt;li&gt;Pode armazenar em acesso frequente ou infrequente&lt;/li&gt;
&lt;li&gt;Automação para definição da disponibilidade&lt;/li&gt;
&lt;/ul&gt;


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

&lt;h2&gt;
  
  
  Armazenamento de arquivos (EFS)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Armazenamento dados em sistema de arquivos escalável&lt;/li&gt;
&lt;li&gt;Aumenta e diminui automaticamente conforme você adiciona e remove arquivos, sem a necessidade de gerenciamento ou provisionamento.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mais informações: &lt;br&gt;
&lt;a href="https://aws.amazon.com/pt/ebs/"&gt;https://aws.amazon.com/pt/ebs/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://aws.amazon.com/pt/s3/storage-classes/"&gt;https://aws.amazon.com/pt/s3/storage-classes/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://aws.amazon.com/pt/efs/"&gt;https://aws.amazon.com/pt/efs/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>devops</category>
    </item>
    <item>
      <title>Standard Queues vs FIFO Queues no AWS SQS</title>
      <dc:creator>Gustavo Inocencio</dc:creator>
      <pubDate>Wed, 22 Jun 2022 14:51:40 +0000</pubDate>
      <link>https://forem.com/ino_gu/standard-queues-vs-fifo-queues-no-aws-sqs-28i2</link>
      <guid>https://forem.com/ino_gu/standard-queues-vs-fifo-queues-no-aws-sqs-28i2</guid>
      <description>&lt;p&gt;Este artigo pretende ser mais um da série de resumos para aqueles que pensam em fazer o exame de AWS Certified Cloud Practitioner. Mais informações encontram-se ao fim do artigo. O assunto desse artigo é Mensageria no AWS.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Introdução&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Amazon SQS(Simple Queue Service) é um serviço de mensageria oferecido pela AWS com o objetivo de permitir, numa arquitetura de microsserviços, o desenvolvedor a dissociar os componentes do seu aplicativo para que eles possam funcionar e falhar de forma independente.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Vantagens de seu uso:&lt;/strong&gt;
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Libera o desenvolvedor do trabalho de gerenciar seu próprio sistema de fila de mensagens;&lt;/li&gt;
&lt;li&gt;Permite o envio, recebimento e armazenamento de mensagens entre componentes&lt;/li&gt;
&lt;li&gt;Aumenta a tolerância a falhas do seu aplicativo.&lt;/li&gt;
&lt;li&gt;Permite o compartilhamento de dados confidenciais entre componentes usando criptografia&lt;/li&gt;
&lt;li&gt;Dimensiona com eficiência à medida que seu aplicativo cresce&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Tipos de filas
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;Standard Queue &lt;/li&gt;
&lt;li&gt;FIFO Queue&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A Standard Queue é o tipo de fila padrão oferecido pelo AWS SQS. Suas características são: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Número quase ilimitado de transações por segundo por chamada de API&lt;/li&gt;
&lt;li&gt;Best-effort ordering, em outras palavras tentativa de sempre entregar as mensagens na ordem em que foram recebidas, porém pode ocasionalmente enviar mais de uma cópia da mensagem enviado fora de ordem&lt;/li&gt;
&lt;li&gt;Garantia de que a entrega da mensagem ocorrerá pelo menos uma vez.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Já a FIFO Queue (first in first out) é um tipo mais aprimorado de fila. Suas características são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Limitadas a 300 transações por segundo por chamada de API sem lote e 3000 mensagens com lote (quando você agrupa 10 mensagens (máximo) por operação)&lt;/li&gt;
&lt;li&gt;Garantia de entrega das mensagens na ordem recebida&lt;/li&gt;
&lt;li&gt;Garantia de que a entrega da mensagem ocorrerá apenas uma vez e permanecerá disponível até que um consumidor a processe e a exclua. Duplicatas não são introduzidas na fila&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Os casos de uso ideais para cada um dos tipos são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Standard: Casos em seja mais importante a quantidade de transações por chamada de API do que a entrega na ordem e a ausência de duplicatas &lt;/li&gt;
&lt;li&gt;FIFO: Casos em que seja extremamente importante a entrega na ordem e a ausência de duplicatas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mais informações:&lt;br&gt;
&lt;a href="https://aws.amazon.com/pt/sqs/"&gt;https://aws.amazon.com/pt/sqs/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>sqs</category>
    </item>
    <item>
      <title>Entendendo SOLID</title>
      <dc:creator>Gustavo Inocencio</dc:creator>
      <pubDate>Sat, 11 Sep 2021 10:21:31 +0000</pubDate>
      <link>https://forem.com/ino_gu/entendendo-solid-27e4</link>
      <guid>https://forem.com/ino_gu/entendendo-solid-27e4</guid>
      <description>&lt;p&gt;SOLID é o acrônimo para 5 princípios, criado por Uncle Bob e útil para tornar sistemas mais fáceis de manter e estender.&lt;/p&gt;

&lt;p&gt;Abaixo estão os 5 princípios que formam o acrônimo em inglês.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contéudo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;S&lt;/strong&gt;ingle Responsibility - Responsabilidade única&lt;br&gt;
&lt;strong&gt;O&lt;/strong&gt;pen/Closed - Aberto/Fechado&lt;br&gt;
&lt;strong&gt;L&lt;/strong&gt;iskov Substitution - Substituição Liskov&lt;br&gt;
&lt;strong&gt;I&lt;/strong&gt;nterface Segregation - Segregação de Interface&lt;br&gt;
&lt;strong&gt;D&lt;/strong&gt;ependency Inversion - Inversão de Dependência&lt;/p&gt;
&lt;h3&gt;
  
  
  Single Responsibility &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Este princípio declara que uma classe deve ter apenas uma responsabilidade. Sendo mais claro e levando para a prática, a classe deve ter apenas um motivo para mudar.&lt;/p&gt;

&lt;p&gt;O princípio da responsabilidade única é um dos mais importantes, porque é a base para outros princípios e padrões abordando temas como acoplamento e coesão. Menos responsabilidades numa classe geram menos dependências.&lt;/p&gt;

&lt;p&gt;Por exemplo, na classe abaixo. Vê-se que a classe Livro tem responsabilidades ligadas as propriedades do livro, mas também um método para imprimir a página.&lt;br&gt;
&lt;/p&gt;

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

    function getTitulo() {
        return "Mundo Sem Fim";
    }

    function getAutor() {
        return "John Doe";
    }

    function virarPagina() {
        // pointer to next page
    }

    function imprimirPaginaAtual() {
        println("Contéudo da Página atual");
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para aplicar o princípio nesse exemplo deveria ficar assim:&lt;br&gt;
&lt;/p&gt;

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

    function getTitulo() {
        return "Mundo Sem Fim";
    }

    function getAutor() {
        return "John Doe";
    }

    function virarPagina() {
        // pointer to next page
    }

    function getPaginaAtual() {
        return "contéudo pagina atual";
    }
}

interface Impressao {

    function imprimirPagina(pagina);
}

class ImpressaoConsole implements Impressao {

    function imprimirPagina(pagina){
        console.log(pagina);
    }

}

class ImpressaoHtml implements Printer {

    function imprimirPagina(pagina){
        &amp;lt;div style="single-page"&amp;gt; {pagina} &amp;lt;/div&amp;gt;;
    }

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

&lt;/div&gt;



&lt;p&gt;Desse modo, a responsabilidade de impressão fica exclusiva em uma interface e pode-se estender o sistema criando novas implementações dessa interface.&lt;/p&gt;

&lt;h3&gt;
  
  
  Open/Closed &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Esse princípio declara que classes devem ser fechadas para alteração e abertas para extensão, ou seja, não deve-se alterar classes para adicionar novas implementações. É claro que, para correção de bugs, a alteração de classes é permitida, mas para adicionar novas propriedades ou novos métodos não.&lt;/p&gt;

&lt;p&gt;Como exemplo veja essa classe:&lt;br&gt;
&lt;/p&gt;

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

    function abrirLivro(){
        // abrindo livro
    }

    function realizarAnotacoes(){
        // realizando anotações
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para um livro em papel seria normal, mas imagine se o sistema deve começar a considerar também livro digital:&lt;br&gt;
&lt;/p&gt;

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

    function abrirLivro(){
        if(livroEmPapel)  
          // abrindo livro em papel
        else if(livroDigital)
          // abrindo livro digital
    }

    function realizarAnotacoes(){
        if(livroEmPapel)  
          // realizando anotações em livro em papel
        else if(livroDigital)
          // realizando anotações em livro digital
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A chance de esse if quebrar a aplicação é grande.&lt;br&gt;
Para isso, pode-se utilizar uma interface e extende-la para as próximas demandas:&lt;br&gt;
&lt;/p&gt;

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

    function abrirLivro(){
        // abrindo livro
    }

    function realizarAnotacoes(){
        // realizando anotações
    }
}

class LivroEmPapel extends Livro {

    function abrirLivro(){
        // abrindo livro
    }

    function realizarAnotacoes(){
        // realizando anotações
    }
}

class LivroDigital extends Livro {

    function abrirLivro(){
        // abrindo livro
    }

    function realizarAnotacoes(){
        // realizando anotações
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Desse modo, a cada nova implementação não há o risco de quebrar a aplicação que já estava funcionando.&lt;/p&gt;

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

&lt;p&gt;Esse princípio foi introduzido por Barbara Liskov e diz que havendo uma classe filha B derivada de uma outra classe pai A, deveria ser possível trocar a classe B pela classe A sem prejuízos a aplicação.&lt;br&gt;
Um exemplo de um problema que quebra esse princípio seria o seguinte:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interface Funcionario() {
     private string Nome;
     private string Cargo;

     function remunera() {
     } 
}

class ContratoClt extends Funcionario {
     function remunera() {
        //remunera como CLT
     } 
}

class ContratoPJ extends Funcionario {
     function remunera() {
        //remunera como PJ
     } 
}

class ContratoEstagio extends Funcionario {
     function remunera() {
        //remunera como Estagiario
     } 
}

class Voluntario extends Funcionario {
     function remunera() {
        //não remunera???
     } 
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No exemplo anterior, a classe Voluntário não implementa a função remunera, o que pode ser um problema de compatibilidade com sua interface. Para resolver esse problema pode-se utilizar o próximo princípio, a Segregação de Interfaces, tornando interfaces menores e mais específicas para serem estendidas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Interface Segregation &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;O princípio de segregação de Interface serve para definirmos várias interfaces menores para que as classes que  implementam uma das interfaces só tenham que se preocupar com métodos que realmente as interessam.&lt;/p&gt;

&lt;p&gt;Voltando ao exemplo anterior:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interface FuncionarioPago() {
     private string Nome;
     private string Cargo;

     function remunera() {
     } 
}

interface FuncionarioNaoPago() {
     private string Nome;
     private string Cargo;
}


class ContratoClt extends Funcionario {
     function remunera() {
        //remunera como CLT
     } 
}

class ContratoPJ extends Funcionario {
     function remunera() {
        //remunera como PJ
     } 
}

class ContratoEstagio extends Funcionario {
     function remunera() {
        //remunera como Estagiario
     } 
}

class Voluntario extends FuncionarioNaoPago {

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

&lt;/div&gt;



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

&lt;p&gt;De acordo com Uncle Bob, esse princípio pode ser definido da seguinte forma:&lt;br&gt;
&lt;em&gt;1. Módulos de alto nível não devem depender de módulos de baixo nível. Ambos devem depender da abstração.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;2. Abstrações não devem depender de detalhes. Detalhes devem depender de abstrações.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Na prática, o exemplo abaixo mostra o problema:&lt;br&gt;
&lt;/p&gt;

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

    private final Keyboard keyboard;
    private final Monitor monitor;

    public WindowsMachine() {
        monitor = new Monitor();
        keyboard = new Keyboard();
    }

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

&lt;/div&gt;



&lt;p&gt;Com a implementação, criando um novo Monitor e um novo teclado estamos deixando o acoplamento entre essas classes alto. Uma mudança em uma delas pode quebrar o sistema.&lt;/p&gt;

&lt;p&gt;Para resolver isso, podemos fazer da seguinte maneira, utilizando Injeção de Dependência:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class WindowsMachine {
    private final Keyboard keyboard;
    private final Monitor monitor;

    public WindowsMachine(Monitor monitor, Keyboard keyboard) 
    {
        this.monitor = monitor;
        this.keyboard = keyboard;
    }

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

&lt;/div&gt;



&lt;p&gt;Dessa forma desacoplamos o Keyboard e o Monitor do WindowsMachine, criando uma abstração onde qualquer monitor ou teclado passado por parâmetro possa ser acionado. Assim, não é necessário se preocupar em como criar esses dispositivos nessa classe. Preocupa-se apenas em utilizar o que foi recebido. &lt;/p&gt;

</description>
      <category>solid</category>
      <category>patterns</category>
    </item>
    <item>
      <title>Utilizando useContext no React</title>
      <dc:creator>Gustavo Inocencio</dc:creator>
      <pubDate>Sun, 05 Sep 2021 16:22:22 +0000</pubDate>
      <link>https://forem.com/ino_gu/utilizando-usecontext-no-react-4lh9</link>
      <guid>https://forem.com/ino_gu/utilizando-usecontext-no-react-4lh9</guid>
      <description>&lt;p&gt;Mais um padrão essencial a ser empregado em projetos React, especialmente se você tem propriedades comuns que deseja reutilizar em seus componentes, e acaba escrevendo muitos props duplicados, é usar o React Context.&lt;/p&gt;

&lt;p&gt;Por exemplo, se queremos compartilhar dados do usuário entre vários componentes, em vez de utilizar vários props repetidos (props drilling), poderíamos usar o recurso de contexto que está embutido na biblioteca React.&lt;/p&gt;

&lt;p&gt;Primeiramente, temos que criar um contexto com React.createContext(). No caso abaixo a referência desse contexto é o UserContext:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const UserContext = React.createContext();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois deve-se envolver o App inteiro em um provider (Para esse exemplo foi envolvido o App inteiro, mas se for o caso de apenas um componente consumir o recurso pode ser envolvido apenas o componente):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    const user = {name: 'Gustavo'} 

    &amp;lt;UserContext.Provider value={user}&amp;gt;
        &amp;lt;App /&amp;gt;          
    &amp;lt;/UserContext.Provider&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No código acima o recurso compartilhado é um objeto user. Para compartilhar um recurso basta que seja atribuído ao atributo &lt;em&gt;value&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Em seguida, podemos consumir esse contexto em nossos componentes individuais utilizando o hook &lt;code&gt;useContext&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  const user = useContext(UserContext);
  return &amp;lt;div&amp;gt;Olá, {user.name} &amp;lt;/div&amp;gt;;
 );
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Concluindo, essa é uma forma de tornar o seu código mais limpo evitando a necessidade de utilizar várias e várias props.&lt;/p&gt;

&lt;p&gt;Referências:&lt;br&gt;
&lt;a href="https://pt-br.reactjs.org/docs/hooks-reference.html#usecontext"&gt;https://pt-br.reactjs.org/docs/hooks-reference.html#usecontext&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>hooks</category>
      <category>usecontext</category>
    </item>
    <item>
      <title>Pontos sobre orientação a objeto em Delphi</title>
      <dc:creator>Gustavo Inocencio</dc:creator>
      <pubDate>Wed, 21 Apr 2021 18:04:32 +0000</pubDate>
      <link>https://forem.com/ino_gu/pontos-sobre-orientacao-a-objeto-em-delphi-3gia</link>
      <guid>https://forem.com/ino_gu/pontos-sobre-orientacao-a-objeto-em-delphi-3gia</guid>
      <description>&lt;p&gt;Abaixo segue alguns pontos úteis em relação ao Delphi.&lt;br&gt;
Mas como o Delphi, derivado do Pascal é uma boa linguagem para aprender o básico de OOP, os pontos podem ser transportados para outras linguagens:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Interface é o segredo para alta coesão;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Em Delphi, o assigned só enxerga o ponteiro. Por isso quando ocorre Free ele acha que ainda existe o objeto instanciado. Pois o Free só apaga o objeto, mas não o Ponteiro. Nil por sua vez só apaga o ponteiro, mas o objeto permanece, ai tem leak de memória. Usar FreeAndNil.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sobrecarga (overload): os métodos de uma mesma classe devem ter assinaturas diferentes. (Números diferentes de parâmetros ou parâmetros de tipos diferentes)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Para fazer sobreescrita, deve utilizar palavra reservada virtual no método da classe pai e palavra reservada override nas filhas. Se alguma não tiver override é executada a sua rotina.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Métodos no delphi por padrão são estáticos&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Caso não seja definido o escopo de visibilidade é publica por padrão&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;RTTI lê qualquer escopo de visibilidade a partir do delphi 2010. Antes era apenas escopo PUBLISHED&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Classes amigas são duas classes declaradas na mesma unit e que conseguem acessar as propriedades e métodos privados e protegidos uma da outra.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;strict private&lt;/em&gt;:&lt;br&gt;
só a própria classe acessa seus métodos e propriedades. Nem a classe amiga consegue acessar&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;strict protected&lt;/em&gt;:&lt;br&gt;
só a própria classe ou sua herdada acessa seus métodos e propriedades. Nem a classe amiga consegue acessar&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Encapsulamento: a mágica está no que o seu objeto pode ver. Quanto menos melhor, porque o objetivo é baixo acoplamento. Porque caso seja necessário mudança será menos dolorosa. Proteger o que varia. Fugir do Ctrl+C e Ctrl+V. Se vai copiar, encapsula e usa nos vários lugares&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Associação é um canal de comunicação entre os objetos. &lt;br&gt;
A herança é um tipo de associação vertical&lt;br&gt;
Existe a possibilidade da associação horizontal&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;4 tipos de associação:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simples&lt;/li&gt;
&lt;li&gt;Agregação&lt;/li&gt;
&lt;li&gt;Composição&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Herança&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Associação simples é um objeto fazendo uso do outro, mas não necessariamente para criar uma estrutura maior.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Agregação e composição fazem uma relação todo-parte. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Na agregação a parte é um objeto independente. Pode viver fora do todo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Na composição a parte é um objeto dependente do todo. Não pode viver fora do todo. &lt;br&gt;
 &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No diagrama, o diamante (vazado na agregação e cheio na composição) fica no lado do todo&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ex: Todo-&amp;gt; reunião&lt;br&gt;
    Parte -&amp;gt; sala &lt;br&gt;
(Agregação)&lt;br&gt;
             &lt;br&gt;
pauta = Composição&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Composição: no construtor do todo vc constrói as partes. No destrutor vc destrói todas as partes. (Property)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Agregação: nem sempre é necessário criar as partes. Normalmente o objeto já vem pronto. (Listas de objeto)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Construtor de TObject é estático. Nunca sobreescreva (override)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Destrutor de Tobject é dinâmico. Sempre sobreescreva (override)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Coesão: uma classe, uma responsabilidade&lt;br&gt;
Buscar a eficácia e não apenas a eficiência. Não adianta ser bonito se não traz o resultado &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Formulário é uma classe e só serve pra apresentação&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Camada de apresentação não deve ter regras de negócio&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Acoplamento é a dependência entre as classes&lt;br&gt;
Baixo acoplamento significa não ter um problema, um efeito colateral quando é realizada uma mudança&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Arquitetura baseada em abstração:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Coesão: Camadas claramente definidas;&lt;/li&gt;
&lt;li&gt;Interfaces formais e explicitas entre as camadas&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Detalhes ocultos e protegidos dentro de cada camada. (Encapsulamento)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Interface: Declara o quê (cabeçalho)&lt;br&gt;
define o que vai ser feito&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Declaração com regras do que vai ser feito&lt;/p&gt;

&lt;p&gt;Contrato de uma grande obra&lt;/p&gt;

&lt;p&gt;Não tem field em interface, tem que declarar get e set quando declara uma propriedade&lt;/p&gt;

&lt;p&gt;Interface que não herda de ninguém está herdando de IInterface&lt;/p&gt;

&lt;p&gt;Interface não tem escopo de visibilidade&lt;br&gt;
Todos os métodos e propriedades são públicos&lt;/p&gt;

&lt;p&gt;Toda interface tem que ser assinada com um GUID&lt;/p&gt;

&lt;p&gt;Classe concreta define o como vai ser feito&lt;/p&gt;

&lt;p&gt;Padrões de Projeto:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Criacionais
Resolver problemas de criação de objetos
 * Singleton
 * Factory
 * Builder&lt;/li&gt;
&lt;li&gt;Comportamentais&lt;/li&gt;
&lt;li&gt;Estruturais&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Padrão Observer:&lt;br&gt;
1 observado para 1 ou vários observadores&lt;br&gt;
O observado não muda nada do observador. Dá só uma notificação e o observador decide o que faz com aquilo, porque cada observador pode fazer algo diferente.&lt;br&gt;
Observado:&lt;br&gt;
Attach&lt;br&gt;
Detach&lt;br&gt;
Notify&lt;/p&gt;

&lt;p&gt;Observador:&lt;br&gt;
Update&lt;/p&gt;

&lt;p&gt;MVC não tem persistência. É outra coisa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Model: tem métodos e propriedades&lt;/li&gt;
&lt;li&gt;View: camada de apresentação onde estão as interações com usuário&lt;/li&gt;
&lt;li&gt;Controller: fica no meio do caminho fazendo a ligação do view e model&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;DAO:&lt;/p&gt;

&lt;p&gt;Resolver impedância entre objeto e SQL&lt;br&gt;
DAOConnection Camada que gerencia a conexão&lt;br&gt;
DAO Camada que converte o modelo para instrução SQL (ou txt......)&lt;br&gt;
Uma classe de negócio, uma classe de persistência&lt;/p&gt;

&lt;p&gt;RTTI é capacidade de extrair informações do objeto em tempo de execução&lt;/p&gt;

&lt;p&gt;Criar uma rotina para diversas situações para ser usada de acordo com as informações que são extraídas do objeto &lt;/p&gt;

&lt;p&gt;Uma classe para cada informação que se quer extrair. Fields, properties....&lt;/p&gt;

&lt;p&gt;Todos são arrays dinâmicos. Uso de for in&lt;/p&gt;

&lt;p&gt;Atributos customizados:&lt;br&gt;
Informações adicionais do objeto sem alterar o objeto&lt;br&gt;
declara entre colchetes  []  em cima do elemento a ser atribuida a informação&lt;/p&gt;

</description>
      <category>oop</category>
    </item>
    <item>
      <title>Uso do Styled Components no React</title>
      <dc:creator>Gustavo Inocencio</dc:creator>
      <pubDate>Wed, 14 Apr 2021 14:05:03 +0000</pubDate>
      <link>https://forem.com/ino_gu/uso-do-styled-components-no-react-37i1</link>
      <guid>https://forem.com/ino_gu/uso-do-styled-components-no-react-37i1</guid>
      <description>&lt;p&gt;Na implementação de estilos para sua página o desenvolvedor tem a mão várias formas de incluir estilos. Desde o velho CSS até o uso de pré-processadores como Sass.&lt;/p&gt;

&lt;p&gt;Ultimamente uma forma de inclusão de estilos que vem se destacando é a &lt;strong&gt;CSS-in-JS&lt;/strong&gt;. Considerando a utilização de componentização em JavaScript, visando a reutilização dos mesmos componentes em diversas telas economizando tempo de desenvolvimento e a criação de soluções seguindo um design estabelecido para o sistema inteiro, o uso de CSS dentro de um componente Javascript pode ajudar nessa demanda.&lt;/p&gt;

&lt;p&gt;Além disso, já é conhecido dos desenvolvedores que a colisão de estilos é um obstáculo que ocorre bastante nos projetos. Ela acontece quando você estiliza uma tag sem o uso de classes ou cria classes com os mesmos nomes para estilizar seus elementos.&lt;/p&gt;

&lt;p&gt;E isso aumenta o uso de &lt;em&gt;!important&lt;/em&gt;, uma manobra que pode ser traiçoeira ao realizar a manutenção do sistema depois, já que pode acabar fazendo necessário o uso de outro &lt;em&gt;!important&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Utilizando o CSS-in-JS esse problema não ocorre.&lt;/p&gt;

&lt;p&gt;Explorando um pouco do universo de CSS-in-JS, existem algumas libs mais conhecidas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.styled-components.com/"&gt;styled-components&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://emotion.sh/docs/introduction"&gt;Emotion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cssinjs.org/"&gt;JSS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O &lt;strong&gt;Styled Components&lt;/strong&gt;, objeto de análise desse artigo, foi desenvolvido para que o desenvolvedor tenha uma maneira mais fácil de lidar com CSS nos componentes de aplicações React.&lt;/p&gt;

&lt;p&gt;As vantagens presentes na lib são:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Critical CSS Automático&lt;/strong&gt;: Os componentes são renderizados e  injetam apenas seus estilos contribuindo para uma menor quantidade de código para o usuário final.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sem colisão de classes&lt;/strong&gt;: O styled-components fornece nomes de classes a prova de colisão. Nada mais de quebrar a cabeça só porque precisa mudar a posição ou cor de um objeto. Além disso, tudo que você precisa vai estar no próprio contexto do componente, facilitando o desenvolvimento.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Uso apenas do CSS necessário&lt;/strong&gt;: Funcionando diretamente nos componentes, ajuda a diminuir o código final, pois o que não é necessário pode ser removido.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Estilo dinâmico simples&lt;/strong&gt;: Adaptando os estilos baseando nas props recebidas, é possível criar estilos dinâmicos de forma fácil e intuitiva.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vendor prefixing automático&lt;/strong&gt;: Você escreve seu CSS no melhor padrão do mercado e pronto, os componentes cuidam para fornecer suporte para browsers antigos.&lt;/p&gt;

&lt;p&gt;Exemplo de uso:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1XjSF7NL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bprosmewk80adcunjw1z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1XjSF7NL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bprosmewk80adcunjw1z.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Testes de unidade em JavaScript</title>
      <dc:creator>Gustavo Inocencio</dc:creator>
      <pubDate>Tue, 06 Apr 2021 13:42:52 +0000</pubDate>
      <link>https://forem.com/ino_gu/testes-de-unidade-em-javascript-5h98</link>
      <guid>https://forem.com/ino_gu/testes-de-unidade-em-javascript-5h98</guid>
      <description>&lt;p&gt;O teste de unidade &lt;em&gt;ou teste unitário&lt;/em&gt; em JavaScript é um método de teste no qual é testado um código JavaScript escrito para uma página web ou módulo de aplicativo web. Cada um dos testes de unidade servem para testar uma certa funcionalidade. Esses testes são então organizados em suítes de testes.&lt;/p&gt;

&lt;p&gt;Cada suíte contém uma série de testes projetados a serem executados para um módulo separado. Eles não devem entrar em conflito com nenhum outro módulo e não devem ter muitas dependências entre si.&lt;/p&gt;

&lt;p&gt;Para evitar desafios no momento de realizar testes de unidade as seguintes diretrizes são úteis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Não use variáveis ​​globais&lt;/li&gt;
&lt;li&gt;Não manipule objetos predefinidos&lt;/li&gt;
&lt;li&gt;Escreva funcionalidades core baseadas em bibliotecas&lt;/li&gt;
&lt;li&gt;Tente criar pequenas funcionalidades com menos dependências&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Melhores frameworks de teste de unidade de JavaScript&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://unitjs.com/"&gt;Unit.js&lt;/a&gt;: é conhecido como uma biblioteca de asserção de código aberto em execução no navegador e Node.js. É extremamente compatível com outra estrutura de teste de unidade de JavaScript como Mocha, Karma, Jasmine, QUnit, Protractor, etc. Fornece a API documentada completa da lista de asserções&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://qunitjs.com/"&gt;QUnit&lt;/a&gt;: é usado para testes de unidade de JavaScript do lado do cliente e do lado do servidor. Este framework gratuito de teste JavaScript é usado para projetos jQuery. Ele segue a espeficação de teste de unidade da CommonJS.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://jasmine.github.io/"&gt;Jasmine&lt;/a&gt;: Jasmine é o framework de desenvolvimento orientado a comportamento para testar código JavaScript. É usado para testar código tanto síncrono como assíncrono. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://karma-runner.github.io/2.0/index.html"&gt;Karma&lt;/a&gt;: Karma é um ambiente open source de testes. Controle fácil do fluxo de trabalho executando na linha de comando. Oferece a liberdade de escrever testes com Jasmine, Mocha e QUnit. Você pode rodar os testes em dispositivos reais com um debbugging fácil.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://mochajs.org/"&gt;Mocha&lt;/a&gt;: Mocha é executado em Node.js e no navegador. O Mocha realiza testes assíncronos de uma maneira mais simples. Fornece precisão e flexibilidade nos relatórios. Fornece um bom suporte de features como test-specific timeouts, JavaScript APIs etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://jestjs.io/"&gt;Jest&lt;/a&gt;: Jest é usado pelo Facebook até agora para testar todo o código JavaScript. Ele fornece a experiência de teste de 'configuração zero'. Suporta teste de execução independente e sem interrupção, evitando qualquer conflito. Não requer nenhuma outra configuração de instalação e outras bibliotecas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/avajs"&gt;AVA&lt;/a&gt;: AVA é um framework de teste de unidade JavaScript simples. Os testes são executados em paralelo e em série. Os testes paralelos são executados sem interromper um ao outro. AVA também oferece suporte a testes assíncronos. AVA usa subprocessos para executar o teste de unidade.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Conclusão&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Você deve sempre manter três coisas em mente ao realizar o teste:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;O recurso que precisa ser testado; &lt;/li&gt;
&lt;li&gt;A saída desejada para o teste;&lt;/li&gt;
&lt;li&gt;A saída retornada no teste; &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Os frameworks mencionados acima ajudam nessa tarefa, mas para facilitar seu trabalho sempre faça a implementação do código de modo a tornar fácil de ser garantido a sua eficácia.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>testdev</category>
      <category>ptbr</category>
    </item>
    <item>
      <title>Serialização e Deserialização utilizando ES6</title>
      <dc:creator>Gustavo Inocencio</dc:creator>
      <pubDate>Wed, 31 Mar 2021 01:57:10 +0000</pubDate>
      <link>https://forem.com/ino_gu/serializacao-e-deserializacao-utilizando-es6-4h81</link>
      <guid>https://forem.com/ino_gu/serializacao-e-deserializacao-utilizando-es6-4h81</guid>
      <description>&lt;p&gt;Pra começar, explicando o JSON:&lt;br&gt;
&lt;strong&gt;JSON&lt;/strong&gt; é um formato para distribuição de dados “pela rede” e pode ser facilmente compreendido e gerado tanto por humanos quanto por computadores.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Serialização&lt;/strong&gt;&lt;br&gt;
Serialização é um processo em que um formato de dados é traduzido para um outro formato de dados (JSON) para ser facilmente distribuído.&lt;br&gt;
O reverso da serialização é a deserialização, em que se transforma um formato de dados recebido em sua forma original, para que possa manipulá-lo e usá-lo no aplicativo.&lt;/p&gt;

&lt;p&gt;Um exemplo de serialização é o a seguir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let person = {  
  name: 'Atena',  
  age: 33
}; 
const serialized =   JSON.stringify(person); 
console.log(serialized); // {"name":"Atena","age":33}  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para realizar a deserialização deve-se usar &lt;em&gt;JSON.parse&lt;/em&gt; como demonstrado a seguir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  const storedItem = sessionStorage.getItem(MENUS_DOCS);
  if (storedItem) itemParsed = JSON.parse(storedItem);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O objetivo desse artigo foi ser um resumo rápido para quem precisar realizar  a serialização.&lt;br&gt;&lt;br&gt;
Mais informações podem ser consultadas em:&lt;br&gt;
&lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify"&gt;https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse"&gt;https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse&lt;/a&gt;&lt;/p&gt;

</description>
      <category>es6</category>
      <category>javascript</category>
      <category>ptbr</category>
    </item>
    <item>
      <title>Lei de Demeter</title>
      <dc:creator>Gustavo Inocencio</dc:creator>
      <pubDate>Wed, 24 Mar 2021 19:44:39 +0000</pubDate>
      <link>https://forem.com/ino_gu/lei-de-demeter-4ldf</link>
      <guid>https://forem.com/ino_gu/lei-de-demeter-4ldf</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;A Lei de Demeter ou principio do conhecimento minimo é uma diretriz de desenvolvimento de software, particularmente de sistemas que utilizam a programação orientada a objetos.&lt;br&gt;
— Wikipedia&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Esta lei foi proposta por Ian Holland em 1987. Holland e seus colegas estavam programando um sistema chamado Demeter usando programação orientada a objetos. Durante o desenvolvimento do sistema, eles perceberam que o código que atendia a uma série de regras era menos acoplado.&lt;/p&gt;

&lt;p&gt;A Lei de Demeter exige que um método m de um objeto O só pode invocar os métodos dos seguintes tipos de objetos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O próprio.&lt;/li&gt;
&lt;li&gt;parâmetros de m.&lt;/li&gt;
&lt;li&gt;Quaisquer objetos criados / instanciados em m.&lt;/li&gt;
&lt;li&gt;Objetos componentes diretos de O.&lt;/li&gt;
&lt;li&gt;Uma variável global, acessível por O, no escopo de m.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Em resumo, todas as regras acima podem ser resumidas dizendo que você deve evitar invocar métodos de um objeto retornado por outro método. Em linguagens orientadas a objetos modernas, o identificador usado é ponto ou -&amp;gt;. Portanto, a lei de Demeter é violada quando o código tem mais de uma etapa entre as classes. &lt;/p&gt;

&lt;p&gt;Um exemplo de código em que a lei de Demeter é violada é apresentado a seguir:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;const data = cliente.ultimoPedido.dadosPedido.dataEmissao&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Nesse caso é conhecido a estrutura interna do objeto ultimoPedido. O problema nisso é que em uma modificação da classe ultimoPedido, as propriedades podem não existir mais e assim ocorrerá uma quebra no sistema, um chamado a uma propriedade nula.&lt;/p&gt;

&lt;p&gt;Nesse caso o ideal é que seja feito na classe ultimoPedido um getDataEmissao para ser usado em outras classes.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;const data = ultimoPedido.getDataEmissao()&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Assim, mesmo que se modifique a classe ultimoPedido o método ainda existe e vai retornar a informação necessária.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Principais Vantagens&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dependências entre classes e acoplamento são reduzidas.&lt;/li&gt;
&lt;li&gt;Classes podem ser reutilizadas com facilidade.&lt;/li&gt;
&lt;li&gt;Código é mais fácil de testar.&lt;/li&gt;
&lt;li&gt;Código é mais fácil de manter e flexível para mudanças.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>oop</category>
      <category>ptbr</category>
    </item>
    <item>
      <title>Uso de Promises</title>
      <dc:creator>Gustavo Inocencio</dc:creator>
      <pubDate>Wed, 17 Mar 2021 19:20:04 +0000</pubDate>
      <link>https://forem.com/ino_gu/uso-de-promises-53o2</link>
      <guid>https://forem.com/ino_gu/uso-de-promises-53o2</guid>
      <description>&lt;p&gt;Na programação assíncrona um recurso bastante utilizado é o de Promises, já que sempre queremos que nossas operações e nosso código rodem o mais rápido possível,&lt;br&gt;
assim um recurso que nos permite paralelizar o máximo de ações é extremamente útil.&lt;/p&gt;

&lt;p&gt;A estrutura de uma Promise é a seguinte:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Criando uma promise
const p = new Promise((resolve, reject) =&amp;gt; {
  try {
    resolve(funcaoX())
  } catch (e) {
    reject(e)
  }
})

// Executando uma promise
p
  .then((parametros) =&amp;gt; /* sucesso */)
  .catch((erro) =&amp;gt; /* erro */)

// Tratando erros e sucessos no then
p
  .then(resposta =&amp;gt; { /* tratar resposta */ }, erro =&amp;gt; { /* tratar erro */ })
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse artigo citarei algumas funcionalidades de Promises quando existe a necessidade de executar mais de uma. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Promise.race&lt;/strong&gt;: &lt;em&gt;executa a mais rápida&lt;/em&gt; &lt;br&gt;
Nessa funcionalidade todas as promises iniciam a execução ao mesmo tempo, mas apenas a primeira a ser resolvida tem seu valor retornado.&lt;br&gt;
Essa funcionalidade permite que sejam utilizados mais de uma fonte para a informação buscada e assim ter a mais rápida do momento. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Promise.all&lt;/strong&gt;: &lt;em&gt;executa todas&lt;/em&gt;&lt;br&gt;
Nessa funcionalidade todas as promises iniciam a execução ao mesmo tempo e vão sendo resolvidas.&lt;br&gt;
O problema dessa funcionalidade é que se uma das promises for rejeitada todas são rejeitadas. Essa funcionalidade pode ser usada quando existem várias consultas a APIs diferentes a serem feitas para uma mesma tela e todas as informações precisam ser mostradas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Promise.allsettled&lt;/strong&gt;: &lt;em&gt;executa todas, mesmo que falhe e retorna a informação de cada uma se falhou ou não&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;Assim como Promise.all, nessa funcionalidade todas as promises iniciam a execução ao mesmo tempo e vão sendo resolvidas.&lt;br&gt;
Mas se uma das promises for rejeitada as outras ainda são resolvidas. Essa funcionalidade pode ser usada quando existem várias consultas a APIs diferentes a serem feitas para uma mesma tela, mas para componentes diferentes. Por exemplo, um dashboard. Assim, se uma das informações não for trazida, as outras ainda podem ser apresentadas.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Mais informações sobre Promises podem ser encontradas em:&lt;br&gt;
&lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Promise"&gt;https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Promise&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>promises</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
