<?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: Marcos Felipe</title>
    <description>The latest articles on DEV Community by Marcos Felipe (@omarkdev).</description>
    <link>https://dev.to/omarkdev</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%2F348623%2F623f671d-a96b-409e-8971-1275660ad96f.jpg</url>
      <title>DEV Community: Marcos Felipe</title>
      <link>https://dev.to/omarkdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/omarkdev"/>
    <language>en</language>
    <item>
      <title>Faculdade não é sobre escrever bons códigos</title>
      <dc:creator>Marcos Felipe</dc:creator>
      <pubDate>Thu, 17 Feb 2022 23:14:12 +0000</pubDate>
      <link>https://dev.to/omarkdev/faculdade-nao-e-sobre-escrever-bons-codigos-52an</link>
      <guid>https://dev.to/omarkdev/faculdade-nao-e-sobre-escrever-bons-codigos-52an</guid>
      <description>&lt;p&gt;Quando falamos especificamente da carreira de uma pessoa que irá escrever códigos, é comum pensarmos que ao sairmos da faculdade iremos ter aprendido a escrever os melhores códigos possíveis e estaremos prontos para o mercado de trabalho, mas isso é falso. E isso não é culpa da faculdade.&lt;/p&gt;

&lt;p&gt;Se fizermos uma pesquisa simples "&lt;em&gt;para que a faculdade serve&lt;/em&gt;" no Google, iremos encontrar vários posts de faculdade em seus blogs dizendo basicamente que tem o objetivo de aumentar as oportunidades profissionais, seja possibilitando ser um diferencial no mercado de trabalho ou trazendo experiências enriquecedoras. É totalmente esperado em nossa área uma pessoa que ainda está na faculdade ou acabou de terminar ainda esteja apenas no começo de sua caminhada, afinal tem bastantes coisas que elas precisam aprender sobre o mundo "real" que provavelmente não foram ensinadas na faculdade, e que talvez nem deveriam ser.&lt;/p&gt;

&lt;p&gt;Recentemente temos visto cada vez mais essa discussão de "&lt;em&gt;faculdade compensa?&lt;/em&gt;" aparecer na bolha dos programadores. O problema está quando pessoas que são ouvidas por quem está começando na área diz simplesmente "não compensa" ou começa a colocar em cheque todos os ensinamentos das faculdades com questões que deveriam ser bem mais complexas.&lt;/p&gt;

&lt;h2&gt;
  
  
  O código ruim da faculdade
&lt;/h2&gt;

&lt;p&gt;Conforme a faculdade vai nos ensinando como programar, vamos tendo contato com vários trechos de códigos que podem fugir um pouco da realidade do mundo "real". Dificilmente veremos as melhores abordagens para aqueles ensinamentos.&lt;br&gt;
Já em outra perspectiva, se pegarmos vários cursos disponíveis na internet (seja de graça no YouTube, ou na Udemy) para quem está começando, é bem provável que teremos um tópico só para boas práticas ou simplesmente ouviremos mais cedo termos como: SOLID, Clean Code, etc.&lt;br&gt;
Essas duas perspectivas parecem demonstrar muito bem o mundo real, certo? Na verdade, as coisas são um pouco mais complexas que isso.&lt;/p&gt;

&lt;p&gt;O primeiro ponto é que é possível sim ter contatos com esses termos na faculdade, mas provavelmente em momentos diferentes, e mesmo que não tenhamos, isso não deveria ser um ponto que desmerecesse a faculdade (falaremos disso melhor depois).&lt;/p&gt;

&lt;p&gt;O segundo ponto é que muitas vezes quando pegamos esses códigos que seguiriam más práticas e tentamos comparar com o que seria o ideal, excluímos o contexto de onde aquele código foi usado.&lt;/p&gt;

&lt;p&gt;Por exemplo, se formos apresentados a um código em Java que conecta no banco de dados, porém está suscetível à SQL Injection, e simplesmente compararmos com o que o mercado espera, com certeza podemos ser induzido a acreditar que aquele código não prepara o profissional para o mercado. Mas fazer isto é bastante desonesto, porque sem o contexto daquele código fica difícil saber onde foi utilizado, afinal ele pode ter sido utilizado para introduzir programação com banco de dados, ou em uma prova falando para não fazer desta maneira, ou como exemplo de más práticas.&lt;/p&gt;

&lt;p&gt;Quando eu fazia faculdade eu já trabalhava na área, e isso me ocasionou um evento que me lembro até hoje que consegue exemplificar muito bem esta cultura do reduzimento da faculdade. Eu estava em uma aula de Banco de Dados e o professor estava ensinando a criar funções, durante um exercício eu usei a abordagem de &lt;em&gt;early return&lt;/em&gt;, quando o professor viu aquilo ele me questionou dizendo que não era o ideal fazer desta maneira. Mesmo eu não concordando com seus argumentos até hoje, o ponto foi que eu lembro de me sentir superior por saber mais boas práticas que ele, e com isso eu questionava todos seus conhecimentos sobre isto, afinal se ele não sabia uma coisa tão simples assim, então provavelmente eu saiba mais que ele.&lt;/p&gt;

&lt;p&gt;Agora pegando este professor como exemplo, por ele não saber essa boa prática, ele está ensinando errado? Não. Com toda certeza ele tem mais conhecimentos abrangentes na área do que eu. Ele sabe qual o caminho deve ser traçado para os alunos terem um conhecimento base para lidar com Banco de Dados. Várias pessoas aprenderam a criar funções naquele dia, mesmo sem o &lt;em&gt;early return&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Simplesmente não faz sentido esperarmos que veremos sempre boas práticas (mesmo que de segurança) a todo momento, afinal o caminho do aprendizado é tão importante quanto a chegada. Existe uma estrada bem grande entre ensinar Java e conexão com banco de dados até a introdução à SQL Injection. E mesmo que a faculdade não te ensine que aquele código em Java é ruim (ou o que é &lt;em&gt;early return&lt;/em&gt;), é bem provável que você esteja mais preparado a entender os problemas do que se tivesse pulado para o final (onde o código já segue todas essas abordagens).&lt;/p&gt;

&lt;p&gt;Referência é importante para se ter qualidade. Um código que segue boas práticas só existe porque sabemos quais são às más práticas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Não é só código
&lt;/h2&gt;

&lt;p&gt;Até o momento só falamos especificamente sobre código e boas práticas. Mesmo explicando que até neste pilar, as coisas podem ser mais complexas, existem outros pontos esquecidos quando criamos estas comparações.&lt;/p&gt;

&lt;p&gt;A grade curricular de uma faculdade geralmente abrange muitos outros tópicos que os cursos não cobrem, como: Algoritmos, Estrutura de Dados, Matemática Discreta, Cálculo, entre outros. Obviamente conseguimos encontrar cursos onlines sobre esses mesmos assuntos, entretanto essa decisão do que é necessário estudar é muito mais difícil para quem está começando na área e na maioria das vezes a pessoa só se dá conta que precisa aprender algo assim depois de uma boa caminhada.&lt;/p&gt;

&lt;p&gt;Sempre vão existir pontos contra esses assuntos, como utilizar linguagens mais acessíveis para se ensinar estrutura de dados, ou o que poderíamos fazer preparar melhor o profissional, e para todas elas eu não tenho uma resposta, o que eu tenho apenas é a demonstração que o cenário é muito maior do que simplesmente pegar uma experiência sem contexto e utilizá-la para influenciar pessoas ou gerar tretas.&lt;br&gt;
Isso comparando em um cenário onde estas duas situações são possíveis, entretanto muitas vezes nem todos tem a oportunidade ou o tempo livre para estudar por conta própria, pois isso pode necessitar de uma internet de qualidade, conhecimento prévio do que é necessário, ou meramente de um notebook.&lt;/p&gt;

&lt;p&gt;Outro pilar importante é o do mercado de trabalho. Como já entendemos muito bem, às vezes a faculdade não nos prepara 100% para o mundo corporativo, porém podem existir situações onde a mesma pode ser um fator decisivo entre uma vaga. É bem provável que em uma concorrência entre pessoas da mesma qualidade técnica a faculdade possa ser um diferencial para um.&lt;/p&gt;

&lt;h2&gt;
  
  
  O preço é diferente
&lt;/h2&gt;

&lt;p&gt;Ao começarmos a percorrer nossa caminhada nesta área de desenvolvimento de software, é regular esquecermos dos caminhos já percorridos. Podemos concluir que certas abordagens em nossa área são ruins porque conseguimos compará-las com experiências passadas. Conseguimos entender melhor certas situações devido a referências passadas. Porém, é muito difícil conseguir visualizar este caminho de referências, e muitas vezes não conseguiremos, mas considero um exercício muito importante para quem está no processo de mentorar pessoas.&lt;/p&gt;

&lt;p&gt;É preciso ter cuidado para não aceitar conselhos de quem não vai pagar o mesmo preço que você.&lt;/p&gt;

&lt;p&gt;Cada decisão tem um peso diferente para cada pessoa, para algumas pessoas não fazer ou não uma faculdade não faz diferença, para outras pode ser um desejo pessoal ou da família (como é o meu caso), então decidir ou não uma coisa desta tem muito mais a ver com você, afinal o preço a pagar de suas decisões não são o mesmo de quem aconselha.&lt;/p&gt;

&lt;h2&gt;
  
  
  Então eu devo fazer?
&lt;/h2&gt;

&lt;p&gt;Se você chegou até aqui decidido a fazer faculdade devido aos pontos levantados aqui e acredita que os cursos são ruins, então creio que não consegui explicar muito bem a minha ideia.&lt;/p&gt;

&lt;p&gt;Primeiramente, os cursos são muito importante, pois na maioria das vezes, complementam aquilo que não é ensinado na faculdade e podem ser uma maneira muito rápida de se aprender algo de maneira correta. Além disso, em certas situações o investimento para se realizar vários cursos é bem menor que o de terminar uma faculdade.&lt;/p&gt;

&lt;p&gt;Também existem cursos para quem realmente está dando os primeiros passos e não sabe por onde começar e podem entregar um resultado muito mais rápido, este resultado pode ser um emprego, um conhecimento necessário para o que você realiza hoje, entre outras coisas.&lt;/p&gt;

&lt;p&gt;Fazer ou não fazer faculdade é algo que envolve muitas variáveis.&lt;/p&gt;

&lt;p&gt;Pode ser que ter uma faculdade concluída para você seja uma realização pessoal muito importante. Ou pode ser que você não consiga investir o tempo e dinheiro necessário para isto. Você também pode estar precisando de um emprego muito rápido e talvez os cursos consigam te entregar este resultado mais rápido.&lt;/p&gt;

&lt;p&gt;E qual seria o meu conselho? Se você puder, faça tudo. É sempre bom ouvir conselhos e ter mentorias com pessoas mais experientes, mas saiba que a &lt;strong&gt;única verdade&lt;/strong&gt; que temos nessa área é que não existe bala de prata (nem para seus estudos, nem para suas escolhas de carreiras, nem para as tecnologias que você deve trabalhar).&lt;/p&gt;

&lt;p&gt;Espero que isso te ajude de alguma forma.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Twitter&lt;/strong&gt;: &lt;a href="https://twitter.com/omarkdev"&gt;https://twitter.com/omarkdev&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Github&lt;/strong&gt;: &lt;a href="https://github.com/omarkdev"&gt;https://github.com/omarkdev&lt;/a&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>college</category>
      <category>knowledge</category>
    </item>
    <item>
      <title>Design Patterns: Null Object</title>
      <dc:creator>Marcos Felipe</dc:creator>
      <pubDate>Tue, 14 Apr 2020 14:49:48 +0000</pubDate>
      <link>https://dev.to/omarkdev/design-patterns-null-object-4fk</link>
      <guid>https://dev.to/omarkdev/design-patterns-null-object-4fk</guid>
      <description>&lt;h4&gt;
  
  
  Nada resultará em nada
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--txJgYGf1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AO62jS9n9-fdN2T3M6haiAw.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--txJgYGf1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AO62jS9n9-fdN2T3M6haiAw.jpeg" alt=""&gt;&lt;/a&gt;Copo vazio — &lt;a href="https://pt.freeimages.com/photographer/thesaint-30769"&gt;Matthew Bowden&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;É muito comum criarmos métodos que possam retornar valores nulos em determinadas situações onde a informação requisitada não está presente ou algumas condições não são atendidas para executar determinada lógica de negocio. Ao utilizar essa abordagem, pode ser necessário criar verificações do código para garantir que eles não sejam nulos antes de chamar algum método ou obter algum estado, pois normalmente não é possível chamar métodos em referências nulas. Muitas pessoas chamam isso de “programação defensiva” e como consequência acabam criando verificações quando intuitivamente não fazem sentido, mas isso demonstra que na verdade o que acontece é que o controle do código foi perdido.&lt;/p&gt;

