<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Caio Granero on Medium]]></title>
        <description><![CDATA[Stories by Caio Granero on Medium]]></description>
        <link>https://medium.com/@caiogranero?source=rss-4b760d787849------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/2*0VET0RAGF8XuupWLbyyzmQ.png</url>
            <title>Stories by Caio Granero on Medium</title>
            <link>https://medium.com/@caiogranero?source=rss-4b760d787849------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 17 May 2026 02:59:19 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@caiogranero/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Entendo classes em JavaScript]]></title>
            <link>https://medium.com/@caiogranero/entendo-classes-em-javascript-87f1bb8e6a80?source=rss-4b760d787849------2</link>
            <guid isPermaLink="false">https://medium.com/p/87f1bb8e6a80</guid>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[prototype]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[ecmascript-6]]></category>
            <dc:creator><![CDATA[Caio Granero]]></dc:creator>
            <pubDate>Thu, 19 Jul 2018 00:00:39 GMT</pubDate>
            <atom:updated>2018-07-19T00:00:39.358Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1008/1*oLzKZEgGwgR80pNBnxu-Mw.png" /></figure><p>Se você tem trabalhado na área de desenvolvimento web nos últimos anos, deve ter ouvido comentários de agora JavaScript tem suporte nativo a Classes. Bom, tudo começou com o <a href="http://es6-features.org/">ECMAScript 6</a>, antes dele esse artigo não fazia o menor sentido e já que ele é tão importante, vale uma revisão do que foi o ECMA6.</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/1*W6aL7-RCzEOd8q1Aw-quAw.png" /><figcaption>Fluxo de leitura</figcaption></figure><h3>ECMAScript 6</h3><blockquote>Resumidamente é apenas uma versão do JavaScript lançada em 2015.</blockquote><p>Essa nova versão do JavaScript trouxe diversas novas funcionalidades que auxiliam no desenvolvimento de aplicações mais complexas, uma vez que se houve um aumento no interesse por desenvolver aplicações com <a href="https://nodejs.org/en/">Node.js</a>.</p><p>Como se pode observar no gráfico de quantidade de busca pelo termo Node.js no Google o ponto mais alto de busca foi em 2014, véspera do lançamento oficial do ECMA 6 e tem se mantido em alta desde então.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*LifgKszoy23FP1Flvm1x0Q.png" /></figure><h3>Classes</h3><blockquote><strong>Pergunta: </strong>Então quer dizer que antes do ECMA6 não era possível aplicar um comportamento de classes em JavaScript?</blockquote><blockquote><strong>Resposta: </strong>Sim, era possível!</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/320/0*PqByOg-Ymc1lxe5o.png" /></figure><h4>Simulando uma classe com prototype</h4><p>Bom, antes do ECMA6 era possível simular o comportamento de uma classe usando o <em>prototype.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/394/1*yzm7XPOL_zAxfK6b-psvNw.png" /><figcaption>Prototype</figcaption></figure><p>Basicamente <em>prototype </em>é um objeto dentro do objeto que você está utilizando e esse objeto também contém o seu próprio <em>prototype </em>e assim por diante.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/0e266e39d82e9097faa3f658e5ef2295/href">https://medium.com/media/0e266e39d82e9097faa3f658e5ef2295/href</a></iframe><p>Como podem ver, ao invés de trabalhar diretamente com classes, utilizavamos funções e definíamos métodos para elas. Para quem está aprendendo, se torna um pouco mais complexo já que o conceito de classe está abstraído no <em>prototype</em>. Entretanto, ao fim se utilizava da mesma forma que se fosse uma classe, instanciando um novo objeto e chamando seus métodos.</p><h4>Declarando uma classe pós ECMA6</h4><p>Ao invés de criarmos explicitamente uma <em>function</em>, declaramos uma <em>Class, </em>de forma muito mais simples.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/1abe9e8ca6d5ebadb3df2f0928b37dd6/href">https://medium.com/media/1abe9e8ca6d5ebadb3df2f0928b37dd6/href</a></iframe><p>Vale notar que tanto o utilizando a <em>keyword class </em>ou a <em>keyword function, </em>ao executarmos o typeof(User) ambos retornam como resultado function . Confirmando que por trás da <em>keyword class</em> nada mais é que a implementação de uma função da forma antiga.</p><h3>Heranças</h3><p>Com a chegada das classes no JavaScript, também vieram algumas outras funcionalidades desse tipo muito conhecido no universo da programação orientada a objetos. Uma delas é a Herança.</p><p>A implementação da Herança em JavaScript é com a <em>keyword extends. </em>Da mesma forma que se utiliza em Java.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/c7cf658838be7c9ee6e92f440d9c56f1/href">https://medium.com/media/c7cf658838be7c9ee6e92f440d9c56f1/href</a></iframe><h3>Getter / Setter</h3><p>Diferente de algumas linguagens de programação, JavaScript decidiu fornecer uma nomenclatura específica para declarar <em>getters </em>e <em>setters</em>.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/49427afc12f2d1e2ceb08c993e60bac9/href">https://medium.com/media/49427afc12f2d1e2ceb08c993e60bac9/href</a></iframe><p>Note que os métodos getters e setters são acessados como se fossem atributos da classe e não métodos propriamente, um comportamento diferente do que estamos acostumados.</p><h3>Métodos estáticas</h3><p>Outra das novas funcionalidades são os métodos estáticos das classes. Simplesmente utilizando a <em>tag </em>static antes do método ele já se torna estático.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/1ee012d20a7b97d5f9e674088ca9e942/href">https://medium.com/media/1ee012d20a7b97d5f9e674088ca9e942/href</a></iframe><p>Bom, essas são só algumas funções que vieram com o ECMA6 e especificamente utilizadas juntamente com as Classes em JavaScript. O site <a href="http://es6-features.org/">http://es6-features.org/</a> contém descrições sobre todas as novas funcionalidades dessa versão.</p><p>O que achou? Curtiu? Dá aquele like e deixa um comentário :)</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=87f1bb8e6a80" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Trabalhando com Throttle e Debounce em Javascript]]></title>
            <link>https://medium.com/@caiogranero/trabalhando-com-throttle-e-debounce-em-javascript-c87ffc4c4370?source=rss-4b760d787849------2</link>
            <guid isPermaLink="false">https://medium.com/p/c87ffc4c4370</guid>
            <category><![CDATA[lodash]]></category>
            <category><![CDATA[throttle]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[debounce]]></category>
            <category><![CDATA[javascript-tips]]></category>
            <dc:creator><![CDATA[Caio Granero]]></dc:creator>
            <pubDate>Thu, 28 Jun 2018 01:23:07 GMT</pubDate>
            <atom:updated>2018-07-17T02:02:40.395Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1008/1*FQN1Nf5Iy9k-H0fTRACawQ.png" /></figure><p>Se você já precisou trabalhar com eventos do browser, principalmente os de <em>resize</em>, <em>scrool </em>e movimento do <em>mouse </em>você já deve ter percebido que eles são emitidos com mais frequência do que você precisa. Os padrões <strong><em>throttle </em></strong>e <strong><em>debounce </em></strong>são formas de controlar a frequência de captura desses eventos pelo seu código e é isso que será explicado aqui. O que são as funções Throttle e Debounce? O que elas fazem? Quando e por que devemos usa-las no nosso código?</p><figure><img alt="" src="https://cdn-images-1.medium.com/proxy/1*W6aL7-RCzEOd8q1Aw-quAw.png" /><figcaption>Fluxo de leitura</figcaption></figure><h3>Throttle</h3><p>Principal função desse <em>pattern </em>é controlar a quantidade de vezes que um trecho de código será executado em um dado tempo. Sendo assim, podemos fazer com que a função x = x + 1 não seja executada mais de uma vezes dentro de 1 segundo.</p><p>Casos de uso para esse <em>pattern </em>são as funções de <em>callback </em>para os eventos <a href="https://developer.mozilla.org/pt-BR/docs/Web/Events/resize"><em>resize</em></a><em> </em>e <a href="https://developer.mozilla.org/pt-BR/docs/Web/Events/scroll"><em>scroll </em></a>do browser. A própria documentação da Mozilla para os eventos sugere a utilização dele, inclusive fornece o código da sua implementação.</p><h3>Debounce</h3><p>Apesar de ter a mesma função que o <em>Throttle</em>, controlar a execução de uma função. O <em>Debounce </em>aumenta o tempo de espera caso a chamada será acionada em um curto espaço de tempo. Sendo assim, conseguimos executar uma função após não ter sido chamada a um determinado tempo.</p><p>Casos de uso para esse <em>pattern </em>são chamadas assíncronas para campos com auto-complete e funções de <em>callback </em>de click elementos HTML. Pensando no funcionamento de um auto-complete, caso a cada digito for feito uma requisição HTTP para o servidor, a informação que irá chegar para o usuário será desatualizada. Logo, esperamos ele parar de digitar para realizar a busca.</p><h3>Implementação</h3><p>Ambas as funções podem ser encontradas já prontas nas bibliotecas <a href="https://lodash.com/">Lodash</a> e <a href="https://underscorejs.org/">undescore.js</a>. Sendo necessário executar apenas _.debounce(() =&gt; {}, 100) ou _.throttle(() =&gt; {}, 100) . Mais simples que isso não tem, certo?</p><p>Caso você não queira importar toda uma biblioteca para usar apenas 1 ou 2 funções, o lodash já pensou nisso e ele permite que você instale de forma individualmente suas funções via npm: <a href="https://www.npmjs.com/package/lodash.debounce">debounce</a> e <a href="https://www.npmjs.com/package/lodash.throttle">throttle</a>.</p><p>Mas já que estamos aqui, vamos implementar um caso de uso desses <em>patterns</em>, usarei a implementação do lodash para os exemplos.</p><h4>mousemove</h4><p>O evento <em>mousemove</em>, como o próprio nome diz, é emitido pelo browser a cada movimentação do mouse. Caso você precise capturar ele e realizar alguma operação de <em>callback</em>, em alguns segundos de utilização do sistema, você terá enchido o navegador de chamadas de funções. Esse é um bom exemplo para aplicarmos o <strong><em>debounce </em></strong>e o <strong><em>throttle</em></strong>.</p><p>Se você estiver no celular, fique apertando na aba de <em>Result</em> que tem as descrições de cada evento. Caso esteja no computador, basta mover o mouse também na aba <em>Result.</em> Em poucos segundos você poderá notar a diferença entre a utilização dos <strong><em>debounce </em></strong>e do <strong><em>throttle</em></strong>.</p><iframe src="https://cdn.embedly.com/widgets/media.html?url=https%3A%2F%2Fjsfiddle.net%2Fcaiogranero%2F7a9zxdg3%2Fembedded%2Fjs%2Cresult%2F&amp;src=https%3A%2F%2Fjsfiddle.net%2Fcaiogranero%2F7a9zxdg3%2Fembedded%2F&amp;type=text%2Fhtml&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;schema=jsfiddle" width="600" height="400" frameborder="0" scrolling="no"><a href="https://medium.com/media/76e6c5d83fc0b0522dd905ec4b13ef9b/href">https://medium.com/media/76e6c5d83fc0b0522dd905ec4b13ef9b/href</a></iframe><h3>Conclusão</h3><p>Lembre-se, sempre que for trabalhar com funções que podem ser executadas multíplas vezes seguidas em pouco tempo<em>, </em>seja por eventos do browser ou por requisições HTTP, vale a pena considerar o uso das funções <em>throttle </em>ou <em>debounce</em> para evitar problemas futuros de performance.</p><p>O que achou do artigo? Foi algo útil? Valeu a pena a leitura? Deixa um comentário de critica/melhoria e não esquece de clicar no ícone de palmas!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c87ffc4c4370" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Manipulando datas em Arrays com moment.js]]></title>
            <link>https://medium.com/@caiogranero/manipulando-datas-em-arrays-com-moment-js-6bda7390f006?source=rss-4b760d787849------2</link>
            <guid isPermaLink="false">https://medium.com/p/6bda7390f006</guid>
            <category><![CDATA[arrays]]></category>
            <category><![CDATA[webschool]]></category>
            <category><![CDATA[javascript-tips]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[momentjs]]></category>
            <dc:creator><![CDATA[Caio Granero]]></dc:creator>
            <pubDate>Fri, 22 Jun 2018 00:25:29 GMT</pubDate>
            <atom:updated>2018-06-26T02:03:24.428Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1008/1*ZFtATHCIhfL9Ub3TDONELQ.png" /></figure><p>Provavelmente você já enfrentou um problema com arrays em JavaScript e precisou manipular o conteúdo dentro dele, seja com .map, .reduce , .filter, .find<em>, </em><em>.every, </em><em>.each </em>ou qualquer outro métodos que exista no universo dos Arrays. Agora, e quando precisamos manipular Arrays e o atributo chave são as datas, o que fazer? Bom, é isso que vou tentar explicar nesse artigo :)</p><blockquote><strong><em>Pergunta: </em></strong>Esse tipo de atividade não deveria ser feita no banco de dados?</blockquote><blockquote><strong><em>Resposta:</em> </strong>Depende. Em alguns casos é menos custoso trazer os dados um pouco mais cru do banco e então, seja no servidor com Node.js ou no Browser, podendo manipular conforme sua necessidade, evitado que sejam feitas diversas requisições ao servidor ou ao banco de dados..</blockquote><p>Bom, menos papo e mais código, mas antes do conteúdo vale lembrar o fluxo de leitura :)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/375/1*W6aL7-RCzEOd8q1Aw-quAw.png" /><figcaption>Fluxo de leitura</figcaption></figure><h3><strong>moment.js</strong></h3><p>Bom, não podemos falar de manipulação de datas em JavaScript sem comentar do moment.js, certo? Certo! 😡</p><p>Para quem não conhece, <a href="http://momentjs.com"><em>moment.js</em></a> é uma biblioteca que foi desenvolvida para lidar com datas e horários em JavaScript. Farei apenas um <em>overview</em> sobre essa biblioteca que chegou em 2011 e está aí fazendo sucesso até hoje.</p><p>Tudo começa com o objeto .moment() que seria o equivalente ao new Date() que é nativo do JavaScript e esse objeto te permite validar, formatar e manipular qualquer data, em qualquer formato de uma forma muito simples.</p><pre>moment(&#39;2018-05-01&#39;, &#39;YYYY-MM-DD&#39;).format(&#39;DD/MM/YYYY&#39;)<br>&gt;&gt; 01/05/2018</pre><blockquote>Lembrando que ele também sabe lidar com fusos horários.</blockquote><h3>A estrutura dos dados</h3><p>Todos os exemplos nesse artigo irão utilizar a seguinte estrutura de dados:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/f1e3a51355e9c7fbb8097b65a81aee39/href">https://medium.com/media/f1e3a51355e9c7fbb8097b65a81aee39/href</a></iframe><h3>filter</h3><blockquote><em>O método</em> .filter <em>cria um novo array com todos os elementos do array para qual a função de filtragem fornecida retorne</em> true</blockquote><p><a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array/filtro">Array.prototype.filter()</a></p><h4>Problema: <strong>Quero selecionar todos os personagens que apareceram após o Rio</strong></h4><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/a0447ea029b0cca3125151e302ae9e1c/href">https://medium.com/media/a0447ea029b0cca3125151e302ae9e1c/href</a></iframe><p>Sempre que for manipular uma data com o moment, é necessário transforma-la em um objeto moment(), isso é feito simplesmente fornecendo a String e o formato que a data se encontra.</p><blockquote>A função .isAfter() valida se um objeto moment é depois de outro objeto moment.</blockquote><p>Na sessão <a href="https://momentjs.com/docs/#/query/"><em>query</em></a> da documentação do moment, é possível visualizar todos métodos disponíveis para validação condicional de objetos moment, como: .isBefore(), .isBetween(), .isMoment(), isSameOrBefore() .</p><h3>map</h3><p>Ok, já vimos como busca no Array mas e se precisarmos alterar o conteúdo do objeto? Bom, pra isso existe o .map</p><blockquote>O método map invoca a função callback passada por argumento para cada elemento do Array e devolve um novo Array como resultado.</blockquote><p><a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array/map">Array.prototype.map() - JavaScript | MDN</a></p><h4>Problema: Preciso do dia da semana que cada data representa.</h4><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/9d064c5ce2175b8360c3a5d9ea31bbf7/href">https://medium.com/media/9d064c5ce2175b8360c3a5d9ea31bbf7/href</a></iframe><p>Aqui usamos a função .format() que deve ser uma das mais utilizadas e mais completa função da biblioteca. Para utiliza-la, basta definir para qual formato você deseja que a data seja convertida.</p><blockquote>A função .format() é a mais completa em opções para exibição de dadas.</blockquote><h3>every / some</h3><p>E se precisarmos validar a consistência dos nossos dados? Uma abordagem é usando o every ou o some</p><p>Para os seguintes exemplos, foi alterado os dados iniciais para que tenha uma data inválida vinculada a Raquel Murillo.</p><h4>every</h4><blockquote>O método every testa se todos os elementos do array passam pelo teste implementado pela função fornecida.</blockquote><p><a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array/every">Array.prototype.every()</a></p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/d171a2ec0d4905986a23583507239375/href">https://medium.com/media/d171a2ec0d4905986a23583507239375/href</a></iframe><p>O método .isValid() é chamado a partir de um objeto moment e ele informa se a data está num formato válido considerando o formato definido. A partir da versão 2.3.0 foi adicionado um terceiro parâmetro para definir se a validação leva em consideração até os delimitadores.</p><h4>some</h4><blockquote>O método some() testa se alguns dos elementos no array passam no teste implementado pela função atribuída.</blockquote><p><a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array/some">Array.prototype.some()</a></p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/3e4f45da1f00e822e2c96cde240e2deb/href">https://medium.com/media/3e4f45da1f00e822e2c96cde240e2deb/href</a></iframe><p>Como foi possível ver, enquanto que o método every retorna true se todos os dados são compatíveis com a regra, o método some retorna true se algum dado é compatível com a regra (Não necessariamente todos).</p><h3>find</h3><p>Pode acontecer de você querer retornar apenas o primeiro item que for compatível com sua necessidade, para esses casos nós usamos o find.</p><blockquote>O método find() retorna o <strong>valor </strong>do primeiro elemento do array que satisfizer a função de teste provida. Caso contrario, <a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/undefined">undefined</a> é retornado.</blockquote><p><a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array/find">Array.prototype.find()</a></p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/c807d24b9f738b8e80789c21f218cf48/href">https://medium.com/media/c807d24b9f738b8e80789c21f218cf48/href</a></iframe><p>O retorno desse código é apenas o Professor, isso por que seguindo a ordem dos itens, o professor é o primeiro que aparece antes do Rio. Essa é a principal diferença do .find para o .filter . Enquanto um retorna o primeiro item que encontrar, o outro retorna todos.</p><h3>Conclusão</h3><p>Nesse artigo, vimos como juntar as principais funções de manipulação de <em>Array </em>com a biblioteca <em>moment.js</em>. Talvez isso nunca tenha sido uma necessidade para você, mas se um dia for, espero ter contribuído para a solução do problema.</p><p>O que achou do artigo? Foi algo útil? Valeu a pena a leitura? Deixa um comentário de critica/melhoria que ficarei felizão.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6bda7390f006" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>