<?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: Rogério dos Santos Fernandes</title>
    <description>The latest articles on DEV Community by Rogério dos Santos Fernandes (@rogersantos).</description>
    <link>https://dev.to/rogersantos</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%2F177930%2F89596265-b952-4fba-b851-879490de0584.jpeg</url>
      <title>DEV Community: Rogério dos Santos Fernandes</title>
      <link>https://dev.to/rogersantos</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rogersantos"/>
    <language>en</language>
    <item>
      <title>Git - Dicas rápidas pra uma boa gestão do seu código</title>
      <dc:creator>Rogério dos Santos Fernandes</dc:creator>
      <pubDate>Mon, 10 Aug 2020 21:41:00 +0000</pubDate>
      <link>https://dev.to/rogersantos/git-dicas-rapidas-pra-uma-boa-gestao-do-seu-codigo-3j57</link>
      <guid>https://dev.to/rogersantos/git-dicas-rapidas-pra-uma-boa-gestao-do-seu-codigo-3j57</guid>
      <description>&lt;p&gt;Nada como saber usar bem as ferramentas que você tem à sua mão, não é mesmo? &lt;/p&gt;

&lt;p&gt;Como disse Kent Becks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;não precisamos ser programadores excepcionais, mas bons programadores com excelentes hábitos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tá, não deve ter sido exatamente isso que ele disse, mas você entendeu. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;escolha um &lt;em&gt;padrão&lt;/em&gt;  que você e seu time sigam. Pelo menos inicie de um e adapte de acordo com seu time e projeto. Dois bem conhecidos são o Git Flow e o Trunk Based Development. O primeiro é mais simples mas tem problemas ao escalar (filas de PRs). O segundo exige maturidade técnica e de qualidade, pois os commits são na master.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A partir de um padrão, recomendo colocar um sistema para rodar validações a cada commit ou push. Existe o husky para projetos baseados em NodeJS. Isso pois por mais que tenha carinho e atenção, a maior segurança vem dessas validações.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Outra coisa é: Leia o terminal! Olha o que a ferramenta ta te dizendo sobre como está seu repositório...ela vai te dar dicas valiosas. Vai te indicar a usar um comando ou outro dependendo do cenário. Leia o terminal!&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fvwjul0rkd0yj1ena9665.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fvwjul0rkd0yj1ena9665.png" alt="Imagem indicando mensagens do terminal, mostrando a importância de ler ele." width="570" height="170"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Abaixo os comandos que mais uso no meu dia a dia:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;git status&lt;/code&gt; -&amp;gt; pra ver o estado do seu repo local em comparação com o remoto (esse vcs já devem usar diariamente)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;git add -p&lt;/code&gt; -&amp;gt; pra ir vendo em pequenos pedaços (chunks) de código o diff do que foi mexido, e ir incluindo ou não. É uma forma interativa de criar o package do commit&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;git commit -m "mensagem padronizada"&lt;/code&gt; -&amp;gt; cria o pacote a ser enviado ao repo remoto, recomendo padrão commit lint, é possível utilizar ferramentas pra analisar os commits&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;git stash&lt;/code&gt;/&lt;code&gt;git stash pop&lt;/code&gt; -&amp;gt; esse comando armazena as suas alterações em uma fila, e restaura o estado que estava na sua branch. Uso quando quero guardar o que estava fazendo rapidamente e ir pra outra branch, por exemplo. Mas também é viável e até mais recomendável commitar e depois usar ammend pra rescrever o commit WIP (Work in progress).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;git commit --amend --no-edit&lt;/code&gt; -&amp;gt; uso quando quero adicionar algo ao commit anterior sem editar a mensagem. Use com cuidado, exige um &lt;code&gt;git push -f&lt;/code&gt; após&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;git rebase &amp;lt;BRANCH_NAME&amp;gt;&lt;/code&gt; -&amp;gt; atualiza sua branch com outra, mas diferente do merge, pull ou fetch, que trazem as alterações acima da sua, o rebase reescreve a história da sua branch, removendo sua alteração, colocando a história da branch indicada no comando, e aí sim colocando seus commits novamente. Por isso quando você for resolver conflitos após este método você verá suas alterações como novas, e o código "antigo" na verdade já terá atualização do rebase. Também obriga o uso de &lt;code&gt;git push -f&lt;/code&gt; após seu uso! Use com carinho.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;git push&lt;/code&gt; -&amp;gt; envia todas suas alterações para o repo remoto. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;git revert  -&amp;gt; esse comando remove certo commit do histórico. Muito útil quando um commit acabou quebrando algo, gerando um comportamento inexperado que os testes não pegaram, e você quer remover pra depois voltar corrigido.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para resolver conflitos de Merge, recomendo uma interface como o VS Code. Facilita muito a vida!&lt;/p&gt;