&lt;p&gt;Os problemas de se essa abordagem não é algo novo em nossa área, tanto que &lt;a href="https://en.wikipedia.org/wiki/Tony_Hoare"&gt;Tony Hoare&lt;/a&gt; em sua apresentação na QCon Lodon 2009 chamou isso de “&lt;a href="https://www.infoq.com/presentations/Null-References-The-Billion-Dollar-Mistake-Tony-Hoare/"&gt;erro de bilhões de dólares&lt;/a&gt;” e pediu desculpas por inventar a referência nula.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I call it my billion-dollar mistake. It was the invention of the null reference in 1965. At that time, I was designing the first comprehensive type system for references in an object oriented language (&lt;a href="https://en.wikipedia.org/wiki/ALGOL_W"&gt;ALGOL W&lt;/a&gt;). My goal was to ensure that all use of references should be absolutely safe, with checking performed automatically by the compiler. But I couldn’t resist the temptation to put in a null reference, simply because it was so easy to implement. This has led to innumerable errors, vulnerabilities, and system crashes, which have probably caused a billion dollars of pain and damage in the last forty years.&lt;br&gt;&lt;br&gt;
— Tony Hoare&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Quando falamos especificamente sobre orientação a objetos, trabalhar com referência nula pode ser um problema um pouco mais complexo quando analisamos o design do nosso código. Steve Smith (entre alguns outros programadores) defende no artigo&lt;a href="https://ardalis.com/nulls-break-polymorphism"&gt;&lt;em&gt;Nulls Break Polymorphism&lt;/em&gt;&lt;/a&gt; em seu blog que ao utilizar referência nula nós quebramos o polimorfismo e violamos o &lt;a href="https://deviq.com/liskov-substitution-principle/"&gt;princípio da substituição de Liskov&lt;/a&gt;do SOLID.&lt;/p&gt;

&lt;p&gt;Mas não pense que esse problema de referência nula é uma particularidade apenas de linguagens orientada a objetos. &lt;a href="https://rollbar.com/blog/top-10-javascript-errors/"&gt;No artigo &lt;em&gt;Top 10 JavaScript errors from 1000+ projects (and how to avoid them)&lt;/em&gt;&lt;/a&gt; que está no blog da empresa &lt;a href="https://rollbar.com/"&gt;Rollbar&lt;/a&gt;, podemos ver que 8 dos 10 erros são problemas de nulos e indefinidos.&lt;/p&gt;

&lt;p&gt;São várias as possibilidades que tentam ajudar resolver esse tipo de problema, uma delas é o design pattern &lt;em&gt;Null Object&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  A ideia básica
&lt;/h3&gt;

&lt;p&gt;O &lt;em&gt;Null Object&lt;/em&gt; é um design pattern que utiliza herança para criar representações válidas de um dado de valor &lt;em&gt;null&lt;/em&gt;. A intenção desse padrão é fornecer uma alternativa ao objeto original, oferecendo uma assinatura igual sem estado e comportamento.&lt;/p&gt;

&lt;p&gt;Utilizando esse padrão ao invés de a todo momento termos que escrever verificações do código antes de realizar uma operação, podemos criar uma representação não funcional do objeto esperado. Essa representação tem a mesma assinatura do objeto esperado, em linguagens orientada a objetos isso é possível implementando a mesma interface ou estendendo a mesma classe (muitas vezes abstrata) e já em linguagens que seguem outro paradigma, basta ele ter a mesma assinatura.&lt;/p&gt;

&lt;p&gt;Esta forma ajuda a evitar alguns efeitos colaterais e facilita um pouco a codificação pois não precisa tratar casos que são exceção à regra. Além disso essa forma tende a seguir um pouco mais a orientação a objetos, pois fornece abstrações em cenários desconhecidos.&lt;/p&gt;

&lt;p&gt;Agora vamos imaginar uma situação onde o nosso cliente precisa fazer &lt;em&gt;log&lt;/em&gt; de algumas informações, porém cada ambiente deverá ter um alvo de &lt;em&gt;log&lt;/em&gt; diferente, sendo que o ambiente de produção não terá &lt;em&gt;log&lt;/em&gt; nenhum e o ambiente de desenvolvimento utilizará o &lt;em&gt;log&lt;/em&gt; por console. Quem será responsável por decidir qual &lt;em&gt;log&lt;/em&gt; será utilizado é uma &lt;a href="https://sourcemaking.com/design_patterns/factory_method"&gt;&lt;em&gt;factory&lt;/em&gt;&lt;/a&gt;. Seguindo a abordagem inicial, quando o ambiente for de produção onde não deverá existir &lt;em&gt;log&lt;/em&gt;, basta retornar &lt;em&gt;null&lt;/em&gt;. Teríamos algo mais ou menos assim:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;No exemplo, temos a interface &lt;em&gt;Logger&lt;/em&gt; que representará todos os tipos de logs, temos também a &lt;em&gt;factory&lt;/em&gt; &lt;em&gt;LoggerFactory&lt;/em&gt; responsável por decidir qual mecanismo de &lt;em&gt;log&lt;/em&gt; criar baseado no ambiente e que pode retornar &lt;em&gt;null&lt;/em&gt; e por último a classe &lt;em&gt;Client&lt;/em&gt; que utiliza a factory e faz uma verificação para ver se é &lt;em&gt;null&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Com esse exemplo extremamente simples podemos notar algumas coisas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Todo lugar que for utilizar a &lt;em&gt;factory&lt;/em&gt; terá que criar uma verificação se o resultado é de valor nulo;&lt;/li&gt;
&lt;li&gt;Não é de responsabilidade do cliente saber se é nulo ou não, ele apenas quer logar suas informações;&lt;/li&gt;
&lt;li&gt;Ao escrever alguns testes para a classe &lt;em&gt;Client&lt;/em&gt; teremos alguns casos a mais para tratar essa exceção.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Podemos ver que para a nossa necessidade a possibilidade de se obter nulo é um efeito colateral desnecessário e problemático. Para solucionar isso podemos ter a seguinte solução:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eBs35v3B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/611/1%2A-aTaISB0qlaTDro7rZCWqQ.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eBs35v3B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/611/1%2A-aTaISB0qlaTDro7rZCWqQ.jpeg" alt="Diagrama de classe de exemplo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Analisando o nosso exemplo, deduzimos e comparamos com o exemplo anterior o seguinte:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O Client utiliza o &lt;em&gt;LoggerFactory&lt;/em&gt; para criar a instancia do mecanismo de &lt;em&gt;log&lt;/em&gt;, assim como no exemplo anterior;&lt;/li&gt;
&lt;li&gt;A &lt;em&gt;factory LoggerFactory&lt;/em&gt; é capaz de criar &lt;strong&gt;apenas instâncias de &lt;em&gt;Logger&lt;/em&gt;&lt;/strong&gt; , diferente do exemplo anterior que poderia criar &lt;em&gt;Logger&lt;/em&gt; e &lt;em&gt;null&lt;/em&gt;;&lt;/li&gt;
&lt;li&gt;A interface &lt;em&gt;Logger&lt;/em&gt; define o contrato que o cliente utilizará, assim como no exemplo anterior;&lt;/li&gt;
&lt;li&gt;A classe &lt;em&gt;ConsoleLogger&lt;/em&gt; implementa a interface &lt;em&gt;Logger&lt;/em&gt; e provém um comportamento funcional, assim como no exemplo anterior;&lt;/li&gt;
&lt;li&gt;A classe &lt;em&gt;NullLogger&lt;/em&gt; implementa a classe &lt;em&gt;Logger&lt;/em&gt; e provém um comportamento neutro, diferente do exemplo anterior onde não existia essa classe.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Analisando o diagrama, podemos ver que pouca coisa realmente mudou, mas ao escrevermos logo de cara é visível as mudanças.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Vendo o resultado, conseguimos compreender que agora para o &lt;em&gt;Client&lt;/em&gt; pouco importa se realmente a informação será logada ou não, ele apenas confia que a &lt;em&gt;factory&lt;/em&gt; retornou o que é necessário para aquela ação naquele contexto e agora quem for utilizar a &lt;em&gt;factory&lt;/em&gt; apenas terá a mesma confiança, além disso vemos também que diminuímos os casos de testes pois não tem mais uma exceção lógica. Resumidamente, resolvemos os 3 problemas descritos anteriormente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quando usar
&lt;/h3&gt;

&lt;p&gt;Assim como qualquer abordagem que utilizamos em nossa área, cada uma tem seus casos de uso para determinar quando usar, afinal cada uma tenta resolver problemas específico. Saber quando usar algo é um ponto fundamental na carreira da pessoa programadora, pois é isso que determina o caminho para se solucionar o problema proposto.&lt;/p&gt;

&lt;p&gt;Deveríamos usar o padrão &lt;em&gt;Null Object&lt;/em&gt;, apenas quando o cliente verificaria nulo apenas para pular a exceção ou executar uma ação padrão, diz&lt;a href="https://www.baeldung.com/author/krzysztof-woyke/"&gt;Krzysztof Woyke&lt;/a&gt; em seu artigo &lt;a href="https://www.baeldung.com/java-null-object-pattern"&gt;Introduction to the Null Object Pattern&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Como todos os padrões, o padrão &lt;em&gt;Null Object&lt;/em&gt; também tem suas vantagens e desvantagens, pois assim conseguimos definir se as vantagens valem o preço das desvantagens no nosso caso de uso, ajudando a definir quando usar o padrão.&lt;/p&gt;

&lt;h4&gt;
  
  
  Vantagens
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;O cliente consegue lidar de forma mais simples e de maneira uniforme com os respectivos objetos;&lt;/li&gt;
&lt;li&gt;Reduz a chance de exceções de ponteiro nulo (&lt;em&gt;NullPointerException);&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Com menos condicionais, menos casos de teste;&lt;/li&gt;
&lt;li&gt;Esse padrão segue os princípios gerais do &lt;a href="https://martinfowler.com/bliki/TellDontAsk.html"&gt;Tell-Don’t-Ask&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Evita quebrar o polimorfismo e violar o LSP do SOLID causado pelos valores nulos.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Desvantagens
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Pode esconder problemas que seriam pegos ao utilizar valores &lt;em&gt;null&lt;/em&gt;;&lt;/li&gt;
&lt;li&gt;Se não bem explicito para os responsáveis pela manutenção, pode ser que acabem criando desnecessariamente os &lt;em&gt;null check’s&lt;/em&gt; mesmo com essa abordagem;&lt;/li&gt;
&lt;li&gt;Pode ser necessário criar vários &lt;em&gt;NullObject’s&lt;/em&gt; aninhados devido a abstração que o &lt;em&gt;NullObject&lt;/em&gt; representa.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Um ponto importante que também deve ser levado em consideração na hora de decidir se vale a pena usar o design pattern &lt;em&gt;Null Object&lt;/em&gt; é saber que na maioria das vezes ele será utilizado com outro padrão, seja uma &lt;em&gt;factory&lt;/em&gt;, &lt;em&gt;builder&lt;/em&gt; ou outro. Isso determina saber quando usar o outro padrão também e saber se a utilização de ambos faz sentido para o caso de uso apresentado.&lt;/p&gt;

&lt;p&gt;Antes de sair colocando esse padrão em todos os seus projetos e alimentando seu ego, analise com carinho se isso que você está fazendo é algo realmente benéfico ou é algo que vai te tirar algumas noites de sono.&lt;/p&gt;

&lt;p&gt;Espero que isso te ajude de alguma forma.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Twitter&lt;/strong&gt; : &lt;a href="https://twitter.com/omarkdev"&gt;&lt;em&gt;https://twitter.com/omarkdev&lt;/em&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Github&lt;/strong&gt; : &lt;a href="https://github.com/omarkdev"&gt;&lt;em&gt;https://github.com/omarkdev&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;




</description>
      <category>architecture</category>
      <category>designpatterns</category>
      <category>design</category>
      <category>code</category>
    </item>
    <item>
      <title>Indo além do console.log</title>
      <dc:creator>Marcos Felipe</dc:creator>
      <pubDate>Tue, 07 Apr 2020 11:57:06 +0000</pubDate>
      <link>https://dev.to/omarkdev/indo-alem-do-console-log-445k</link>
      <guid>https://dev.to/omarkdev/indo-alem-do-console-log-445k</guid>
      <description>&lt;h4&gt;
  
  
  O mundo além do simples .log do console
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1c4M8C4p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Ag4E59gFj8qEH3cjqXolXQg.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1c4M8C4p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Ag4E59gFj8qEH3cjqXolXQg.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Toda pessoa que já passou pela necessidade de &lt;em&gt;debugar&lt;/em&gt; algum código em JavaScript com certeza em algum momento teve que usar o famoso console.log(). Muitos de nós ainda utiliza esse método até os dias de hoje, mesmo que alguns não gostem de admitir.&lt;/p&gt;

&lt;p&gt;Uma &lt;a href="https://blog.risingstack.com/node-js-developer-survey-results-2016/"&gt;pesquisa&lt;/a&gt; feita pelo site &lt;a href="https://risingstack.com/"&gt;Rising Stack&lt;/a&gt; em 2016 que tinha o objetivo entender como os desenvolvedores utilizam node, concluiu que cerca de ¾ das pessoas utilizam o método console.log() para encontrar erros. Mesmo que exista ferramentas que são muito melhores para &lt;em&gt;debugar&lt;/em&gt;, é inevitável o reconhecimento da facilidade e da quantidade de pessoas que ainda utilizam.&lt;/p&gt;

