<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Vitor Freitas</title>
    <description>The latest articles on DEV Community by Vitor Freitas (@vitorfreitas).</description>
    <link>https://dev.to/vitorfreitas</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%2F227404%2F88dfa227-f177-4563-ac48-1b4d02b4a7ca.jpeg</url>
      <title>DEV Community: Vitor Freitas</title>
      <link>https://dev.to/vitorfreitas</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vitorfreitas"/>
    <language>en</language>
    <item>
      <title>Formatting currencies with Intl.NumberFormat</title>
      <dc:creator>Vitor Freitas</dc:creator>
      <pubDate>Thu, 02 Jul 2020 23:23:11 +0000</pubDate>
      <link>https://dev.to/vitorfreitas/formatting-currencies-with-intl-numberformat-jhg</link>
      <guid>https://dev.to/vitorfreitas/formatting-currencies-with-intl-numberformat-jhg</guid>
      <description>&lt;p&gt;Do you know the &lt;code&gt;Intl&lt;/code&gt; object in Javascript?&lt;/p&gt;

&lt;p&gt;This namespace stands for the ECMAScript's internationalization API, and provides some nice features such as string comparison, and number, date and time formatting. With this post I'll show about currency formatting using the &lt;code&gt;NumberFormat&lt;/code&gt; constructor.&lt;/p&gt;