&lt;p&gt;Algumas dicas gerais seriam: Commits pequenos e constantes. Rebases constantes. Comunicação constante entre o time. O versionamento vai refletir o entrosamento (ou falta de) do time, assim como a organização das tarefas e sua granularidade.&lt;/p&gt;

&lt;p&gt;Não adianta usar os melhores comandos mas ficar 2 semanas sem abrir a PR, gerando um distanciamento enorme entre as versões!&lt;/p&gt;

&lt;p&gt;É isso! Valeu! :) &lt;/p&gt;

</description>
    </item>
    <item>
      <title>Construindo do zero um backend NodeJS com NestJS + Design Patterns - parte um (1/3)</title>
      <dc:creator>Rogério dos Santos Fernandes</dc:creator>
      <pubDate>Sat, 02 May 2020 01:00:56 +0000</pubDate>
      <link>https://dev.to/rogersantos/construindo-do-zero-um-backend-nodejs-com-nestjs-design-patterns-parte-um-1-3-ff8</link>
      <guid>https://dev.to/rogersantos/construindo-do-zero-um-backend-nodejs-com-nestjs-design-patterns-parte-um-1-3-ff8</guid>
      <description>&lt;p&gt;Olá humano!&lt;/p&gt;

&lt;p&gt;Co-escrevo esse artigo em meio a quarentena do Coronavírus com meu amigo e colega Matheus Viana (&lt;a href="https://www.linkedin.com/in/matheusviana/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/matheusviana/&lt;/a&gt;). Na verdade, se trata de uma série de artigos que planejamos fazer para mostrar um Backend feito em NodeJS tendo em mente boas práticas de desenvolvimento ágil de software.&lt;/p&gt;

&lt;p&gt;Neste primeiro artigo, vamos discutir sobre o que nos levou a escrevê-lo em primeiro lugar, e quais diretrizes nos guiam por essa jornada.&lt;/p&gt;

&lt;p&gt;Motivação:&lt;/p&gt;

&lt;p&gt;Trabalho com Node há cerca de 5 anos, e adoro a comunidade e a linguagem JavaScript e seu superset TypeScript. Existem inúmeras (de verdade!) formas de se construir um backend em Node, por isso quero focar aqui mais nos conceitos do que nas ferramentas, pois os conceitos e o valor que eles agregam são mais importantes, e são independentes de bibliotecas e frameworks!&lt;/p&gt;

&lt;p&gt;Dito isso, o que queríamos atingir aqui é a construção de um Backend com esses requisitos em mente:&lt;/p&gt;

&lt;p&gt;Seguir Padrões de Projeto e boas práticas reconhecidamente eficientes nos projetos empresariais, como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Domain Driven Design&lt;/li&gt;
&lt;li&gt;S.O.L.I.D.&lt;/li&gt;
&lt;li&gt;Clean Code&lt;/li&gt;
&lt;li&gt;DRY (Não se repita, em tradução livre)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estes princípios e padrões acima nos norteiam na organização de nosso código, visando principalmente um código que possa escalar e não perca sua  clareza, que fique se mantenha, ao longo do tempo, limpo e eficiente.&lt;/p&gt;

&lt;p&gt;Partimos da visão de que escrevemos código para outras pessoas lerem, e não somente para máquinas.&lt;/p&gt;

&lt;p&gt;Dito isso, vamos lá!&lt;/p&gt;

&lt;p&gt;Partimos com o NestJS por ele ser um framework que já nos dá algumas coisas de prontidão, como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Injeção de dependências&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;Testes de unidade e integração com o Jest!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Começamos a partir do próprio template do Nest, que também provê uma interface de linha de comando (CLI) bem útil:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// instala globalmente a CLI do Nest
npm i -g @nestjs/cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// cria uma nova aplicação Nest com nome geekLounge
nest new geekLounge
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;após isso, editamos o README pra refletir a descrição do nosso projeto, um backend de um site de críticas de filmes chamado Geek Lounge. Definimos este contexto para podermos trabalhar em um domínio rico durante os artigos.&lt;/p&gt;

&lt;p&gt;Foi incluído um passo antes dos commits que executam os testes de unidade e integração, a fim de manter a qualidade do código a cada commit!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn add -D husky
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Assim, damos um ponto de partida pra essa jornada, e começamos nossa API.&lt;/p&gt;

&lt;p&gt;Pra quem veio esperando ver muito código nesse primeiro post, peço paciência rs começamos pensando NO QUE queremos construir e PORQUÊ, que pra mim é o mais importante, pra aí então pensarmos no COMO!&lt;/p&gt;

&lt;p&gt;Também configuramos uma esteira no Travis CI para todo o processo rolar com TDD e Continuous Integration.&lt;/p&gt;

&lt;p&gt;Aqui está o link pro projeto: &lt;a href="https://github.com/moviandev/geekLounge" rel="noopener noreferrer"&gt;https://github.com/moviandev/geekLounge&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Acompanhe-nos nas redes sociais pra receber as próximas postagens!&lt;/p&gt;

&lt;p&gt;github: @dontpanicroger&lt;br&gt;
twitter: @lifeaholicroger&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>node</category>
      <category>testing</category>
    </item>
    <item>
      <title>Safe navigation operator coming to JS/TS</title>
      <dc:creator>Rogério dos Santos Fernandes</dc:creator>
      <pubDate>Sat, 10 Aug 2019 13:21:37 +0000</pubDate>
      <link>https://dev.to/rogersantos/safe-navigation-operator-coming-to-js-ts-1fc7</link>
      <guid>https://dev.to/rogersantos/safe-navigation-operator-coming-to-js-ts-1fc7</guid>
      <description>&lt;p&gt;Whatever you do, do it with love. I really like to apply this when I'm coding. Think that the code that you write will be the code that someone will read later.&lt;/p&gt;

&lt;p&gt;In this post, let's discuss a little bit about validations against objects that can be null at runtime on JS and TS.&lt;/p&gt;

&lt;p&gt;We need to do that to assert the response that came from an Http Request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&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="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&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="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;mapFunction&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to validate that certain function parameter was passed into correctly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;onSuccess&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Hmm, where's my param?`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// else, do something&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or to access some property in a model that have nested data like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;account&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;account&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;account&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;permission&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;account&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;permission&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deal with this can lead to code that is difficult to read, to test and to maintain.&lt;/p&gt;

&lt;p&gt;Some actions can help a lot with that, like a shared layer (like an Http client wrapper) that deals with Http error codes and reduce the number of validations on your components and modules. &lt;/p&gt;

&lt;p&gt;A concise API Design, to help your clients to deal with your data. A bad API Design can really do harm to your clients code! Try to avoid several levels of data, have a clear contract, a resource should only have one contract, a different contract should lead to a different resource. If you're doing microservices, GraphQL may be a good option. TypeScript already helps by telling at development time if something can be null.&lt;/p&gt;

&lt;p&gt;That said, a language-level feature to help with that is really good! And we have good news! Just a few days ago, the &lt;a href="https://github.com/microsoft/TypeScript/issues/16#issuecomment-515160784" rel="noopener noreferrer"&gt;Safe Navigator&lt;/a&gt; feature has gone to Stage 3, and to the &lt;a href="https://github.com/microsoft/TypeScript/milestone/98" rel="noopener noreferrer"&gt;TS 3.7.0&lt;/a&gt; roadmap! &lt;/p&gt;

&lt;p&gt;When this rollout, we will be able to do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&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="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;mapFunction&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="c1"&gt;// undefined if something is undefined/null or the method result&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;data&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;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hmm, still not getting it&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;account&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;permission&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nc"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I believe this will help us create a smaller and more readable code. Angular 2+ already have that on the Html side, with the &lt;a href="https://angular.io/guide/template-syntax" rel="noopener noreferrer"&gt;Template Syntax&lt;/a&gt; feature.&lt;/p&gt;

&lt;p&gt;Despite this being a great addition to a fast-evolving language such as JS, is important to notice that you have other actions to improve the overall quality of your code.&lt;/p&gt;

&lt;h1&gt;
  
  
  Next steps...
&lt;/h1&gt;

&lt;p&gt;Now, we can follow on Github the implementation of that feature.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/tc39" rel="noopener noreferrer"&gt;TC39&lt;/a&gt; group makes a great job to make sure that JavaScript keeps evolving and became an even more consistent and strong language each year. TypeScript follows along, helping and giving us a great option in the JS ecosystem.&lt;/p&gt;

&lt;p&gt;If you want to know more about the process of new features coming to JS/TS, give a look at these links:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/tc39" rel="noopener noreferrer"&gt;TC39 Github&lt;/a&gt;&lt;br&gt;
&lt;a href="https://tc39.es/process-document/" rel="noopener noreferrer"&gt;TC39 process&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>codequality</category>
      <category>github</category>
    </item>
    <item>
      <title>Operador de navegação segura vindo para JS/TS</title>
      <dc:creator>Rogério dos Santos Fernandes</dc:creator>
      <pubDate>Sun, 04 Aug 2019 22:00:07 +0000</pubDate>
      <link>https://dev.to/rogersantos/operador-de-navegacao-segura-vindo-ai-para-typescript-javascript-49il</link>
      <guid>https://dev.to/rogersantos/operador-de-navegacao-segura-vindo-ai-para-typescript-javascript-49il</guid>
      <description>&lt;p&gt;O que você fizer, faça com amor. Eu gosto de aplicar isso ao meu código. Pense que o código que você escreve será o código que alguém irá ler mais tarde.&lt;/p&gt;

&lt;p&gt;Nesse post, discutiremos um pouco sobre validações em objetos que podem ser nulos na hora da execução do código (runtime).&lt;/p&gt;

&lt;p&gt;Precisamos fazer isso para validar o retorno que veio de uma Requisição Http:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&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="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&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="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;mapFunction&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;pra validar que os paramêtros da nossa função foram passados corretamente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;onSuccess&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Hmm, where's my param?`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// else, do something&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ou pra acessar algum dado em um modelo com diversos níveis aninhados:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;account&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;account&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;account&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;permission&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;account&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;permission&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lidar com isso pode gerar código de difícil leitura, testabilidade e manutenabilidade.&lt;/p&gt;

&lt;p&gt;Algumas ações podem ajudar bastante, como uma camada compartilhada (um encapsulador das comunicações Http, por exemplo) que lida com erros http e diminui a quantidade de validaçõe que você terá que fazer nos seus componentes e módulos.&lt;/p&gt;

&lt;p&gt;Um Design de API conciso, para ajudar seus consumidores a lidar com seus dados. Uma API com uma estrutura ruim pode prejudicar bastante o código de seus clientes! Tente evitar muitos níveis diferentes para acessar alguma informação, tenha um contrato bem claro, um recurso deve ter apenas um contrato, diferente estrutura deveria levar a um recurso novo. Se você está fazendo micro serviços, GraphQL pode ser bom pra você. TypeScript pode ajudar dizendo o que pode ser nulo durante o desenvolvimento.&lt;/p&gt;

&lt;p&gt;Dito isso, uma boa maneira de lidar com isso a nível de linguagem é muito bem vindo! E temos boas novas! Há alguns dias atrás, o &lt;a href="https://github.com/microsoft/TypeScript/issues/16#issuecomment-515160784" rel="noopener noreferrer"&gt;Operador de navegação segura&lt;/a&gt; passou pro estágio 3, entrando no roadmap pro &lt;a href="https://github.com/microsoft/TypeScript/milestone/98" rel="noopener noreferrer"&gt;TS 3.7.0&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Quando isso for lançado, poderemos fazer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&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="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;mapFunction&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="c1"&gt;// undefined if something is undefined/null or the method result&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;data&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;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hmm, still not getting it&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;account&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;permission&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nc"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Acredito que isso irá nos ajudar a escrever códigos menores e mais legíveis. Angular 2+ já provê isso do lado Html através do &lt;a href="https://angular.io/guide/template-syntax" rel="noopener noreferrer"&gt;Template Syntax&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Apesar de ser uma ótima adição para uma linguagem que vêm evoluindo rápido como o JS, é importante notar que temos outras ações que devem ser tomadas para garantir a qualidade do nosso código.&lt;/p&gt;

&lt;h1&gt;
  
  
  Próximos passos..
&lt;/h1&gt;

&lt;p&gt;Agora, podemos acompanhar a implementação dessa funcionalidade no Github.&lt;/p&gt;

&lt;p&gt;O grupo &lt;a href="https://github.com/tc39" rel="noopener noreferrer"&gt;TC39&lt;/a&gt; faz um ótimo trabalho garantindo que o JavaScript continue evoluindo e se tornando cada vez mais uma linguagem consistente e forte. TypeScript vêm junto, nos dando uma ótima opção dentro desse ecosistema.&lt;/p&gt;

&lt;p&gt;Se você quer ficar por dentro das novas funcionalidades vindo aí no JS e TS, recomendo que leia os artigos abaixo!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/tc39" rel="noopener noreferrer"&gt;TC39 Github&lt;/a&gt;&lt;br&gt;
&lt;a href="https://tc39.es/process-document/" rel="noopener noreferrer"&gt;TC39 process&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>codequality</category>
      <category>github</category>
    </item>
  </channel>
</rss>