&lt;p&gt;Sabemos que é muito fácil utilizar o console.log() em nossos códigos, porém em alguns casos é necessário realizar algumas adaptações no &lt;em&gt;debug&lt;/em&gt; para que seja possível fazer a analise corretamente, isso devido a nossa necessidade ser diferente do propósito do método. O que muitos talvez não saibam é que a própria&lt;a href="https://console.spec.whatwg.org/"&gt;&lt;em&gt;API&lt;/em&gt; do &lt;em&gt;console&lt;/em&gt;&lt;/a&gt; oferece uma variedade de outros métodos que podem ajudar de forma mais eficiente a resolver os problemas que estamos enfrentando.&lt;/p&gt;

&lt;h3&gt;
  
  
  Log simples
&lt;/h3&gt;

&lt;p&gt;Sabemos que o que o método console.log() mais resolve são &lt;em&gt;logs&lt;/em&gt; simples, mas até mesmo os &lt;em&gt;logs&lt;/em&gt; simples podem ter algumas pequenas particularidades. Imagine uma situação onde você precise mostrar mensagens de alerta e erro. Claramente as mensagens de alerta são mais criteriosas que mensagens comuns e mensagens de erros mais criteriosas que a de alerta. Devido a criticidade desses tipos de mensagens, precisamos de um destaque maior para elas. Para ajudar nessa situação temos 2 métodos: console.warn() e console.error() .&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XvmOPQ5Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/638/1%2ArITGyS_phxdatE-8dOUQeA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XvmOPQ5Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/638/1%2ArITGyS_phxdatE-8dOUQeA.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Podemos ver no exemplo que o método warn() produz uma mensagem com o estilo de alerta e já o error() uma mensagem com estilo de erro. O exemplo também nos apresenta um método novo console.info(), esse método no &lt;em&gt;Chrome&lt;/em&gt; tem exatamente o mesmo resultado que o nosso já conhecido console.log().&lt;/p&gt;

&lt;p&gt;Mas você não precisa necessariamente ficar preso apenas no estilo já proposto pela plataforma utilizada. Os métodos de &lt;em&gt;log&lt;/em&gt; simples seguem o &lt;a href="https://en.wikipedia.org/wiki/Printf_format_string"&gt;formato de estilo &lt;em&gt;printf&lt;/em&gt;&lt;/a&gt;, caso a primeira string siga esse formato. Dessa maneira é possível fazer algumas mudanças em como nossa mensagem é apresentada, seja em sua cor ou como chamamos o método.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--omb1SCxf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/640/1%2AlUM_A36OMayl1OKJnQQ0vQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--omb1SCxf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/640/1%2AlUM_A36OMayl1OKJnQQ0vQ.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Caso o primeiro argumento contenha %c o segundo argumento aceita propriedades CSS. Com essa possibilidade até mesmo o nosso queridíssimo console.log() pode se tornar mais elegante, se necessário.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sR9OLpcR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/642/1%2Aa1vH0ZExsGo-n1Drfrshnw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sR9OLpcR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/642/1%2Aa1vH0ZExsGo-n1Drfrshnw.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Listar valores de listas ou objetos
&lt;/h3&gt;

&lt;p&gt;É impossível programar em JavaScript e não utilizar listas ou objetos. &lt;em&gt;Debugar&lt;/em&gt; essas estruturas de dados pode ser um pouco desagradável, dependendo do que é necessário. Em estruturas grandes, você encontrar valores utilizando o console.log() pode ser um pouco trabalhoso, isso quando não precisa ordená-los para facilitar a visualização. Na maioria dos casos, será necessário uma adaptação no código para facilitar o &lt;em&gt;debug&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Para tornar a visualização desses dados mais fácil a &lt;em&gt;API&lt;/em&gt; do &lt;em&gt;console&lt;/em&gt; nos oferece um método chamado console.table() que tem como objetivo montar uma tabela com os dados apresentados. O primeiro parâmetro é a estrutura de dados que você quer apresentar. Essa estrutura não precisa ser necessariamente um &lt;em&gt;array&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VXBD7Ied--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/706/1%2AWsL6Fuif-bFQRG4CqeTSdg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VXBD7Ied--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/706/1%2AWsL6Fuif-bFQRG4CqeTSdg.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No exemplo foi utilizado a biblioteca &lt;a href="https://github.com/marak/Faker.js/"&gt;Faker.js&lt;/a&gt; para criar uma estrutura com dados falsos. Podemos ver que essa estrutura fica visivelmente muito mais simples. Neste caso, a estrutura é um &lt;em&gt;array&lt;/em&gt; de objetos, mas qualquer tipo de estrutura de dados é permitido.&lt;/p&gt;

&lt;p&gt;O método sempre tentará encontrar um &lt;em&gt;index&lt;/em&gt; que represente cada item da estrutura. No caso de um &lt;em&gt;array&lt;/em&gt; é o &lt;em&gt;index&lt;/em&gt; do item dentro da lista, já em objetos é o nome da propriedade, formando assim uma tabela de chave valor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MUwEjcOi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/711/1%2AZPw2Hawte6906jeh8Wm28w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MUwEjcOi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/711/1%2AZPw2Hawte6906jeh8Wm28w.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Contagem
&lt;/h3&gt;

&lt;p&gt;Fazer a contagem de algum trecho do código pode ser extremamente necessário, seja de uma iteração, resultado de evento ou invocação de método. É bem provável que você opte por incrementar uma variável e ficar fazendo &lt;em&gt;log&lt;/em&gt; dela a cada momento necessário, porém pode ser necessário fazer alguma adaptação no código para que isso seja possível no momento em que você está desenvolvendo. Mas por que não utilizar algo nativo que facilite esse &lt;em&gt;debug&lt;/em&gt;?&lt;/p&gt;

&lt;p&gt;O método console.count() nos auxilia a realizar essas contagens de forma muito mais simples. O primeiro argumento do método (que é opcional) é uma descrição que identifica o que está sendo contado, caso o método seja chamado com a mesma descrição, sua contagem é incrementada e apresentada na tela.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aYCczS-w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/638/1%2Aw4SgHdppUmatBjYyHIPlEg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aYCczS-w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/638/1%2Aw4SgHdppUmatBjYyHIPlEg.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Também pode ser necessário reiniciar essa contagem em algum momento do nosso &lt;em&gt;debug&lt;/em&gt; e para esse problema também temos uma solução. O método console.countReset() realiza essa reinicialização na contagem. Para identificar a contagem a ser reinicializada basta informar a descrição no primeiro parâmetro, da mesma maneira que o console.count() funciona.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VN2cZAht--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/636/1%2AX1STYSzJrkswwkSegMZvbA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VN2cZAht--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/636/1%2AX1STYSzJrkswwkSegMZvbA.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Agrupamento de log’s
&lt;/h3&gt;

&lt;p&gt;Em métodos muito grandes pode ser um pouco complexo &lt;em&gt;debugar&lt;/em&gt; utilizando o &lt;em&gt;console&lt;/em&gt; caso seja necessário demonstrar várias informações diferentes. Muitas vezes optamos por colocar prefixos que nos ajudem a identificar o grupo em que a informação pertence. De qualquer maneira o nosso objetivo é tornar õ processo de &lt;em&gt;debug&lt;/em&gt; mais simples e apresentar a informação de uma forma mais agradável.&lt;/p&gt;

&lt;p&gt;Para nos ajudar, a &lt;em&gt;API&lt;/em&gt; do &lt;em&gt;console&lt;/em&gt; oferece o método console.group() que tem como objetivo agrupar os &lt;em&gt;logs&lt;/em&gt;. Esse método deve ser usado em conjunto com o nosso já conhecido console.log(). Para se utilizar, primeiro chamamos o método console.group() que recebe como parâmetro a descrição do grupo, que seria como uma identificação e todos os &lt;em&gt;logs&lt;/em&gt; que vierem após isso, entrarão nesse grupo. O mais interessante é que você pode ter mais grupos dentro de grupos, bastando apenas defini-los sequencialmente. Após fazer o &lt;em&gt;log&lt;/em&gt; de todas informações necessárias daquele grupo, é preciso chamar o método console.groupEnd() para informar que o último grupo foi finalizado, dessa maneira todos os &lt;em&gt;logs&lt;/em&gt; posteriores não vão mais pertencer à aquele grupo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bg-DxUSv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/709/1%2AsoS0vF50JdwRAt7N8WYFdQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bg-DxUSv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/709/1%2AsoS0vF50JdwRAt7N8WYFdQ.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No exemplo, foi utilizado novamente a biblioteca &lt;a href="https://github.com/marak/Faker.js/"&gt;&lt;em&gt;Faker.js&lt;/em&gt;&lt;/a&gt; para poder ilustrar melhor as informações. É possível ver no resultado o agrupamento das informações além de ser possível esconder ou mostrar o conteúdo do grupo. Caso você queira que o &lt;em&gt;log&lt;/em&gt; de um grupo comece com seu conteúdo escondido, basta utilizar o método console.groupCollapsed().&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ORhszv1w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/712/1%2ADLdPz5AtAS-t7G69zW1hjg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ORhszv1w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/712/1%2ADLdPz5AtAS-t7G69zW1hjg.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Tempo de execução
&lt;/h3&gt;

&lt;p&gt;Quando estamos com problemas de performance em nossa aplicação a primeira coisa que fazemos é tentar descobrir qual trecho está causando problemas. Para isso, precisamos descobrir quanto tempo nossos trechos de código estão levando para serem executados. Obviamente esse não é o único caso em que é necessário descobrir o tempo de execução de um trecho, mas com certeza é um dos mais frequentes. Como todas as outras necessidades já apresentadas, essa também tem muitas maneiras de solucionar. Você pode comparar datas ou até mesmo analisar visualmente os log’s simples e ver quanto tempo cada um demora para aparecer. Para tentar facilitar a nossa vida e evitar adaptações malucas em nossos códigos a &lt;em&gt;API&lt;/em&gt; do &lt;em&gt;console&lt;/em&gt; também oferece alguns métodos que podem nos ajudar.&lt;/p&gt;

&lt;p&gt;Os métodos necessários para se medir o tempo de execução de um trecho de código são console.time() e console.timeEnd(). Ambos os métodos recebem como primeiro parâmetro a descrição do que está sendo medido, essa descrição serve como um identificador, dessa maneira é possível fazer várias medições em vários trechos de código junto. O método console.time() deve ser chamado no início do trecho a ser analisado e o console.timeEnd() no final. O tempo de execução será apresentado apenas após o método console.timeEnd() for invocado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lH5DEJ6Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/635/1%2AbvB9dqLyBI6yQd3GsGlgfg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lH5DEJ6Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/635/1%2AbvB9dqLyBI6yQd3GsGlgfg.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mas dependendo da situação pode ser necessário saber durante o trecho do código quanto tempo já se passou e isso também é possível com a fantástica &lt;em&gt;API&lt;/em&gt; do &lt;em&gt;console&lt;/em&gt;. O método console.timeLog() faz um log simples durante a execução do código, diferente do console.timeEnd() que faz apenas no final. Igual aos outros métodos, esse método espera no primeiro parâmetro a descrição do que está sendo medido.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XY5DB3EV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/637/1%2AjZOrIRqug9hEdODICWNZIg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XY5DB3EV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/637/1%2AjZOrIRqug9hEdODICWNZIg.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Nem só de console vive o homem
&lt;/h3&gt;

&lt;p&gt;Mesmo não tendo apresentado todos os métodos presentes na &lt;em&gt;API&lt;/em&gt; do &lt;em&gt;console&lt;/em&gt;, é possível concluir que ainda sim é uma &lt;em&gt;API&lt;/em&gt; fantástica e nos oferece muitos métodos que podem facilitar nossas vidas em determinadas situações, porém isso não quer dizer que ela irá resolver todos os seus problemas sempre ou que substitui uma boa ferramenta de &lt;em&gt;debug&lt;/em&gt;. Cada caso é um caso, mas é inevitável a necessidade de se conhecer novas ferramentas, pois só assim você irá descobrir qual facilita mais a sua vida e te ajuda a resolver os problemas mais facilmente.&lt;/p&gt;

&lt;p&gt;Espero que isso te ajude de alguma forma.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Twitter&lt;/strong&gt; : &lt;a href="https://twitter.com/omarkdev"&gt;&lt;em&gt;https://twitter.com/omarkdev&lt;/em&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;&lt;em&gt;Github:&lt;/em&gt;&lt;/strong&gt; &lt;a href="https://github.com/omarkdev"&gt;&lt;em&gt;https://github.com/omarkdev&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;




</description>
      <category>javascript</category>
      <category>console</category>
      <category>logging</category>
    </item>
    <item>
      <title>A questão não é a receita do software e sim os ingredientes</title>
      <dc:creator>Marcos Felipe</dc:creator>
      <pubDate>Thu, 02 Apr 2020 12:13:40 +0000</pubDate>
      <link>https://dev.to/omarkdev/a-questao-nao-e-a-receita-do-software-e-sim-os-ingredientes-2ik5</link>
      <guid>https://dev.to/omarkdev/a-questao-nao-e-a-receita-do-software-e-sim-os-ingredientes-2ik5</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8VIhwLm6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AvwMNSSnuBliygo6slLLELQ.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8VIhwLm6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AvwMNSSnuBliygo6slLLELQ.jpeg" alt=""&gt;&lt;/a&gt;Photo by &lt;a href="https://unsplash.com/@karaeads?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Kara Eads&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/recipe?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Programar não é escrever uma receita de bolo?