&lt;p&gt;Recently I had to format integers to a currency format and I had 2 options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do it myself (which I'm a huge fan of)&lt;/li&gt;
&lt;li&gt;Use some external library&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But this time was different, and I took some time to search about the topic and then I found &lt;code&gt;Intl.NumberFormat&lt;/code&gt;. It's usage is simple, here's an example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;reaisFormatter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Intl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NumberFormat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pt-BR&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;currency&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;BRL&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nx"&gt;reaisFormatter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;123.50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// R$ 123,50&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;And that was it. Simple, huh? And within the &lt;code&gt;NumberFormat&lt;/code&gt; constructor you have an infinity of possibilities, such as unit formatting (liters, centimeters, foot...), percentage, decimal formatting and so on.&lt;/p&gt;

&lt;p&gt;Perheps you don't need to &lt;code&gt;npm install&lt;/code&gt; something to do that anymore. Hope you enjoyed it!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>i18n</category>
      <category>node</category>
    </item>
    <item>
      <title>Removendo propriedades de um objeto JavaScript usando destructuring e spread operator.</title>
      <dc:creator>Vitor Freitas</dc:creator>
      <pubDate>Sun, 23 Feb 2020 15:10:34 +0000</pubDate>
      <link>https://dev.to/vitorfreitas/removendo-propriedades-de-um-objeto-javascript-usando-destructuring-e-spread-operator-2628</link>
      <guid>https://dev.to/vitorfreitas/removendo-propriedades-de-um-objeto-javascript-usando-destructuring-e-spread-operator-2628</guid>
      <description>&lt;h1&gt;
  
  
  O problema
&lt;/h1&gt;

&lt;p&gt;Estou escrevendo testes unitários para um microserviço feito com TypeScript, testando funções que buscam dados no banco de dados, removem determinadas propriedades do objeto e o retorna para o cliente. Preciso ter certeza de que os dados estão sendo removidos, e para não reescrever todo o payload no meu arquivo de testes exceto pelas propriedades removidas, busquei uma solução mais simples.&lt;/p&gt;

&lt;h1&gt;
  
  
  Exemplo
&lt;/h1&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Função a ser testada&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;fetchFromDatabase&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Vitor&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;My secret&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;delete&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;secret&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;...&lt;/span&gt;

&lt;span class="c1"&gt;// Arquivo de teste (usando o chai, mas poderia ser qualquer lib de testes)&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;testMyFunction&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Vitor&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;My secret&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;insertIntoDatabase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mock&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Exemplo adicionando um mock no banco de dados&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fetchFromDatabase&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;allowedProperties&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;mock&lt;/span&gt; &lt;span class="c1"&gt;// Onde a mágica acontece.&lt;/span&gt;

  &lt;span class="nx"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;eql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;allowedProperties&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// returns: true&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  O que aconteceu?
&lt;/h1&gt;

&lt;p&gt;Usamos o &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment"&gt;destructuring&lt;/a&gt; para selecionar as propriedades que &lt;em&gt;não&lt;/em&gt; queremos, e com o &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax"&gt;spread operator (&lt;code&gt;...&lt;/code&gt;)&lt;/a&gt; salvamos todo o resto (propriedades que queremos) dentro de &lt;code&gt;allowedProperties&lt;/code&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  E o &lt;code&gt;delete&lt;/code&gt;?
&lt;/h1&gt;

&lt;p&gt;Na função que é testada é usada a keyword &lt;code&gt;delete&lt;/code&gt;, mas poderia ser facilmente substituída pela nossa "técnica" de destructuring + spread operator.&lt;/p&gt;

&lt;p&gt;No JavaScript temos a keyword &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete"&gt;&lt;code&gt;delete&lt;/code&gt;&lt;/a&gt;, que remove uma propriedade de um objeto.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Vitor&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Developer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;delete&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// { name: 'Vitor' }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Entretanto, como podemos ver, ao usarmos o &lt;code&gt;delete&lt;/code&gt; o nosso objeto é mutado. Particularmente, não é um comportamento que gosto de manter na minha base de código, pois pode dificultar os meus testes e criar side effects difíceis de debugar.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>tip</category>
    </item>
    <item>
      <title>Debugando como um profissional</title>
      <dc:creator>Vitor Freitas</dc:creator>
      <pubDate>Tue, 21 Jan 2020 14:35:53 +0000</pubDate>
      <link>https://dev.to/vitorfreitas/debugando-como-um-profissional-54dk</link>
      <guid>https://dev.to/vitorfreitas/debugando-como-um-profissional-54dk</guid>
      <description>&lt;h1&gt;
  
  
  O que é "debugar"?
&lt;/h1&gt;

&lt;p&gt;Debugar é a arte de achar a causa de um bug. Nem sempre debugar é algo trivial e pode tomar horas, dias ou até semanas para que você consiga resolver o bug.&lt;/p&gt;

&lt;h1&gt;
  
  
  O mindset correto
&lt;/h1&gt;

&lt;p&gt;Debugar é uma atividade que requer que o programador pense de uma forma clara e não enviezada sobre um problema. É muito fácil culpar o outro quando um bug surge, e saber que independente de quem for a culpa a responsabilidade de corrigir este bug é da equipe requer tempo e, claro, o &lt;em&gt;mindset&lt;/em&gt; correto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Nada é impossível
&lt;/h3&gt;

&lt;p&gt;É comum querermos pensar &lt;em&gt;"mas isto é impossível!"&lt;/em&gt; ou &lt;em&gt;"no meu código não acontece esse tipo de coisa."&lt;/em&gt; quando um bug ou um erro surge. Sinto lhe informar mas isto é tão possível que já aconteceu! Então ao invés de lamentar ou discordar que este bug acabou de acontecer, use o seu tempo para corrigi-lo! &lt;em&gt;Fix the problem, not the blame&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Não entre em pânico
&lt;/h3&gt;

&lt;p&gt;Somos pagos para resolver problemas. A partir do momento que somos contratados por alguém ou por alguma empresa, nossa função é resolver os problemas dessa pessoa, agregando valor para a sua marca ou produto. Não entrar em pânico é &lt;em&gt;imprescindível&lt;/em&gt;, e ao debugar um código não será diferente. Dê um passo para trás e veja o contexto como um todo. Por que isso aconteceu? Dada as circunstâncias, isto acontecerá novamente? Lembre-se, computadores fazem o que o instruímos a fazer, e não o que queremos que ele faça.&lt;/p&gt;

&lt;h3&gt;
  
  
  Corrija o bug, e não os seus sintomas
&lt;/h3&gt;

&lt;p&gt;Sintomas são comportamentos que existem por conta de um determinado bug, e é fácil pensarmos que estes sintomas &lt;em&gt;são&lt;/em&gt; o bug. Corrigir sintomas significam que o bug ainda está lá, e sinto lhe informar, mas ele vai voltar! Busque a raiz do problema e não os sintomas que o cercam.&lt;/p&gt;

&lt;h1&gt;
  
  
  Técnicas para debugar como um profissional
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Reproduza o bug
&lt;/h3&gt;

&lt;p&gt;Reproduzir um bug é uma frase conhecida no nosso meio, ela significa que você foi capaz de alcançar o mesmo comportamento reportado pelo seu usuário ou QA (controle de qualidade). Esta etapa é super importante, pois se você não consegue reproduzir um bug, como saberá que o mesmo foi corrigido? Se possível, isole este comportamento por meio de testes unitários/integração ou em um ambiente controlado, principalmente em casos onde você precisa passar por vários passos até chegar no bug. Você ganhará tempo e consequentemente resolverá este problema mais rápido.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tenha controle dos dados
&lt;/h3&gt;

&lt;p&gt;Como um bom programador JavaScript, uma das técnicas que mais uso para debugar minhas aplicações é por meio do &lt;code&gt;console.log&lt;/code&gt;. Essa função escreve no console do browser (ou terminal) o que receber como parâmetro. Ou seja, posso escrever um payload de um requisição, o estado de uma variável em determinado bloco ou até um simples &lt;em&gt;"cheguei aqui!"&lt;/em&gt; para saber se uma função foi chamada, por exemplo. É muito mais fácil descobrir um erro quando você pode visualiza-lo com clareza. Use funções de print ao seu favor!&lt;/p&gt;

&lt;h3&gt;
  
  
  Diga em voz alta
&lt;/h3&gt;

&lt;p&gt;O ato de explicar o erro para outra pessoa é esclarecedor. O simples fato de você expressar o que está acontecendo para um colega de equipe muitas vezes é o necessário para que a solução apareça. Comunique-se!&lt;/p&gt;

&lt;h3&gt;
  
  
  Refatore seus testes
&lt;/h3&gt;

&lt;p&gt;Sempre que possível cheque a integridade dos seus testes. Testes não podem ser enviezados e devem funcionar com as mais diversas entradas! Refatore quando for conveniente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use um debugger!
&lt;/h3&gt;

&lt;p&gt;Temos várias ferramentas para auxiliar o processo de debugging do seu código. Use-as! IDEs geralmente contam com debuggers, como por exemplo Netbeans, Visual Studio Code e as IDEs da &lt;a href="https://www.jetbrains.com/"&gt;JetBrains&lt;/a&gt;. Use aquela que você se sentir mais a vontade e que te ajude a resolver os seus problemas. &lt;/p&gt;

&lt;p&gt;Posteriormente pretendo escrever um artigo ensinando a usar o debugger do &lt;a href="https://code.visualstudio.com/"&gt;VS Code&lt;/a&gt; para debugar aplicações front-end e Node.js. Fique de olho!&lt;/p&gt;

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

&lt;p&gt;Estas são dicas valiosas e que uso no meu dia-a-dia. A maioria vieram de notas que fiz enquanto lia o capitulo 3 do livro &lt;a href="https://www.amazon.com.br/Pragmatic-Programmer-Journeyman-Master-English-ebook/dp/B003GCTQAE/ref=sr_1_2?adgrpid=78035804821&amp;amp;gclid=EAIaIQobChMItvPf9dWF5wIVhgmRCh1OsAUuEAAYASAAEgLsTfD_BwE&amp;amp;hvadid=392902864299&amp;amp;hvdev=c&amp;amp;hvlocphy=1001536&amp;amp;hvnetw=g&amp;amp;hvpos=1t1&amp;amp;hvqmt=e&amp;amp;hvrand=5262209604856440125&amp;amp;hvtargid=kwd-298735734907&amp;amp;hydadcr=5651_10696943&amp;amp;keywords=pragmatic+programmer&amp;amp;qid=1579093562&amp;amp;sr=8-2"&gt;O programador pragmático&lt;/a&gt; e ver que eu estava no caminho certo foi uma sensação muito boa 😆. Recomendo a leitura do livro, lá ele aborda vários outros tópicos além de &lt;em&gt;debugging&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Dúvidas ou sugestões estou sempre a disposição!&lt;/p&gt;

</description>
      <category>tip</category>
      <category>debug</category>
    </item>
    <item>
      <title>O programador pragmático: consertando vidros quebrados.</title>
      <dc:creator>Vitor Freitas</dc:creator>
      <pubDate>Mon, 13 Jan 2020 19:16:06 +0000</pubDate>
      <link>https://dev.to/vitorfreitas/o-programador-pragmatico-concertando-vidros-quebrados-3j4h</link>
      <guid>https://dev.to/vitorfreitas/o-programador-pragmatico-concertando-vidros-quebrados-3j4h</guid>
      <description>&lt;p&gt;Estou lendo este livro sensacional chamado "The Pragmatic Programmer" (aka O programador pragmático). So far, so good. Esta é uma tentativa de sumarizar alguns aprendizados do livro conforme eu vou lendo e aplicando no meu contexto real.&lt;/p&gt;

&lt;h1&gt;
  
  
  Sobre vidros quebrados
&lt;/h1&gt;

&lt;p&gt;Sabe aquele prédio que até um mês atrás havia apenas um vidro quebrado e conforme o tempo passou, ele veio se deteriorando dia após dia? Acredite ou não, poderia ser o seu código.&lt;/p&gt;

&lt;p&gt;O que quero dizer é que um erro &lt;em&gt;besta&lt;/em&gt; de arquitetura, design pattern e decisões de negócio podem afetar o seu código no futuro se você não tratar o quanto antes. É como um virus que se estabelece e há de ser tratado o quanto antes.&lt;/p&gt;

&lt;h1&gt;
  
  
  Meu contexto
&lt;/h1&gt;

&lt;p&gt;Recentemente refatorei &lt;strong&gt;toda&lt;/strong&gt; uma aplicação front-end na empresa em que trabalho pois a codebase anterior estava atrofiada a tal ponto que era complicado adicionar novas features. Como se tratava de um MVP, tento entender a pressa e as decisões escolhidas no momento. E, também por ser um MVP, refatorar não foi muito custoso. O resultado vem sendo um produto bom pro desenvolvedor e bom pro usuário.&lt;/p&gt;

&lt;p&gt;Mas recentemente me peguei tomando decisões ruins na organização de pastas e arquivos, e na arquitetura no geral. Fui capaz de perceber que aquilo não &lt;em&gt;escala&lt;/em&gt;, mas fui empurrando com a barriga até o momento atual.&lt;/p&gt;

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

&lt;p&gt;Esta parte do primeiro capitulo de &lt;em&gt;O programador pragmático&lt;/em&gt; serviu para deixar claro algo que eu já sabia, e foi o empurrão necessário para eu voltar e melhorar o meu código e não cometer o mesmo erro que cometeram no passado.&lt;/p&gt;

&lt;p&gt;Com o objetivo de me tornar um melhor desenvolvedor, este capitulo deixou bem claro pra mim o primeiro passo que devo tomar. Deixar sua codebase atrofiar sabendo que poderia melhorar te faz irresponsável, e não é o que queremos, correto?&lt;/p&gt;

</description>
      <category>books</category>
      <category>pragmatic</category>
      <category>dev</category>
    </item>
    <item>
      <title>Ionic + OneSignal: Utilizando na web e no mobile.</title>
      <dc:creator>Vitor Freitas</dc:creator>
      <pubDate>Fri, 13 Dec 2019 00:44:58 +0000</pubDate>
      <link>https://dev.to/vitorfreitas/ionic-onesignal-utilizando-na-web-e-no-mobile-367l</link>
      <guid>https://dev.to/vitorfreitas/ionic-onesignal-utilizando-na-web-e-no-mobile-367l</guid>
      <description>&lt;h1&gt;
  
  
  Contexto
&lt;/h1&gt;

&lt;p&gt;Estou trabalhando em uma aplicação mobile feita em Ionic, que precisou ser portada também para web. A versão antiga dessa aplicação (web) era feita em Angular 1 e, com o objetivo de melhorar a experiência e reduzir o custo da manutenção, resolvemos utilizar a base de código do nosso app também para web.&lt;/p&gt;

&lt;h1&gt;
  
  
  O problema
&lt;/h1&gt;

&lt;p&gt;Para notificar no mobile usamos o &lt;a href="https://ionicframework.com/docs/native/onesignal"&gt;@ionic-native/onesignal&lt;/a&gt; e na web o &lt;a href="https://documentation.onesignal.com/docs/web-push-sdk"&gt;OneSignalWebSDK&lt;/a&gt;. Tudo funcionava bem com um simples &lt;code&gt;ionic serve&lt;/code&gt;. Entretanto, após fazer um build com &lt;code&gt;ionic cordova build browser&lt;/code&gt;, o OneSignal que era injetado no objeto &lt;code&gt;window&lt;/code&gt; não era aquele provido pelo OneSignalWebSDK, e sim o do cordova. Cheguei nessa conclusão após analisar vários &lt;code&gt;console.log&lt;/code&gt;s e ver diferenças marcantes entre o output dos logs de desenvolvimento e de produção.&lt;/p&gt;

&lt;h1&gt;
  
  
  A solução
&lt;/h1&gt;

&lt;p&gt;Para solucionar precisei importar o OneSignalWebSDK programaticamente. Isto é, usando JavaScript ao invés de uma tag &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; no arquivo &lt;code&gt;index.html&lt;/code&gt;. Este chunk de código é executado após o cordova carregar todos os seus plugins, ou seja, após a Promise &lt;code&gt;platform.ready()&lt;/code&gt; ser resolvida.&lt;/p&gt;

&lt;h1&gt;
  
  
  O código
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;app/app.component.ts&lt;/code&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Gidj8SG2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://imgur.com/9DUMItn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Gidj8SG2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://imgur.com/9DUMItn.png" alt="app.component.ts"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;providers/notification/notification.ts&lt;/code&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8fCs3H43--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://imgur.com/CM5rQ5M.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8fCs3H43--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://imgur.com/CM5rQ5M.png" alt="notification.ts"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rrpa3VtK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://imgur.com/5bNGEgq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rrpa3VtK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://imgur.com/5bNGEgq.png" alt="notification.ts"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dw7aFvYP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://imgur.com/yQNsuSA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dw7aFvYP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://imgur.com/yQNsuSA.png" alt="notification.ts"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Problem Solved
&lt;/h1&gt;

&lt;p&gt;Resolvi omitir a implementação do OneSignal do cordova pois na documentação contém o necessário para sair usando. Espero que isto resolva o seu problema assim como resolveu o meu. Obrigado!&lt;/p&gt;

</description>
      <category>ionic</category>
      <category>onesignal</category>
      <category>mobile</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Removendo switch/case de um reducer</title>
      <dc:creator>Vitor Freitas</dc:creator>
      <pubDate>Sun, 20 Oct 2019 19:34:39 +0000</pubDate>
      <link>https://dev.to/vitorfreitas/removendo-switch-case-de-um-reducer-2kk1</link>
      <guid>https://dev.to/vitorfreitas/removendo-switch-case-de-um-reducer-2kk1</guid>
      <description>&lt;h1&gt;
  
  
  Por quê fazer isso, afinal?
&lt;/h1&gt;

&lt;p&gt;Não sou um grande fã de blocos &lt;code&gt;switch/case&lt;/code&gt;. Fazendo alguns testes de performance comparando à mapear objetos literais no Javascript ele se mostrou mais lento. Minha opinião é um pouquinho sem fundamentos lógicos, mas vamos explorar um pouco mais dos por que's logo a frente.&lt;/p&gt;

&lt;p&gt;Nota: testes de perf. são legais, sim. Mas por vezes, milisegundos pra mais ou pra menos não fazem diferença pro seu usuário. UX é importante, assim como DX! (Developer experience)&lt;/p&gt;

&lt;h1&gt;
  
  
  Problemas com switch/case
&lt;/h1&gt;

&lt;p&gt;Como mencionei acima, "object lookup" performam melhor que &lt;code&gt;switch/case&lt;/code&gt;'s. Outro problema está em sua sintaxe, todo o resto da linguagem usa &lt;code&gt;{}&lt;/code&gt; para delimitar escopo, enquanto cada case usa &lt;code&gt;:&lt;/code&gt;. Usando objetos, não precisamos utilizar &lt;code&gt;break&lt;/code&gt; ou &lt;code&gt;return&lt;/code&gt; em cada caso. No nosso caso precisamos de &lt;code&gt;return&lt;/code&gt;'s pois estamos lidando com reducers e eles precisam retornar uma nova versão do state. Objetos são mais fáceis de testar, pois são apenas objetos! Não entende nada de testes com Javascript? Dê uma olhada &lt;a href="https://jestjs.io/docs/en/getting-started.html"&gt;aqui.&lt;/a&gt; &lt;/p&gt;

&lt;h1&gt;
  
  
  Resultado
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pmvVl6q1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ah36nvspz9dwon7b0tkr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pmvVl6q1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ah36nvspz9dwon7b0tkr.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O bloco acima foi retirado de um código que estou trabalhando agora mesmo, o qual contém um reducer de carrinho de compras bem simples. Enquanto olhava aquele switch/case que todo mundo ensina me questionei "e se eu fizesse diferente?". Cheguei nesse resultado e, sinceramente, não está de todo mal :P&lt;/p&gt;

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

&lt;p&gt;Mostrar a si mesmo que você tem algum domínio em cima da ferramenta o qual você trabalha é um sentimento bacana. Você vê que seu código vai além de fórmulas máginas que você copia do Stack Overflow e etc, e consequentemente você fica mais confiante. Trabalho com Javascript há quase 2 anos (não é muito) e sempre que essas situações me ocorrem, gosto pra caramba.&lt;/p&gt;

&lt;p&gt;Legibilidade na sua base de código é importante. Talvez hoje eu ache dessa forma melhor, talvez amanhã eu ache &lt;code&gt;switch/case&lt;/code&gt; melhor. Tudo vai depender do quão fácil é para entender o objetivo do código. Afinal de contas, não posso me dar o luxo de abrir mão da legibilidade baseado em opiniões totalmente arbitrárias.&lt;/p&gt;

&lt;p&gt;Alguma sugestão ou opinião? Fale comigo!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Code that communicates its purpose is very important. I often refactor just when I'm reading some code. That way as I gain understanding about the program, I embed that understanding into the code for later so I don't forget what I learned.” &lt;/p&gt;

&lt;p&gt;Martin Fowler, Refactoring: Improving the design of existing code.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>react</category>
      <category>redux</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Meus aprendizados na Campus Party Goiás</title>
      <dc:creator>Vitor Freitas</dc:creator>
      <pubDate>Sun, 15 Sep 2019 20:05:00 +0000</pubDate>
      <link>https://dev.to/vitorfreitas/meus-aprendizados-na-campus-party-goias-8ic</link>
      <guid>https://dev.to/vitorfreitas/meus-aprendizados-na-campus-party-goias-8ic</guid>
      <description>&lt;p&gt;Entre os dias 04 e 08 de setembro ocorreu lá em Goiania mais uma das edições da Campus Party, a qual tive o prazer de poder ir.&lt;/p&gt;

&lt;p&gt;A primeira dica que posso dar pra você que está lendo é: se tiver oportunidade, vá a uma campus party, especialmente se sua jornada está começando. Lá você encontra muita gente disposta a ensinar e passar conteúdo e diversas comunidades ensinando os mais diversos assuntos que você possa imaginar.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que você aprendeu lá, afinal?
&lt;/h2&gt;

&lt;p&gt;Quanto a tecnologias, vi muito conteúdo sobre &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; e &lt;a href="https://kubernetes.io/"&gt;Kubernetes&lt;/a&gt;, Infra as Code, &lt;a href="https://serverless.com/"&gt;Serverless&lt;/a&gt;, &lt;a href="https://graphql.org/"&gt;GraphQL&lt;/a&gt; e &lt;a href="//gatsbyjs.org"&gt;Gatsby&lt;/a&gt;, &lt;a href="https://www.algolia.com/"&gt;Algolia&lt;/a&gt; e diversas outras coisas. Irei discorrer um pouco sobre os que mais me chamou atenção e que tive a oportunidade de por a mão na massa enquanto aprendia.&lt;/p&gt;

&lt;h3&gt;
  
  
  Docker
&lt;/h3&gt;

&lt;p&gt;É um nome que costuma aparecer nas conversas, e pra mim era um conceito muito abstrato até então. Ainda tenho algumas dúvidas, mas lá eu pude aprender como começar com containers e uma breve introdução do que eles são. Fiz uma brincadeirinha e pushei no GitHub &lt;a href="https://github.com/vitorfreitas/docker-centos-screenfetch"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  GraphQL
&lt;/h3&gt;

&lt;p&gt;Este era, e ainda é, o que mais tenho curiosidade de aprender nos últimos dias. Uma alternativa para a forma que escrevo minhas APIs hoje é algo que muda o jogo da água pro vinho. Lá pude escrever algum código server-side (que publiquei &lt;a href="https://github.com/vitorfreitas/graphql-yoga-mongodb"&gt;aqui&lt;/a&gt;), e posteriormente integrei em uma aplicação React de teste para ver como funciona (que publiquei &lt;a href="https://github.com/vitorfreitas/react-graphql-playground"&gt;aqui&lt;/a&gt;). Não tenho muito a dizer se não "Aprenda GraphQL!". O esforço inicial é mínimo, achei a curva de aprendizado bem interessante, pelo menos para mim que já tenho algum background. Ferramentas como o &lt;code&gt;graphql-yoga&lt;/code&gt; podem ser um ótimo entry point para você que está curioso, assim como eu estava.&lt;/p&gt;

&lt;h3&gt;
  
  
  Algolia
&lt;/h3&gt;

&lt;p&gt;Este é uma ferramenta do tipo "search engine" muitíssimo poderosa. Na hackathon que eu e dois amigos participamos descobrimos o Algolia e foi o canal para desenvolvermos algo muito robusto com pouco esforço. Infelizmente não ganhamos, mas o conhecimento valeu a pena.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mas, o mais importante...
&lt;/h3&gt;

&lt;p&gt;Pude ter ainda mais certeza de que eventos desse tipo são ótimos para criar um networking, que é fundamental para nós de tecnologia. Social skills são necessárias e precisam ser desenvolvidas.&lt;/p&gt;

&lt;p&gt;Outro aprendizado importante é APRENDA OS FUNDAMENTOS. Frameworks, ferramentas e até linguagens de programação vem e vão, mas os fundamentos sempre se mantêm.&lt;/p&gt;

&lt;p&gt;Aos que me acompanharam nessa aventura, obrigado! (&lt;a href="https://github.com/KelvinCS"&gt;@KelvinCS&lt;/a&gt;, &lt;a href="https://github.com/KelvinCS"&gt;@caique39&lt;/a&gt;)&lt;/p&gt;

</description>
      <category>campusparty</category>
    </item>
  </channel>
</rss>