&lt;/h4&gt;

&lt;p&gt;É bem provável que quando você começou a estudar programação, seja em uma faculdade, curso online ou pedindo ajuda para alguém, a pessoa responsável por ensinar provavelmente te disse “Programar é como uma receita de bolo, instruções contidas em uma receita”. Se pegarmos a definição de Dasgupta, Papadimitriou e Vazirani, sobre algoritmos, onde diz “algoritmos são procedimentos precisos, não ambíguos, mecânicos, eficientes e corretos”, reforçamos ainda mais essa ideia de estarmos criando sempre receitas.&lt;/p&gt;

&lt;p&gt;Vamos imaginar que passamos o dia todo criando CRUD’s em nossa API, basta seguirmos a nossa receita, não é? Afinal, fazer a operação de atualização de um valor é a mesma, certo?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;em&gt;Crie a rota para que irá atualizar os dados;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Adicione a verificação de usuário está autenticado;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Valide os dados recebidos na requisição;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Busque o registro baseado no valor recebido;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Dispare uma exceção caso não encontre nenhum registro;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Atualize os valores no banco;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Retorne para o usuário que a operação foi concluída com sucesso&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Graças a receita de 7 passos, podemos construir quase qualquer operação de atualização de um CRUD. Isso não é necessariamente um problema, pois mesmo que você procure outras maneiras de fazer isso, no final sempre irá parecer uma receita. Mesmo este processo sendo o mesmo para a maioria dos casos de CRUD, muitos podem se frustar por sempre estarem seguindo a mesma receita, outros podem até dizer “eu não estou aprendendo nada com isso”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A questão nunca foi seguir os passos a passos da nossa receita e sim saber o porquê cada ingrediente está lá. Um grande chefe de cozinha entende o motivo daqueles ingredientes estarem naquela receita.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Um chefe de cozinha ao se chegar no resultado de uma receita de um prato, provavelmente ele já teve muitas experiências com aqueles ingredientes, pois apenas desta maneira é possível concluir que aquela combinação é algo saboroso. Essa experiência que te da a capacidade de montar uma receita só acontece depois de &lt;strong&gt;muito&lt;/strong&gt; teste, pois imagine quantas vezes não foi necessário testar para se chegar as combinações de &lt;em&gt;páprica, alho e cebola em pó, pimenta-do-reino, salga e tomilho e alecrim&lt;/em&gt;, para se ter um tempero seco para churrasco?&lt;/p&gt;

&lt;p&gt;Escrever uma receita é diferente de cozinhar.&lt;/p&gt;

&lt;p&gt;No início de nossa carreiras é comum começarmos com atividades simples que seguem um passo a passo. Depois de um tempo fazendo coisas parecidas, começamos a associar o tipo do problema com as possíveis soluções, mas o aprendizado não deve parar ai.&lt;/p&gt;

&lt;p&gt;Se você utiliza um framework para gerenciar sua API, provavelmente ele tem um ORM que você usa para salvar seus dados no banco de dados, nenhum problema nisso, mas você sabe se seu ORM segue o padrão Active Record ou Data Mapper? Como seria essa receita com outros ORM’s que seguem um padrão diferente do que o seu ORM segue? Se minha aplicação é basicamente um monte de CRUD, faz sentido eu continuar utilizando meu ORM que é um Data Mapper? São esses questionamentos que importam.&lt;/p&gt;

&lt;p&gt;Conforme você for tentando resolver os problemas baseado na sua experiência já associada, você deve ir tentando adicionar novos ingredientes, ou trocar a dosagem, trocar a ordem ou remover um ingrediente. Muitas vezes começamos fritando ovo, mas você já comeu um frango à parmegiana? Então por que não tentar fazer um ovo à parmegiana?&lt;/p&gt;

&lt;p&gt;A familiaridade com o resultado é algo extremamente vantajoso, pois você sabe qual deve ser o resultado, então se você mudar algumas coisas, você tem como comparar. Se você cria as &lt;em&gt;query&lt;/em&gt; do banco de dados na mão, você pode testar um framework e comparar os quesitos que você já sabe que são importantes, e mesmo que você tenha que refazer, você aprendeu algo novo que pode te ajudar no futuro.&lt;/p&gt;

&lt;p&gt;Entender e saber utilizar uma ferramenta vai muito além de ler a documentação, é entender que ela serve para aquele caso e que os benefícios que ela está trazendo valem a pena o preço que você vai pagar. Se você resolve começar a utilizar outra biblioteca que faz gerenciamento de rotas, você pode acreditar que ela é melhor para aquele caso seu, mas você sabe se é melhor para o seu time? Ela resolveu um problema, mas o preço que você pode ter que pegar (ensinando o time, dando manutenções diferentes, migrando outras rotas) pode não valer tanto a pena. Conhecer ferramentas é diferente de se ter um resultado &lt;em&gt;over engineering&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Basicamente nossa profissão é resolver problemas com tecnologia, então quando você entende o porque e como utilizar aquele ingrediente para aquele problema, você começa a se tornar um profissional melhor e pronto para resolver mais problemas.&lt;/p&gt;

&lt;p&gt;Espero que isso te ajude de alguma forma.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Twitter&lt;/strong&gt; : &lt;a href="https://twitter.com/omarkdev"&gt;&lt;em&gt;https://twitter.com/omarkdev&lt;/em&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Github&lt;/strong&gt; : &lt;a href="https://github.com/omarkdev"&gt;&lt;em&gt;https://github.com/omarkdev&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;




</description>
      <category>learning</category>
      <category>philosophyandtech</category>
      <category>software</category>
      <category>softskills</category>
    </item>
    <item>
      <title>Novas funcionalidade do JavaScript em ES2019 (ES10)</title>
      <dc:creator>Marcos Felipe</dc:creator>
      <pubDate>Tue, 31 Mar 2020 12:07:08 +0000</pubDate>
      <link>https://dev.to/omarkdev/novas-funcionalidade-do-javascript-em-es2019-es10-192b</link>
      <guid>https://dev.to/omarkdev/novas-funcionalidade-do-javascript-em-es2019-es10-192b</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Qanu4iup--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A3JO85336i_0CqIFnfzmSjA.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Qanu4iup--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A3JO85336i_0CqIFnfzmSjA.jpeg" alt=""&gt;&lt;/a&gt;Photo by &lt;a href="https://unsplash.com/@pixel_talkies?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Nijwam Swargiary&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/news?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Faz um certo tempo que o ECMAScript 2019 foi lançado, mas pouco se vê falar ou utilizar as funcionalidades trazidas pela edição. Várias das novas funcionalidades podem ajudar muito no seu dia-a-dia em coisas que antes você precisava “implementar na mão”. Mesmo que já tenha passado algum tempo, é extremamente necessário sempre reforçamos os aprendizados e analisarmos se deixamos de passar algo.&lt;/p&gt;

&lt;p&gt;É importante saber que para rodar os exemplos que serão apresentados, você precisará do NodeJS a partir da versão 12, ou com o Chrome na versão 72.&lt;/p&gt;

&lt;h3&gt;
  
  
  Array#{flat,flatMap}
&lt;/h3&gt;

&lt;p&gt;O método flat cria um novo array concatenando todos os elementos que são sub-arrays.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;O parâmetro que esse método pode receber representa o nível de profundidade que será concatenado os sub-arrays, por ser um parâmetro opcional, caso não seja informado nenhum valor o seu valor padrão será 1. Caso você queira todos os níveis, basta informar o valor Infinity.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;É importante sabermos também que o método exclui intervalos ou elementos vazios no array.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Entendendo como o método flat funciona, fica mais fácil entendermos qual o objetivo do método flatMap. Resumidamente, o método tem o mesmo efeito usando o map seguido de um flat , dessa maneira se o seu flatMap retornar um array, ele será concatenado.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;É importante saber que o flatMap por padrão é definido com profundidade 1, que seria como chamar o flat sem parâmetros ou informando o valor 1.&lt;/p&gt;

&lt;h3&gt;
  
  
  Object.fromEntries()
&lt;/h3&gt;

&lt;p&gt;A função cria um novo objeto a partir de um &lt;a href="https://alligator.io/js/iterables/"&gt;&lt;em&gt;iterable&lt;/em&gt;&lt;/a&gt; que tenha pares chave-valor.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h3&gt;
  
  
  String#{trimStart,trimEnd}
&lt;/h3&gt;

&lt;p&gt;Os métodos trimStart e trimEnd tem quase a mesma finalidade, ambos removem os espaços em branco de algum lado de uma string, a diferença é que o trimEnd remove os espaços em branco que estão apenas no final da string e o trimStart apenas os que estão no começo.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h3&gt;
  
  
  Symbol#description
&lt;/h3&gt;

&lt;p&gt;Antigamente caso precisássemos saber qual a descrição do nosso Symbol era necessário chamar o método toString, que retornava a descrição dentro de Symbol().&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Dessa maneira antiga, caso fosse necessário obter apenas a descrição, era necessário fazer algum tipo de formatação. Para resolver isso, foi adicionado a propriedade de apenas leitura description que contém apenas a descrição do Symbol, caso o Symbol foi criado sem nenhuma descrição, a propriedade terá o valor undefined.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h3&gt;
  
  
  Parâmetros opcionais no catch
&lt;/h3&gt;

&lt;p&gt;Agora o ES10 nos permite criar blocos de try/catch sem que seja necessário fornecer o parâmetro de erro no bloco de catch.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Esse tipo de abordagem é muito útil para quando você sabe que não vai utilizar o objeto de erro.&lt;/p&gt;

&lt;h3&gt;
  
  
  Revisão de Function#toString
&lt;/h3&gt;

&lt;p&gt;Nas versões anteriores do ECMAScript, você pode imprimir o código-fonte de uma função usando o método toString, porém todos os espaços em branco e comentários eram removidos. Agora com o ES10, esses trechos são mantidos.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h3&gt;
  
  
  Estabilidade no Array#sort
&lt;/h3&gt;

&lt;p&gt;Anteriormente, o V8 (Motor do JavaScript) usava um método de ordenação chamado QuickSort para arrays que tinham mais de 10 elementos, apesar de ser um método extremamente rápido, era bem instável.&lt;/p&gt;

&lt;p&gt;A partir do V8 7.0 / Chrome 70, o V8 passou a utilizar o algoritmo TimSort.&lt;/p&gt;

&lt;p&gt;Caso você queira saber mais sobre o assunto, você pode ver a &lt;a href="https://mathiasbynens.be/demo/sort-stability"&gt;demo&lt;/a&gt; do &lt;a href="https://mathiasbynens.be/"&gt;Mathias Bynens&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Melhor formatação no JSON.stringify
&lt;/h3&gt;

&lt;p&gt;Foi adicionado uma melhoria para impedir que o JSON.stringify retorne caracteres Unicode mal formatados.&lt;/p&gt;

&lt;h3&gt;
  
  
  Melhorias no JSON
&lt;/h3&gt;

&lt;p&gt;A Sintaxe do JSON é definido pelo &lt;a href="http://www.ecma-international.org/publications/standards/Ecma-404.htm"&gt;ECMA-404&lt;/a&gt; e permanentemente corrigida pela &lt;a href="https://tools.ietf.org/html/rfc7159"&gt;RFC-7159&lt;/a&gt;, permitindo que o separador de linha (\u2028) e o separador de parágrafo (\u2029) possam ser exibidos corretamente sem disparar um erro.&lt;/p&gt;

&lt;p&gt;Espero que isso te ajude de alguma forma.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Twitter&lt;/strong&gt; : &lt;a href="https://twitter.com/omarkdev"&gt;&lt;em&gt;https://twitter.com/omarkdev&lt;/em&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;&lt;em&gt;Github&lt;/em&gt;&lt;/strong&gt; : &lt;a href="https://github.com/omarkdev"&gt;&lt;em&gt;https://github.com/omarkdev&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;




</description>
      <category>features</category>
      <category>es10</category>
      <category>javascript</category>
      <category>ecmascript2019</category>
    </item>
    <item>
      <title>Lidando com valores booleanos no JavaScript</title>
      <dc:creator>Marcos Felipe</dc:creator>
      <pubDate>Thu, 26 Mar 2020 14:42:45 +0000</pubDate>
      <link>https://dev.to/omarkdev/lidando-com-valores-booleanos-no-javascript-4l04</link>
      <guid>https://dev.to/omarkdev/lidando-com-valores-booleanos-no-javascript-4l04</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--f_kmbNaW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A19I_3a8zARS7eg1yO2N_LA.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--f_kmbNaW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A19I_3a8zARS7eg1yO2N_LA.jpeg" alt=""&gt;&lt;/a&gt;Photo by &lt;a href="https://www.freeimages.com/photographer/bosela-36184"&gt;George Bosela&lt;/a&gt; from &lt;a href="https://www.freeimages.com/"&gt;FreeImages&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Sabemos o quão importante são os valores booleanos na maioria das linguagens para se desenvolver software, mas outra coisa que sabemos também é que o JavaScript sempre está nos aguardando com novas surpresas. Lidar com booleanos no JavaScript para muitos é algo extremamente simples que não tem nada de diferente, mas para outros em alguns casos podem existir algumas particularidades não conhecidas, que são bem importante conhecermos para não nos surpreendermos no futuro.&lt;/p&gt;

&lt;p&gt;Atualmente, “acreditamos” ter 3 maneiras de se converter valores para booleanos: !!, Boolean e new Boolean.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Analisando o exemplo extremamente simples, podemos ver que as 3 maneiras funcionaram ao verificarmos se os valores &lt;strong&gt;são iguais&lt;/strong&gt; a true. Mesmo ambos funcionando, temos uma particularidade ao usar o new Boolean.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Ao verificarmos os tipos das abordagens, vemos que o new Boolean é um objeto de uma instância do booleano ao invés de um tipo primitivo. É importante sempre preferirmos tipos primitivos porque são imutáveis possibilitando compartilhar apenas referências e não ter que manter nenhum estado na instância, consequentemente são mais “baratos”. Além disso, também podemos ter problemas quando lidamos com outro tipo de comparação.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Por se tratar de um objeto quando usamos o new Boolean, ao se utilizar o comparador idêntico (onde é verificado se o valor e o tipo são iguais) passamos a ter o resultado false.&lt;/p&gt;

&lt;h3&gt;
  
  
  Os valores a serem convertidos
&lt;/h3&gt;

&lt;p&gt;A abordagem escolhida não é a unica coisa importante a se considerar ao se trabalhar com booleanos, os valores a serem convertidos também são, afinal são eles que ditam o resultado. Independente da abordagem que você escolha, o resultado de ambas será o mesmo (obviamente com a particularidade do objeto ao se utilizar new Boolean).&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Quando temos uma string com valores e um número diferente de 0, sempre resultará em true, porém esses não são os únicos valores que podemos lidar no dia-a-dia. Existe também os &lt;strong&gt;&lt;em&gt;falsy values&lt;/em&gt;&lt;/strong&gt; , que são 6 valores que se convertidos em booleano, resultarão em false.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Conhecendo os &lt;strong&gt;&lt;em&gt;falsy values&lt;/em&gt;&lt;/strong&gt; possíveis, podemos ver que &lt;em&gt;strings&lt;/em&gt; vazias e número 0 sempre resultarão em false.&lt;/p&gt;

&lt;h3&gt;
  
  
  Qual abordagem escolher?
&lt;/h3&gt;

&lt;p&gt;Cada projeto terá uma ou mais abordagens em seu código e isso é extremamente normal, pois como já vimos cada uma pode ter uma particularidade escondida. Mas se você está se perguntando quando você deve utilizar cada uma, existem algumas idéias que podem te ajudar a refletir sobre isso.&lt;/p&gt;

&lt;p&gt;Sabemos que ao utilizar o new Boolean teremos um objeto como resultado, e como também já sabemos, podemos adicionar propriedades aos objetos no JavaScript. Então, se você por algum motivo precisa de mais informações no seu “booleano”, talvez faça sentido seguir com essa abordagem.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Talvez para você utilizar a abordagem Boolean pode ser mais interessante caso você tenha abordagens mais verbosas. Porém a abordagem Boolean não serve apenas para converter valores, por se tratar um construtor, podemos utilizá-lo em alguns trechos onde temos que verificar os nossos &lt;strong&gt;&lt;em&gt;falsy values&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;E para muitos o quesito performance é extremamente importante, mesmo que ela seja miníma, para tirar essa dúvida temos um &lt;a href="https://jsperf.com/boolean-vs-not-not-vs-new-boolean"&gt;&lt;strong&gt;&lt;em&gt;teste de performance&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt; que utiliza as 3 abordagens. Aparentemente o !! é o mais rápido.&lt;/p&gt;

&lt;p&gt;Espero que isso te ajude de alguma forma.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Twitter&lt;/strong&gt; : &lt;a href="https://twitter.com/omarkdev"&gt;&lt;em&gt;https://twitter.com/omarkdev&lt;/em&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Github&lt;/strong&gt; : &lt;a href="https://github.com/omarkdev"&gt;&lt;em&gt;https://github.com/omarkdev&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;




</description>
      <category>javascript</category>
      <category>boolean</category>
    </item>
    <item>
      <title>Uma introdução prática à Reflection no PHP</title>
      <dc:creator>Marcos Felipe</dc:creator>
      <pubDate>Tue, 24 Mar 2020 11:58:20 +0000</pubDate>
      <link>https://dev.to/omarkdev/uma-introducao-pratica-a-reflection-no-php-j41</link>
      <guid>https://dev.to/omarkdev/uma-introducao-pratica-a-reflection-no-php-j41</guid>
      <description>&lt;h4&gt;
  
  
  Analisando ou modificando estruturas no PHP com PHP
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OtrGSiKn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/806/1%2Av1FteZ4sKQx1CbB8JndmDQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OtrGSiKn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/806/1%2Av1FteZ4sKQx1CbB8JndmDQ.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;São inúmeras linguagens de programação que disponibiliza mecanismos para se fazer reflexão em estruturas de dados, no PHP isso também não seria diferente. Mas antes precisamos entender, o que é &lt;strong&gt;reflexão&lt;/strong&gt;?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Em ciência da computação, &lt;strong&gt;reflexão computacional&lt;/strong&gt; (ou somente &lt;strong&gt;reflexão&lt;/strong&gt; ) é a capacidade de um programa observar ou até mesmo modificar sua estrutura ou comportamento. — Wikipedia.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Se você tem uma pequena vivência com o PHP, provavelmente já deve ter encontrado algum código “mágico” que resolve algum problema. Um exemplo um pouco comum é a injeção de dependência do Laravel (que não é exclusividade da ferramenta), vamos ver um exemplo (caso você não tenha vivência com o Laravel, não tem problema):&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Se analisarmos o exemplo, vemos que o construtor da nossa classe UserController espera uma instância de UserRepository, certo? Até aqui, sem problemas, apenas PHP. A “mágica” do Laravel acontece quando o próprio framework cria a instância de UserRepository e passa automaticamente para o nosso controller. Para isso, o framework utiliza um padrão chamado &lt;em&gt;service container&lt;/em&gt; que por outro lado utiliza uma técnica chamada injeção de dependência. Basicamente, o &lt;em&gt;service container&lt;/em&gt; analisa que a classe UserController precisa de um UserRepository para ser instanciado e cria essa instância, mas como ele sabe que ele precisa dessa instância? Com &lt;strong&gt;reflexão&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Trabalhar com &lt;strong&gt;reflexão&lt;/strong&gt; no PHP é possível graças as classes mágicas de &lt;a href="https://www.php.net/manual/pt_BR/book.reflection.php"&gt;&lt;strong&gt;Reflection&lt;/strong&gt;&lt;/a&gt; do PHP. Essas classes estão disponíveis no &lt;em&gt;core&lt;/em&gt; da linguagem desde a versão 5, então não é necessário fazer nenhuma instalação. Existem algumas classes de &lt;strong&gt;Reflection&lt;/strong&gt; no PHP, sendo que cada uma depende de onde você vai aplicar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.php.net/manual/pt_BR/class.reflectionclass.php"&gt;&lt;em&gt;ReflectionClass&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;—_ _Utilizar em classes;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.php.net/manual/pt_BR/class.reflectionextension.php"&gt;&lt;em&gt;ReflectionExtension&lt;/em&gt;&lt;/a&gt;&lt;em&gt; — Utilizar em extensões;&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.php.net/manual/pt_BR/class.reflectionfunction.php"&gt;&lt;em&gt;ReflectionFunction&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;— Utilizar em funções;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.php.net/manual/pt_BR/class.reflectionfunctionabstract.php"&gt;&lt;em&gt;ReflectionFunctionAbstract&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;— Utilizar em funções abstratas;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.php.net/manual/pt_BR/class.reflectionmethod.php"&gt;&lt;em&gt;ReflectionMethod&lt;/em&gt;&lt;/a&gt; — Utilizar em métodos;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.php.net/manual/pt_BR/class.reflectionobject.php"&gt;&lt;em&gt;ReflectionObject&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;— Utilizar em &lt;a href="https://www.php.net/manual/pt_BR/language.types.object.php"&gt;objetos&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.php.net/manual/pt_BR/class.reflectionparameter.php"&gt;&lt;em&gt;ReflectionParameter&lt;/em&gt;&lt;/a&gt; — Utilizar em parâmetros (de métodos ou funções);&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.php.net/manual/pt_BR/class.reflectionproperty.php"&gt;&lt;em&gt;ReflectionProperty&lt;/em&gt;&lt;/a&gt; — Utilizar em propriedades de classes;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.php.net/manual/pt_BR/class.reflectiontype.php"&gt;&lt;em&gt;ReflectionType&lt;/em&gt;&lt;/a&gt;&lt;em&gt; — _Utilizar para saber sobre tipos de retorno&lt;/em&gt;;_&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.php.net/manual/pt_BR/class.reflectiongenerator.php"&gt;&lt;em&gt;ReflectionGenerator&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;— Utilizar em &lt;a href="https://www.php.net/manual/pt_BR/class.generator.php"&gt;geradores&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vamos seguir com a ideia do exemplo em Laravel, mas agora fora do framework. Imagine que precisamos instanciar a classe UserController que espera uma instância de UserRepository, tudo isso fora do framework.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Analisando o nosso pequeno exemplo podemos ver que precisamos descobrir o que o construtor necessita para que possamos instanciar, tudo isso de forma “mágica”, utilizando &lt;strong&gt;reflexão&lt;/strong&gt;. Se olharmos a lista das classes disponíveis, podemos notar que existem 2 tipos de classes que chamam a nossa atenção para esse caso, são as &lt;em&gt;ReflectionParameter&lt;/em&gt; e &lt;em&gt;ReflectionMethod&lt;/em&gt;, porem olhando a assinatura é possível notar que &lt;em&gt;ReflectionParameter&lt;/em&gt; não serve diretamente para o nosso caso, pois o primeiro argumento é um &lt;a href="https://www.php.net/manual/pt_BR/language.types.callable.php"&gt;&lt;em&gt;callable&lt;/em&gt;&lt;/a&gt; e não é o caso do nosso __construct, então sobra o &lt;em&gt;ReflectionMethod&lt;/em&gt;. Então, basta instanciar a classe &lt;em&gt;ReflectionMethod&lt;/em&gt; passando o nosso controller junto com o nome do nosso método que é __construct.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Criamos a nossa reflexão do método __construct utilizando a classe &lt;em&gt;ReflectionMethod&lt;/em&gt;. O interessante de se analisar é que o método getParameters() da classe de reflexão retorna uma lista de &lt;em&gt;ReflectionParameter&lt;/em&gt; que representa cada parâmetro, ou seja, mesmo que não utilizando o &lt;em&gt;ReflectionParameter&lt;/em&gt; diretamente acabamos chegando na ideia do mesmo resultado, tudo isso graças à uma ótima API das classes. Isso não é particularidade apenas da &lt;em&gt;ReflectionMethod&lt;/em&gt;, podemos fazer o mesmo utilizando a classe &lt;em&gt;ReflectionClass&lt;/em&gt;, criando uma reflexão para o nosso controller e analisando o construtor do alvo.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Dessa maneira, conseguimos começar do nível de cima e ir acessando às nossas necessidades até o último nível. Com esses pequenos exemplos, conseguimos começar a entender como utilizar a API de reflexão do PHP e o básico (bem básico) de como um &lt;em&gt;service container&lt;/em&gt; funciona.&lt;/p&gt;

&lt;p&gt;Os exemplos podem ter ficado um pouco longos mas são bem simples, pois são apenas um começo de como a reflexão do PHP funciona, de qualquer maneira aconselho você a começar a testar cada uma das classes e entender suas particularidades e funcionalidades.&lt;/p&gt;

&lt;p&gt;Espero que isso te ajude de alguma forma.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Twitter&lt;/strong&gt; : &lt;a href="https://twitter.com/omarkdev"&gt;&lt;em&gt;https://twitter.com/omarkdev&lt;/em&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Github&lt;/strong&gt; : &lt;a href="https://github.com/omarkdev"&gt;&lt;em&gt;https://github.com/omarkdev&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;




</description>
      <category>reflections</category>
      <category>servicecontainer</category>
      <category>dip</category>
      <category>inversion</category>
    </item>
    <item>
      <title>Uma introdução prática à Decorators no TypeScript</title>
      <dc:creator>Marcos Felipe</dc:creator>
      <pubDate>Thu, 19 Mar 2020 12:22:30 +0000</pubDate>
      <link>https://dev.to/omarkdev/uma-introducao-pratica-a-decorators-no-typescript-3653</link>
      <guid>https://dev.to/omarkdev/uma-introducao-pratica-a-decorators-no-typescript-3653</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AsRPCWiqE2AWYiPyRnu81gg.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AsRPCWiqE2AWYiPyRnu81gg.jpeg"&gt;&lt;/a&gt;Photo by &lt;a href="https://unsplash.com/@flowforfrank?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Ferenc Almasi&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/decorator?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Os &lt;em&gt;decorators&lt;/em&gt; são um dos recursos mais poderosos oferecido pelo TypeScript, tendo como um dos principais objetivos ampliar funcionalidades de classes e métodos de forma simples e limpa. Atualmente, os &lt;em&gt;decorators&lt;/em&gt; são uma proposta de estágio 2 para JavaScript e estão disponíveis como um recurso experimental no TypeScript. Mesmo sendo um recurso experimental, eles já estão presentes em grandes projetos de código aberto, como o Angular e Inversify.&lt;/p&gt;

&lt;p&gt;Por ser um recurso experimental, para ser possível utilizar no TypeScript, é necessário habilitar no tsconfig.json:&lt;/p&gt;

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

{
    "compilerOptions": {
        "target": "ES5",
        "experimentalDecorators": true
    }
}


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

&lt;/div&gt;
&lt;p&gt;Ou pela linha de comando:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

tsc --target ES5 --experimentalDecorators


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

&lt;/div&gt;
&lt;p&gt;Mesmo que inicialmente os &lt;em&gt;decorators&lt;/em&gt; possam parecer mágicos, eles são simples de se entender e fáceis de se criar.&lt;/p&gt;
&lt;h3&gt;
  
  
  Mas afinal, o que é um decorator?
&lt;/h3&gt;

&lt;p&gt;O site do TypeScript descreve como:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Um Decorator é um tipo especial de declaração que pode ser anexada a uma declaração de classe, método, acessador, propriedade ou parâmetro.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Essa definição pode não explicar muito o que um &lt;em&gt;decorator&lt;/em&gt; realmente representa. Eu prefiro definir como “uma declaração especial para adicionar funcionalidades extras a uma declaração de classe, método, acessador, propriedade ou parâmetro”.&lt;/p&gt;

&lt;p&gt;Você pode ter visto em algum projeto a utilização de &lt;em&gt;decorators&lt;/em&gt;, eles utilizam o formato @expression, onde o valor expression representa uma função que fará as modificações as classes, métodos, acessadores, propriedades ou parâmetros.&lt;/p&gt;

&lt;p&gt;Para se criar um &lt;em&gt;decorator&lt;/em&gt; é bem simples. Como já previamente explicado, os &lt;em&gt;decorators&lt;/em&gt; são apenas funções, essas funções são chamadas em tempo de execução. Um exemplo bem simples é criarmos uma função log que irá realizar um console.log no alvo em que ele for utilizado, ficando desta maneira:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;Pode ser que em certas situações pode ser necessário você customizar como um &lt;em&gt;decorator&lt;/em&gt; é aplicado à uma declaração. Para isso, é necessário criar um &lt;strong&gt;&lt;em&gt;Decorator Factory&lt;/em&gt;&lt;/strong&gt; , que é uma função que retorna a expressão que será executada. Seguindo o mesmo exemplo, imagine que agora você queira adicionar um prefixo estático nos logs, o resultado seria algo assim:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Como é possível analisar, agora ao invés de recebermos o alvo como parâmetro, recebemos o parâmetro que informamos e temos que retornar uma função, que será executada.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tipos de decorators
&lt;/h3&gt;

&lt;p&gt;Ao se desenvolver &lt;em&gt;decorators&lt;/em&gt; é importante saber que existem vários tipos, esses tipos são determinados pelo alvo em que está sendo aplicado, sendo que cada tipo tem suas particularidades e assinaturas diferentes. Atualmente os tipos existentes são:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Class Decorator.&lt;/li&gt;
&lt;li&gt;Property Decorator.&lt;/li&gt;
&lt;li&gt;Method Decorator.&lt;/li&gt;
&lt;li&gt;Accessor Decorator.&lt;/li&gt;
&lt;li&gt;Parameter Decorator.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Class Decorator
&lt;/h4&gt;

&lt;p&gt;A maneira mais simples de se começar a entender os &lt;em&gt;decorators&lt;/em&gt; é começar desenvolvendo para classes. Um &lt;em&gt;decorator&lt;/em&gt; para classe deve ser declarado antes da declaração da classe. Esse &lt;em&gt;decorator&lt;/em&gt; recebe um único parâmetro que é o construtor da classe alvo.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Caso o &lt;em&gt;decorator&lt;/em&gt; retorne um valor, ele substituirá a declaração de classe pelo valor fornecido, que deve ser um construtor. Dessa maneira, diferente do exemplo acima, podemos aplicar mudanças diretas à classe, ao invés de apenas no protótipo da classe.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;É importante ressaltar que caso você decida retornar um construtor, você deve manter a mesma assinatura do alvo.&lt;/p&gt;

&lt;p&gt;Você perceberá no decorrer do aprendizado, que esse tipo de &lt;em&gt;decorator&lt;/em&gt; é o mais generalista, pois nele você pode ter acesso à classe inteira, ao invés de pequenas partes do objeto.&lt;/p&gt;

&lt;h4&gt;
  
  
  Property Decorator
&lt;/h4&gt;

&lt;p&gt;Um &lt;em&gt;decorator&lt;/em&gt; de propriedade deve ser declarado antes da declaração da propriedade. Dessa vez, o &lt;em&gt;decorator&lt;/em&gt;, recebe 2 parâmetros, target e key. O parâmetro target é o protótipo da classe em que está sendo aplicado o &lt;em&gt;decorator&lt;/em&gt;, já o parâmetro key é o nome da propriedade da classe em que está sendo aplicado o &lt;em&gt;decorator&lt;/em&gt;.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Com esse pequeno exemplo, foi mostrado na tela Task {} 'title', que representa o protótipo da classe e o nome da propriedade.&lt;/p&gt;

&lt;p&gt;Um ponto interessante e importante de se analisar, como já foi dito, recebemos como parâmetro o protótipo da classe e não sua instância, sabendo disso é possível ver no exemplo que o &lt;em&gt;decorator&lt;/em&gt; foi executado mesmo sem instanciarmos a classe, isso por que o &lt;em&gt;decorator&lt;/em&gt; é chamado no tempo de execução do arquivo. Isso deve ser levado em consideração na hora de se criar seus &lt;em&gt;decorators&lt;/em&gt; já que você não terá uma chamada no &lt;em&gt;decorator&lt;/em&gt; a cada vez que instanciar a classe.&lt;/p&gt;

&lt;p&gt;O interessante desse tipo de &lt;em&gt;decorator&lt;/em&gt; é a possibilidade de aplicar mudanças de comportamento nas propriedades.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;No exemplo, criamos um &lt;em&gt;decorator&lt;/em&gt; chamado logProperty que tem como objetivo fazer um console.log toda vez que a propriedade tiver seu valor alterado ou for acessada. Para saber o que acontece na propriedade, utilizamos os getters e setters do próprio JavaScript.&lt;/p&gt;

&lt;h4&gt;
  
  
  Method Decorator
&lt;/h4&gt;

&lt;p&gt;Para muitos esse é o tipo de &lt;em&gt;decorator&lt;/em&gt; mais útil oferecido pelo TypeScript. Um &lt;em&gt;decorator&lt;/em&gt; para métodos deve ser declarado antes da declaração do método. Ao se utilizar um &lt;em&gt;method decorator&lt;/em&gt; recebemos 3 parâmetros. O primeiro parâmetro é o target que é protótipo da classe, igual ao que vimos no &lt;em&gt;property decorator&lt;/em&gt;. O segundo parâmetro é o propertyKey que é o nome do método em que estamos aplicando. Já o último é o propertyDescriptor, que é um conjunto de propriedades que definem uma propriedade de um objeto em JavaScript, neste objeto podemos ter acesso a propriedades como: configurable, enumerable, value e writable, além de get e set. Tendo acesso nesses 3 parâmetros, somos capazes de realizar quase qualquer operação em cima de nossos métodos.&lt;/p&gt;

&lt;p&gt;Vamos imaginar um cenário onde temos um método changePassword em uma classe User e queremos alterar o enumerable deste método através de um decorator para que esse método não apareça na hora de percorrer as propriedades existentes na classe.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Neste simples exemplo, será mostrado na tela name e changePassword. Como queremos alterar o enumerable para o valor false deste método para não mostrar na tela, basta alteramos a propriedade dentro do nosso propertyDescriptor.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Agora será mostrado na tela apenas name.&lt;/p&gt;

&lt;p&gt;Esse tipo de &lt;em&gt;decorator&lt;/em&gt; é extremamente útil quando queremos aplicar mudanças no comportamento dos nossos métodos e como temos acesso a quase tudo que representa o método, se torna muito simples aplicarmos as mudanças que queremos.&lt;/p&gt;

&lt;h4&gt;
  
  
  Accessor Decorator
&lt;/h4&gt;

&lt;p&gt;Os accessor &lt;em&gt;decoratos&lt;/em&gt; são os mesmos que os &lt;em&gt;method decorators&lt;/em&gt;, mas são aplicados aos métodos &lt;em&gt;setter&lt;/em&gt; ou &lt;em&gt;getter.&lt;/em&gt;&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;É importante entender que o TypeScript não permite aplicar um &lt;em&gt;decorator&lt;/em&gt; a ambos os acessadores de um único membro. Em vez disso, deve ser aplicado o &lt;em&gt;decorator&lt;/em&gt; ao primeiro acessador especificado na ordem do objeto.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h4&gt;
  
  
  Parameter Decorator
&lt;/h4&gt;

&lt;p&gt;Por último, mas não menos importante, temos os &lt;em&gt;parameter decorators&lt;/em&gt;. Um &lt;em&gt;parameter decorator&lt;/em&gt; deve ser declarado antes da declaração de um parâmetro. Esse decorator recebe 3 parâmetros. O primeiro, como na maioria dos &lt;em&gt;decorators&lt;/em&gt; que já vimos é o target que é o protótipo da classe. O segundo é o propertyKey que é o nome do método que contém o parâmetro estamos trabalhando, bem semelhante ao que ja vimos no &lt;em&gt;method decorator&lt;/em&gt;. Já o último parâmetro, é o parameterIndex que é o número da posição do parâmetro na função, lembrando que começa a partir do 0.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Dessa maneira como estamos construindo os nossos &lt;em&gt;decorators&lt;/em&gt;, só é possível analisar o objeto e o método, qualquer alteração necessária no comportamento requer o uso do &lt;a href="https://www.typescriptlang.org/docs/handbook/decorators.html#metadata" rel="noopener noreferrer"&gt;reflect-metadata&lt;/a&gt; (que é um assunto para outro post).&lt;/p&gt;

&lt;h3&gt;
  
  
  Quando usar
&lt;/h3&gt;

&lt;p&gt;É comum quando estamos aprendendo algo novo entendermos como algo funciona mas dificilmente conseguiremos enxergar cenários para aquele aprendizado. Para alguns, não é diferente ao começar a aprender a trabalhar com os &lt;em&gt;decorators&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Os &lt;em&gt;decorators&lt;/em&gt; são extremamente úteis quando devemos adicionar ou alterar comportamento de nossos alvos através de meta-programação. Quando temos algo que pode ser considerado genérico, mas que pode ser reutilizado em vários lugares no objetivo de facilitar alguma mudança em cima do alvo, talvez seja uma ótima situação para se utilizar.&lt;/p&gt;

&lt;p&gt;Ao se começar a pensar na criação de nossos próprios &lt;em&gt;decorators&lt;/em&gt; podemos ver que um grande benefício é a reutilização, porém mesmo que isso seja uma verdade, devemos tomar muito cuidado para não acabar criando coisas extremamente complexas com várias responsabilidades e efeitos colaterais.&lt;/p&gt;

&lt;p&gt;Espero que isso te ajude de alguma forma.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Twitter&lt;/strong&gt; : &lt;a href="https://twitter.com/omarkdev" rel="noopener noreferrer"&gt;&lt;em&gt;https://twitter.com/omarkdev&lt;/em&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Github&lt;/strong&gt; : &lt;a href="https://github.com/omarkdev" rel="noopener noreferrer"&gt;&lt;em&gt;https://github.com/omarkdev&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;




</description>
      <category>javascript</category>
      <category>decorators</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Do presencial ao remoto</title>
      <dc:creator>Marcos Felipe</dc:creator>
      <pubDate>Tue, 17 Mar 2020 16:04:05 +0000</pubDate>
      <link>https://dev.to/omarkdev/do-presencial-ao-remoto-2jj6</link>
      <guid>https://dev.to/omarkdev/do-presencial-ao-remoto-2jj6</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9duzuMsR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Ad81MYrpNnfBxRcjXNSfgRg.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9duzuMsR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Ad81MYrpNnfBxRcjXNSfgRg.jpeg" alt=""&gt;&lt;/a&gt;Photo by &lt;a href="https://unsplash.com/@pperkins?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Patrick Perkins&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/work?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O modelo de trabalho remoto vem crescendo cada vez mais, seja por empresas que tenha apenas esse modelo, ou empresas que oferecem os 2 modelos de trabalho. Além disso, devido aos acontecimentos recentes, muitas empresas que tinham um modelo de trabalho presencial estão migrando para o remoto, mesmo que seja experimental ou temporário.&lt;/p&gt;

&lt;p&gt;Se você está passando por essa mudança, mesmo que seja temporário ou trocando de emprego, é importante saber que cada pessoa reage de uma maneira diferente. Tem pessoas que na mudança vão se sentir produtivas, confiantes e satisfeitas e outras já podem se sentir improdutivas, aterrorizadas ou insatisfeitas.&lt;/p&gt;

&lt;p&gt;A ideia deste artigo é apresentar algumas dicas baseado na minha experiência e aprendizado que podem ser interessantes para você nessa migração. Caso você esteja se sentindo perdido, esteja com um pouco de medo do novo modelo de trabalho ou está apenas procurando outros pontos de vista, talvez eu possa te ajudar. Mesmo com essas dicas é importante ressaltar que &lt;strong&gt;não existe um caminho único e mágico a ser seguido, cada pessoa se comporta de uma maneira, cada empresa tem processos de trabalho diferentes, por isso analisar a situação é mais importante do que procurar soluções de ouro&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Quando falo em analisar a situação, quero dizer especificamente em você analisar a si mesmo e entender como você trabalha. Observe como você trabalhava presencial, quais eram suas maiores dores e felicidades e tente imaginar quais características você deve se importar (tanto para evitar quanto para manter). Essa analise pessoal pode ser um pouco difícil no começo, mas é para isso que esse artigo foi escrito, para mostrar alguns pontos interessantes que devemos levar em conta.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rotina
&lt;/h3&gt;

&lt;p&gt;A maioria dos artigos que você encontra quando pesquisa “dicas para trabalho remoto”, dizem que você deve definir uma rotina. Bom isso pode ser um pouco de verdade, mas esses tipos de soluções prontas muitas vezes não explicam a razão para se utilizar essa abordagem, e se não tem o motivo, como você sabe se isso serve para você?&lt;/p&gt;

&lt;p&gt;Ter uma rotina na grande maioria dos casos será algo extremamente necessário, pois o seu horário de trabalho não influencia apenas na empresa mas também nas suas atividades pessoais. Essa definição de horário de trabalho pode te ajudar a definir como será a sua manhã, ou te ajudar a evitar trabalhar excessivamente. Definir o quão restrito será essa rotina também vai depender muito da sua empresa e de você. Tem empresas que funcionam em vários fuso-horários e conseguem manter uma comunicação assíncrona onde permite que cada funcionário se auto-gerencie, outras já oferecem um horário um pouco flexível e outras já determinam o horário a ser cumprido. Pode ser que mesmo com a empresa um pouco flexível ela exija que você informe uma faixa de horário que você vai estar disponível para comunicação, e mesmo que a empresa seja totalmente flexível, talvez você funcione melhor com rotinas bem definidas.&lt;/p&gt;

&lt;p&gt;Se você está começando em uma empresa nova, primeiro tente entender como ela já funciona, mas se é uma empresa que está apenas migrando do presencial para o remoto, é bem provável que a rotina seja bem parecida, pois quanto menor o impacto mais fácil é a adaptação dos funcionários e da empresa.&lt;/p&gt;

&lt;p&gt;Quando falamos em rotina, queremos dizer aquilo acontece sempre, então faz mais sentido começarmos definindo a nossa rotina com aquilo que se repete. Se a sua empresa já tem os horários definidos, seja de reuniões, rituais de scrum ou horários a ser cumprido, é bem provável que a sua rotina se adapte aos horários já definidos.&lt;/p&gt;

&lt;p&gt;Como já sabemos, precisamos entender as dores e as felicidades que existiam no modelo presencial. Para muitos ao começar com o trabalho remoto a primeira coisa que pensam é “vou acordar 5 minutos antes de começar a trabalhar”, mas você sabe o que isso impacta em você? Se você é uma pessoa que precisa de um tempo para acordar para poder começar a produzir algo, pode ser que você se sinta menos produtivo pela manhã ao seguir essa ideia. Isso não quer dizer que você precisa ser radical e seguir exatamente a mesma rotina, afinal de contas um dos pontos mais positivos do trabalho remoto é a qualidade de vida. Se com o modelo presencial você levava 3 horas para chegar no trabalho, isso não quer dizer que você precisa acordar 3 horas antes no modelo de trabalho remoto, talvez acordar meia-hora antes tenha o efeito que você precisa.&lt;/p&gt;

&lt;p&gt;Durante essa caminhada do trabalho remoto, é quase inevitável que você irá encontrar dicas ou alguém irá te dizer coisas como: “tenha um local de trabalho específico” ou “troque de roupa para começar a trabalhar”. Essas dicas são importantes pois podem te ajudar a evitar dores de cabeça que outras pessoas já tiveram, porém como já falamos, escondem o real motivo delas existirem.&lt;/p&gt;

&lt;p&gt;Para algumas pessoas trocar de roupa para começar a trabalhar pode ser necessário, pois pode passar o sentimento de estar em um escritório, mas para outros isso é extremamente desnecessário. Se você não precisa estar com uma roupa específica durante uma video-conferência (ou não tem uma video-conferência) e não tem essa necessidade de experiência de escritório, por que seguir essa dica? Trabalhar remoto está ligado mais ao seu profissionalismo do que com a roupa que você utiliza.&lt;/p&gt;

&lt;p&gt;Ter um escritório (entenda escritório como local específico de trabalho), pode ser útil para quem precisa se sentir “desligado” ao sair do ambiente, ou precisa de privacidade. Quando trabalhamos no modelo presencial, na maioria dos casos a empresa já definiu onde você irá trabalhar, qual cadeira você vai utilizar, a sala já pode estar equipada com tudo que você precisa (ar condicionado, álcool em gel, etc.), porém quando você vai para o modelo remoto, todas essas questões tem que ser decididas por você, seja diretamente ou indiretamente. Você pode optar por trabalhar em co-workings, mas ainda sim é uma escolha sua baseado nesses pontos (e em outros também). É preciso saber quais são as necessidades que você tem para poder trabalhar sem incômodos. Quase todo mundo no início começa trabalhando da mesa da cozinha, no sofá na sala ou na cama no quarto, se dessa maneira você não tem dores nas costas, interrupções e consegue desempenhar um bom trabalho, sem problemas.&lt;/p&gt;

&lt;p&gt;Por isso o auto-conhecimento é extramente importante, e se essas respostas ainda não estão respondidas por você, o único jeito é ir tentando aos poucos, mas sempre se observando.&lt;/p&gt;

&lt;h3&gt;
  
  
  Produtividade
&lt;/h3&gt;

&lt;p&gt;Acredito que produtividade seja o ponto mais impactante quando trabalhamos com essa migração. A maioria das notícias que lemos sobre trabalho remoto são voltadas em como os profissionais se tornam produtivos em trabalho remoto. Sabendo desse detalhe muitas empresas podem acreditar que terão mais entregas ao adotar esse modelo, ou até mesmo você pode se assustar quando perceber que no começo não está produtivo igual antes.&lt;/p&gt;

&lt;p&gt;No começo é totalmente normal se sentir menos produtivo. A migração entre esses modelos é algo muito impactante, agora a comunicação com o seu time é diferente, você não consegue mais chegar na mesa do lado e chamar pelo colega para te ajudar em um problema, ter um auto-gerenciamento agora é mais necessário, as interrupções agora são outras e obviamente tudo isso impacta na sua produtividade (ou na sua percepção de produtividade).&lt;/p&gt;

&lt;p&gt;Distrações, na maioria dos casos, são inevitáveis, tanto no modelo presencial quanto no remoto. A questão é entender como esses pontos que impactam na sua produtividade podem ser reduzidos. Se você é muito interrompido pela sua família enquanto trabalha em casa, um acordo é extremamente necessário. Se os elementos que estão no seu ambiente de trabalho chamam a sua atenção constantemente, tente mudar o local de trabalho.&lt;/p&gt;

&lt;p&gt;Por mais que a queda de produtividade seja uma constante, ela não vai se resolver magicamente. É necessário enfrentar os problemas que impactam essa queda de produtividade. Quando falo em enfrentar os problemas é tentar evitar que eles aconteçam e não tentar ser produtivo mesmo com os problemas ainda existindo. O artigo “&lt;a href="https://medium.com/officeless/10-li%C3%A7%C3%B5es-que-aprendi-sobre-trabalho-remoto-em-4-anos-com-um-time-distribu%C3%ADdo-fe77e7a3d5fb"&gt;10 lições que aprendi sobre trabalho remoto em 4 anos com um time distribuído&lt;/a&gt;” escrito pela &lt;a href="https://medium.com/u/e987d82f9e4a"&gt;Victoria Haidamus&lt;/a&gt;, diz que “Horas trabalhadas não são métricas de sucesso”. Não é porque você foi interrompido muito pela sua família e atrasou a entrega de uma atividade importante que você deve trabalhar 12 horas por dia, desse jeito você está apenas evitando o problema, ao invés de resolve-lo. É preciso muito cuidado no começo para não cair no falso dilema de que é preciso trabalhar mais que o horário definido para ser produtivo no remoto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Comunicação
&lt;/h3&gt;

&lt;p&gt;Até mesmo empresas que sempre trabalharam remotas em algum momento enfrentaram (ou ainda enfrentam) o problema de comunicação. A comunicação no modelo remoto é totalmente assíncrona, diferente de estar presencial com o time onde você pode interromper (e atrapalhar) o colega de trabalho para tirar uma dúvida. Aprender a lidar com esse tipo de comunicação é algo extremamente difícil. Tem pessoas que precisam de um contato mais próximo e tem outras pessoas que já conseguem trabalhar mais sozinhas. Cada tipo de pessoa vai ser impactada de uma maneira.&lt;/p&gt;

&lt;p&gt;Por ser uma comunicação assíncrona, muitas vezes ela acontece por texto, o que pode dificultar a explicação em certos casos. Tem pessoas que tem facilidade em se comunicar com texto (seja escrevendo ou lendo), outras já não, e tudo bem também. Se você é uma pessoa que tem dificuldades em se comunicar com texto, ou entende que a outra pessoa com quem precisa se comunicar vai entender melhor de outra forma, talvez seja inevitável chama-lá para uma chamada. Por mais que na maioria das vezes fazer as chamadas podem facilitar essa barreira da comunicação assíncrona, ainda sim é necessário respeitar essa característica. Não é chegar ligando já para a pessoa e esperar que ela atenda. Cada pessoa tem uma rotina diferente, pode ser que ela esteja online mas está na cozinha bebendo água. Por isso é necessário respeitar a rotina de cada um.&lt;/p&gt;

&lt;p&gt;Ao lidar com esse modelo de comunicação, o nosso trabalho também deve se adaptar. Caso aconteça muito da equipe ficar “bloqueada” esperando a resposta de alguém, talvez isso seja mais um problema de processo do que de comunicação. Você pode simplesmente pegar outra atividade enquanto espera a resposta para poder continuar a sua. São nessas situações que o auto-gerenciamento são necessário, você precisa saber se gerenciar para poder lidar com essas características que são inevitáveis.&lt;/p&gt;

&lt;p&gt;A falta de comunicação no dia-a-dia também pode ser um impacto para você. Se você saiu de um modelo presencial para ir trabalhar em casa e é uma pessoa que precisa de um contato mais próximo com as pessoas (seja para jogar conversa fora ou tirar dúvidas), pode ser que você seja bastante impactado. Sentir falta de se comunicar com pessoas durante o dia devido a uma mudança tão rápida pode ser algo bem comum. Um &lt;a href="https://ipesi.com.br/trabalho-remoto-gerara-epidemia-de-solidao-e-impactara-produtividade-das-empresas/"&gt;estudo&lt;/a&gt; feito pela A.T. Kearney diz que o número de trabalhadores remotos cresceu 115% entre 2008 e 2018, e que são justamente esses colaboradores os mais propensos a desistir do trabalho por causa da solidão. A sua adaptação da rotina pode mudar conforme esses sentimentos vão vindo, pode ser que agora você comece a fazer mais atividades com seus amigos fora do horário de trabalho para começar a ver pessoas.&lt;/p&gt;

&lt;p&gt;Os impactos vão acontecer, seja de comunicação, produtividade ou alteração de rotina, mas cabe você à lidar com eles e entender se esse modelo faz sentido para você. Quando comecei a trabalhar remoto eu me senti muito improdutivo e solitário pois sentia falta da comunicação diária com as pessoas, com o passar do tempo fui aprendendo que a improdutividade minha estava ligada mais a falta de percepção das coisas que eu estava fazendo, já a solidão era um pensamento limitado que quando começado a questionar foi possível concluir que eu continuava mantendo contato com algumas pessoas, ele era menor com certeza, mas ainda sim existia. Mesmo com esses problemas apontados não quer dizer que o trabalho remoto é ruim, muito pelo contrário, hoje eu acredito que dificilmente eu trocaria esse modelo de trabalho. Com remoto também temos muitas vantagens como: qualidade de vida, redução de custo, liberdade de local de trabalho (não que isso ocorra sempre comigo), flexibilidade, entre outras coisas. Por isso cabe a você ter o autoconhecimento e colocar na sua balança para entender qual o lado que vale mais a pena para você.&lt;/p&gt;

&lt;p&gt;Espero que isso te ajude de alguma forma.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Twitter&lt;/strong&gt; : &lt;a href="https://twitter.com/omarkdev"&gt;&lt;em&gt;https://twitter.com/omarkdev&lt;/em&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Github&lt;/strong&gt; : &lt;a href="https://github.com/omarkdev"&gt;&lt;em&gt;https://github.com/omarkdev&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;




</description>
      <category>trabalhoremoto</category>
      <category>rotinadetrabalho</category>
      <category>homeoffice</category>
    </item>
    <item>
      <title>O código perfeito</title>
      <dc:creator>Marcos Felipe</dc:creator>
      <pubDate>Thu, 12 Mar 2020 12:18:26 +0000</pubDate>
      <link>https://dev.to/omarkdev/o-codigo-perfeito-4bj8</link>
      <guid>https://dev.to/omarkdev/o-codigo-perfeito-4bj8</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cQ7Yqsuo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A4mR3IoTnSJulyd_egYBL2A.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cQ7Yqsuo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A4mR3IoTnSJulyd_egYBL2A.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Inevitavelmente um caminho que será encontrado por quem escreve códigos, em algum momento na carreira, é o da necessidade de escrever códigos melhores, pois afinal, queremos sempre resolver os problemas de formas mais simples e eficiente. Após esse caminho ser encontrado, aprendemos o quanto antes a necessidade de sempre nos questionarmos se o que está sendo entregue está dentro do que sabemos e consideramos de boa qualidade.&lt;/p&gt;

&lt;p&gt;Com o tempo e com mais aprendizados, acreditamos que fica mais fácil distinguir um código bom do ruim, mas até mesmo o código bom aparenta não estar ideal, ainda não chegou no estado da perfeição idealizado por nós.&lt;/p&gt;

&lt;p&gt;O ser humano se defronta com essa ideia de perfeição há muito tempo, isso por um lado pode ter trazido muita angústia, decepção ou esforço inútil, mas por outro lado pode ter trazido grandes avanços. Já analisando isso de uma forma mais próxima de nossa área, a busca pelo código perfeito trouxe para várias pessoas, muitos aprendizados, seja de novos padrões, linguagens ou outras maneiras de solucionar o mesmo problema, porém trouxe também muitas angústias ou decepções, afinal pode ser muito decepcionante quando seu código com toda sua bagagem de pesquisa se torna mais um problema do que uma solução.&lt;/p&gt;

&lt;p&gt;Há cerca de 25 séculos atrás, Platão criou sua versão sobre a perfeição que está diretamente ligada a nossa percepção da realidade. O filosofo defendia que a percepção da realidade é dividida em dois mundos, o mundo das ideias e o mundo dos sentidos.&lt;/p&gt;

&lt;p&gt;O mundo das ideias seria o mundo das formas perfeitas, onde se tem todas as ideias primordiais, sendo que essas ideias são eternas e perfeitas e só podem ser alcançadas pela razão. Basicamente nesse mundo é onde estão todas as “formas” que nos ajudam a definir que algo é algo. Somente com a percepção desse mundo somos capazes de saber que uma cadeira sempre será um objeto para sentar, não importa seu tamanho ou modelo.&lt;/p&gt;

&lt;p&gt;Já o mundo dos sentidos seria o mundo em que vivemos, em outras palavras o mundo material, que só pode ser percebido porque todos temos a ideia de um mundo idealizado (as formas existentes no mundo das ideias). Esse mundo é defendido como uma cópia do mundo das ideias e por se tratar uma cópia está sujeito a erros e não é eterno.&lt;/p&gt;

&lt;p&gt;Somos capazes de imaginar um código perfeito, pois essa forma está no mundo das ideias, mas jamais desenvolveremos um assim, pois o desenvolvimento pertence ao mundo dos sentidos. Qualquer código terá bugs, pontos a melhorar ou problemas de performance. Já a ideia do nosso código perfeito não, essa ideia é perfeita.&lt;/p&gt;

&lt;h3&gt;
  
  
  O paradigma da perfeição
&lt;/h3&gt;

&lt;p&gt;Vivemos em mundo imperfeito, sujeito a vários erros. Usamos os aprendizados para tentarmos chegar a perfeição e nos livrarmos dos erros, pois acreditamos que o modelo idealizado por nós do código perfeito é um objetivo factível.&lt;/p&gt;

&lt;p&gt;Infelizmente, é preciso te dizer que o código perfeito que foi idealizado por você, é impossível de ser alcançado, é uma utopia. Esse modelo que você idealiza como a perfeição, é incapaz de ser alcançado. Você não sabe exatamente o que falta para seu código ficar perfeito, mas você sabe que não está bom. O código respondeu a todas as necessidades com maestria, mas você ainda idealiza que ele não está bom.&lt;/p&gt;

&lt;p&gt;Essa busca pela perfeição gera frustração naquele que tenta trazer para a realidade sua ideia imaginária de perfeição. A frustração muitas vezes impede o executor de continuar sua tarefa, pois o que foi executado não importa mais, importa apenas é a aproximação do mundo real com o imaginário. Parece que a cereja do bolo é mais importante que o próprio bolo.&lt;/p&gt;

&lt;p&gt;Entender que a perfeição é algo inatingível, não é motivo para entregar resultados ruins. Não é por que é uma utopia que devemos fazer as coisas de qualquer maneira. Não se engane, até mesmo a perfeição, que é inatingível, é extramente útil como modelo de aperfeiçoamento.&lt;/p&gt;

&lt;p&gt;Outro filosofo, que inclusive foi aluno de Platão, chamado Aristóteles, defendia uma outra linha de raciocínio que pode ser o caminho de saída da angústia da busca pela perfeição: a excelência. Enquanto a perfeição é uma impossibilidade, algo inatingível, a excelência é factível, pois significa “o melhor possível”, algo atingível ao ser humano.&lt;/p&gt;

&lt;p&gt;Ser escravo da perfeição é aceitar um caminho de angústia, em contrapartida abandonar a perfeição pode nos tornar pessoas medíocres. A resposta está no meio termo. Precisamos reconhecer os limites e também de utopias para nos aperfeiçoarmos.&lt;/p&gt;

&lt;p&gt;Sabemos que não atingiremos a perfeição, mas podemos ter compromisso com a excelência e colocar o nosso melhor naquilo que fazemos.&lt;/p&gt;

&lt;p&gt;Espero que isso te ajude de alguma forma.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Twitter&lt;/strong&gt; : &lt;a href="https://twitter.com/omarkdev"&gt;&lt;em&gt;https://twitter.com/omarkdev&lt;/em&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Github:&lt;/strong&gt; &lt;a href="https://github.com/omarkdev"&gt;&lt;em&gt;https://github.com/omarkdev&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;




</description>
      <category>development</category>
      <category>code</category>
      <category>philosophy</category>
      <category>designpatterns</category>
    </item>
    <item>
      <title>Usando o operador de coalescência nula do ES2020 no JavaScript</title>
      <dc:creator>Marcos Felipe</dc:creator>
      <pubDate>Tue, 10 Mar 2020 12:30:51 +0000</pubDate>
      <link>https://dev.to/omarkdev/usando-o-operador-de-coalescencia-nula-do-es2020-no-javascript-5ecj</link>
      <guid>https://dev.to/omarkdev/usando-o-operador-de-coalescencia-nula-do-es2020-no-javascript-5ecj</guid>
      <description>&lt;h4&gt;
  
  
  Entendendo e utilizando o operador de coalescência nula que foi introduzido no ES2020
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--47RDBBMI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2AUD0TMy5p2jQtYEGqGJqDuw.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--47RDBBMI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2AUD0TMy5p2jQtYEGqGJqDuw.jpeg" alt=""&gt;&lt;/a&gt;Photo by &lt;a href="https://www.freeimages.com/photographer/hossein_kh-53992"&gt;hossein khosravi&lt;/a&gt; from &lt;a href="https://freeimages.com/"&gt;FreeImages&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Foi introduzido um novo operador para gerenciar valores indefinidos ou nulos no ECMAScript 2020. A sintaxe do novo operador são dois pontos de interrogação seguidos “??”. O operador irá retornar o valor do lado direito quando o valor do lado esquerdo for nulo ou indefinido.&lt;/p&gt;

&lt;p&gt;Atualmente a &lt;a href="https://github.com/tc39/proposal-nullish-coalescing"&gt;proposta&lt;/a&gt; de adicionar este operador está no estágio 4, que significa que está pronto para ser incluído. Você pode testar essa funcionalidade nas versões mais recentes do Chrome e Firefox.&lt;/p&gt;

&lt;p&gt;A utilização é bem simples:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h3&gt;
  
  
  Bem parecido como antigamente
&lt;/h3&gt;

&lt;p&gt;A similaridade com os outros operador &amp;amp;&amp;amp; e || é bem grande, mas por que não utilizar os operadores antigos? Esses operadores são utilizados para manipular valores &lt;em&gt;truthy&lt;/em&gt; e &lt;em&gt;falsy&lt;/em&gt;. Os valores &lt;em&gt;falsy&lt;/em&gt; são: null, undefined, false, número 0, NaN e string vazia. Já os valores &lt;em&gt;truthy&lt;/em&gt;, são todos os outros valores não &lt;em&gt;falsy&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;A particularidade dos operadores &amp;amp;&amp;amp; e || algumas vezes pode nos induzir a alguns erros. Imagine que um valor null ou undefined para você é algo que você tenha que se preocupar, mas o número 0 não, se você optar por utilizar esses operadores pode ser que você seja induzido ao erro.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Com o operador ||, o valor da direita é retornado pois o valor da esquerda é um valor &lt;em&gt;falsy&lt;/em&gt;, na qual no nosso caso é um problema. Utilizando o novo operador de coalescência nula, fica mais simples essa abordagem.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;E como já foi dito, o valor se preocupa apenas com undefined e null, todos os outros valores &lt;em&gt;falsy&lt;/em&gt; são considerados como “verdadeiro”.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Esse operador é algo extremamente simples e útil, com a evolução da especificação estamos cada vez mais prontos para lidar com essas divergências de valores.&lt;/p&gt;

&lt;p&gt;Espero que isso te ajude de alguma forma.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Twitter&lt;/strong&gt;: &lt;a href="https://twitter.com/omarkdev"&gt;&lt;em&gt;https://twitter.com/omarkdev&lt;/em&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Github&lt;/strong&gt;: &lt;a href="https://github.com/omarkdev"&gt;&lt;em&gt;https://github.com/omarkdev&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;




</description>
      <category>nullcoalescing</category>
      <category>operators</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Community owners, stop being stupid!</title>
      <dc:creator>Marcos Felipe</dc:creator>
      <pubDate>Sat, 02 Mar 2019 16:34:26 +0000</pubDate>
      <link>https://dev.to/omarkdev/community-owners-stop-being-stupid-2d1g</link>
      <guid>https://dev.to/omarkdev/community-owners-stop-being-stupid-2d1g</guid>
      <description>&lt;p&gt;How problematic is it that an influential person starts talking stupid things and people start taking it as law?&lt;/p&gt;

&lt;p&gt;I recently read an article that talked about a comparison of Fabien Potencier’s benchmarks (creator of Symfony) and Taylor Otwell (creator of Laravel). You can check the article:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@shahroznawaz/symfony-laravel-benchmark-c4721d0582f"&gt;Is Taylor Otwell Right About Fabien’s Statement on Symfony’s Benchmark?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reading this article, I thought, how a PHP community is disunited, compared with other communities (mainly like the frontend) and that is due to the fault of the owners themselves.&lt;/p&gt;

&lt;p&gt;It’s incredible how as only in our area we see specialized communities in just one area, like it would be strange a screw fan club organized by cabinetmakers. On the one hand, this is very cool because it promotes the evolution of a specific area, but this becomes a big problem when these areas begin to compete with each other and forget the purpose, which is to make the language more accessible for everyone.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is Benchmark really the priority?
&lt;/h3&gt;

&lt;p&gt;If Benchmark really were the priority, we would be talking about frameworks written in C in this article.&lt;/p&gt;

&lt;p&gt;Surely benchmark can influence our choices, but I believe for a majority of developers, it is not the priority. There are thousands of other factors influencing choice, for example: Learning curve, labor market, agility, design patterns, documentation, design, community, among other things. Why do not we just talk about these points? Or do not they talk about these points?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The environment where the application is running influences more in the benchmark than the own technology.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  “But there is a market in which they fight”
&lt;/h4&gt;

&lt;p&gt;I agree, no matter how miraculously they leave stupidity aside and do things together, you still have comparisons, because they are different products. But if they really need to fight in the market and the benchmark is their top priority, why are not they competing with Code Igniter?&lt;/p&gt;

&lt;p&gt;Basically, when that happens, everything community always says “Technologies are a means and not an end,” they ignore and try to prove that their grass is greener than the other. The worst of it all is when your followers start adopting it as truth, and things look more or less like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Your framework should provide for language evolution, not the other way round.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So &lt;a href="https://medium.com/u/d694c31ce941"&gt;Taylor Otwell&lt;/a&gt; and &lt;a href="https://medium.com/u/4ecc86a54ac5"&gt;Fabien Potencier&lt;/a&gt; (and other community owners), stop the stupid fight and promote more things for the communities, so that we will have more people using their tools and consequently evolving them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Twitter&lt;/strong&gt; : &lt;a href="https://twitter.com/omarkdev"&gt;&lt;em&gt;https://twitter.com/omarkdev&lt;/em&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;&lt;em&gt;Github:&lt;/em&gt;&lt;/strong&gt; &lt;a href="https://github.com/omarkdev"&gt;&lt;em&gt;https://github.com/omarkdev&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;




</description>
      <category>community</category>
      <category>laravel</category>
      <category>php</category>
      <category>symfony</category>
    </item>
  </channel>
</rss>
