<?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: Caio Felix</title>
    <description>The latest articles on DEV Community by Caio Felix (@chalfel).</description>
    <link>https://dev.to/chalfel</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%2F328277%2Fd2db2ddd-ff34-42ea-9a47-ef360049a463.jpeg</url>
      <title>DEV Community: Caio Felix</title>
      <link>https://dev.to/chalfel</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/chalfel"/>
    <language>en</language>
    <item>
      <title>teste</title>
      <dc:creator>Caio Felix</dc:creator>
      <pubDate>Tue, 09 Feb 2021 21:32:30 +0000</pubDate>
      <link>https://dev.to/chalfel/teste-16i8</link>
      <guid>https://dev.to/chalfel/teste-16i8</guid>
      <description></description>
    </item>
    <item>
      <title>Swift - Iniciando</title>
      <dc:creator>Caio Felix</dc:creator>
      <pubDate>Fri, 02 Oct 2020 11:17:46 +0000</pubDate>
      <link>https://dev.to/chalfel/swift-iniciando-1m6h</link>
      <guid>https://dev.to/chalfel/swift-iniciando-1m6h</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;No início de setembro tive a oportunidade de ingressar a um projeto de desenvolvimento iOS, com isso, obviamente a necessidade de entender como o Swift funciona surgiu.&lt;br&gt;
Preparei alguma de minhas anotações para facilitar com que as pessoas tenham uma curva de aprendizado menor para tal tecnologia, principalmente, os assim como eu, tiveram experiências anteriores com o javascript.&lt;/p&gt;
&lt;h2&gt;
  
  
  Variáveis e Constantes
&lt;/h2&gt;

&lt;p&gt;Variáveis e constantes no swift possuem formas mais léxicas(do inglês) para serem declaradas, diferentemente de outras linguagens, não se usa const para as constantes, mas sim "let"(tornando um tanto confuso caso você possua um background de javascript assim como eu)&lt;/p&gt;

&lt;p&gt;Sendo assim, as declarações são feitas da seguinte forma&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;thisWillNeverChange&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Hello"&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;thisWillChange&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"World"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Funções
&lt;/h2&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;getText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="nv"&gt;index&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;getText2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="nv"&gt;index&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Type Inference
&lt;/h2&gt;

&lt;p&gt;Swift é uma linguagem de programação fortemente tipada, porém também com uma inferência de tipos muito agressiva, sendo assim, não é necessário, por exemplo, declarar o tipo de uma variável caso a mesma tenha sido iniciada.&lt;/p&gt;

&lt;p&gt;Porém algo também muito interessante das declarações de estrutura de dados/tipos no swift é a opção de utilizarmos o método construtor do tipo como um valor possível, ficou um pouco confuso porem irei explicar&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* 
    Geralmente, em linguagens aonde não existe a inferência de tipos
    seria necessário definirmos o tipo e um valor inicial a variável, por exemplo
*/&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Caio"&lt;/span&gt;

&lt;span class="cm"&gt;/* 
    Porém no swift, ao definirmos um valor inicial a variável, não precisamos definir 
    seu tipo, pois o mesmo já infere para nós, ficando da seguinte forma
*/&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;lastName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Caio"&lt;/span&gt;

&lt;span class="cm"&gt;/*
    Uma outra regra do swift é que todos os atributos de uma classe/objeto precisam
    ser iniciados, porém, como fazer isso sem que seja necessário, por exemplo, 
    inicia-las através de um método construtor?
    A resposta é bem simples, utilizando o método construtor dos tipos primitivos ou
    das inúmeras estruturas de dados presentes na linguagem, por exemplo:
*/&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;company&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;contactList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Array&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

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



&lt;h2&gt;
  
  
  Arrays
&lt;/h2&gt;

&lt;p&gt;Array é uma das estruturas mais comuns e amplamente utilizadas por todas as linguagens, e o Swift também é uma delas, no caso, o mais interessante referente a tal assunto dentro do Swift, é a forma de declaração do mesmo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Um array possui diversas formas de ser declarados, as duas mais utilizadas são&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;list1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Array&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="c1"&gt;// Definindo o tipo dos itens que o Array ira possuir&lt;/span&gt;

&lt;span class="c1"&gt;// Ou&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;list2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;// Nesse caso, encapsulando o tipo dos itens de dentro do array&lt;/span&gt;

&lt;span class="cm"&gt;/*
    Como descrito anteriormente, caso queiram, é possível também utilizar o método
    construtor do mesmo para iniciarmos as variaveis
*/&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;list3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Array&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;// Ou&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;list4&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;]()&lt;/span&gt;

&lt;span class="c1"&gt;// Ou também inferindo o tipo automaticamente&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;list5&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"Hello"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"World"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Dictonary
&lt;/h2&gt;

&lt;p&gt;Dictonary são como objetos no javascript, estrutura de dados compostas por chave valor, no caso, podemos declarar um dicionário informando os tipos da chave e valor da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;myDictonary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Dictonary&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;// Ou também&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;myDictonary2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;]()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



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

&lt;p&gt;Swift é uma linguagem muito robusta e rígida, bem diferente do javascript que nos permite criar as coisas sem muitos padrões. Nos próximos posts falarei um pouco mais sobre outras estruturas presentes no swift.&lt;/p&gt;

</description>
      <category>swift</category>
      <category>ios</category>
      <category>mobile</category>
      <category>apple</category>
    </item>
    <item>
      <title>React - Entendendo useCallback e useMemo</title>
      <dc:creator>Caio Felix</dc:creator>
      <pubDate>Fri, 10 Jul 2020 17:55:44 +0000</pubDate>
      <link>https://dev.to/chalfel/react-entendendo-usecallback-e-usememo-46jj</link>
      <guid>https://dev.to/chalfel/react-entendendo-usecallback-e-usememo-46jj</guid>
      <description>&lt;h2&gt;
  
  
  Motivação
&lt;/h2&gt;

&lt;p&gt;Desde o início no mercado de programação, busquei aprender a fundo o funcionamento das linguagens e ferramentas que utilizo, esse artigo é voltado para auxiliar pessoas que também possuem essa mesma vontade&lt;/p&gt;

&lt;h2&gt;
  
  
  O mundo mágico do React
&lt;/h2&gt;

&lt;p&gt;Dentre todas libs/frameworks de Javascript para WEB, a minha favorita, sem sombra de dúvidas é o React, porém, o mesmo oferece uma falsa impressão de simplicidade quando se trata do seu funcionamento por baixo dos panos, sendo assim muito mais simples de se aprender que por exemplo o Angular, que oferece um ecossistema inteiro de possibilidades, tornando necessário basicamente o aprendizado de uma nova forma de programar para se utilizar a ferramenta.&lt;br&gt;
Quando se trata do React, temos a possibilidade de criarmos coisas rápidas e performáticas em pouco tempo, sendo possível adequar uma equipe com conhecimento em javascript muito rápido a esse padrão de mercado.&lt;br&gt;
Porém, há momentos que as coisas começam a ficar mais complexas, as aplicações começam a escalar e muitas vezes, a ter problemas de performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problemas da re-renderização
&lt;/h2&gt;

&lt;p&gt;Acho que todo desenvolvedor que já chegou a utilizar o react já obteve o problema da re-renderização excessiva de um componente por conta de um useEffect possuir uma variável/função em seu array de dependência que não para por um segundo de ser executado, porém, não consegue identificar o problema. &lt;br&gt;
O mais simples então é simplesmente remover aquele valor do mesmo, porém, ao fazer isso, o bendito ESLINT já começa a apitar, e se você, como eu, possui ativo a opção do eslint resolver os problemas possíveis ao salvar o arquivo, sabe muito bem a guerra que se iniciara com o mesmo.&lt;br&gt;
Muitas vezes então, somos tentados a utilizar artifícios como desligar a tal bendita regra, para que possamos commitar nossa modificação sem muitos problemas, e conseguirmos finalizar aquela issue que o chefe esta no nosso pescoço para entregarmos. &lt;br&gt;
Só que, como programadores, aquela pulga atrás da orelha fica nos incomodando, já que, se a regra existe, deveria ser seguida não?&lt;/p&gt;

&lt;h2&gt;
  
  
  Hooks are our saviors
&lt;/h2&gt;

&lt;p&gt;E então é aonde esse artigo realmente irá começar a fazer sentido, pois existem 2 hooks maravilhosos, porém que poucos utilizam que server exatamente para resolver esse problema. Muitas vezes os confundem, pois parecem ter a mesma finalidade, porém existem algumas diferenças bastante significativas, vamos primeiramente explica-las.&lt;/p&gt;

&lt;h2&gt;
  
  
  useMemo e sua habilidade de salvar nossa performance
&lt;/h2&gt;

&lt;p&gt;Esse subtitulo tem um cunho bem literal da palavra, mesmo parecendo algo um tanto quanto exagerado, o useMemo nos auxilia a memorizar o valor de algo, podendo ser de uma variável ou até um retorno de uma ou mais funções. &lt;br&gt;
Porém por que utiliza-lo? Embelezar o código? Vamos pensar como o react funciona, sempre que um estado do seu componente é alterado, o mesmo é renderizado novamente certo? Quando se trata dessa ação, o componente inteiro é reescrito na memória, sendo assim, seus métodos, funções e variáveis também são.&lt;br&gt;
Tendo isso em vista, imagine que, você possui uma variável que recebe o retorno de uma função complexa, por exemplo, que faz diversos cálculos para determinar o valor de desconto de um produto baseado em parâmetros determinados no perfil do usuário. &lt;br&gt;
Nessa aplicação, aonde essa função foi escrita, temos um input aonde é possível digitar o feedback sobre aquele valor, falando se o mesmo foi acima do esperado, ou abaixo. O que for digitado nesse input, sera salvo em uma variável disposta no estado do componente e com isso temos uma função que visa definir qual o valor para essa variável no estado, utilização básica do hook useState.&lt;br&gt;
Com isso, sempre que o usuário digitar algo nesse input, a conta referente ao valor com desconto será executada, imagina então, o usuário digitando um texto de 1000 letras, reclamando que realmente não gostou do valor e que esperava algo melhor, temos então, uma re-renderização do componente sendo executada 1000 vezes, e com isso, a conta também sendo executada 1000 vezes. Imagina o quanto isso pode custar para performance da sua aplicação?&lt;br&gt;
E para isso, o useMemo é utilizado, o mesmo oferece a possibilidade de adicionar um array de dependências, da mesma forma que o useEffect, para o react saber em quais momentos é necessário que aquele valor seja recriado, sendo assim, começamos a ter um controle da execução daquele valor.&lt;/p&gt;

&lt;h2&gt;
  
  
  useCallback, evitando o out of memory de cada dia
&lt;/h2&gt;

&lt;p&gt;Enquanto temos o useMemo, memorizando um valor/retorno de uma função, temos também o nosso belissimo useCallback, que ao invés de armazenar um valor, armazena uma função, evitando que a mesma seja reescrita pelo react nas renderizações de estado.&lt;br&gt;
Assim como o useMemo, fica aquela duvida, mas por que isso é realmente necessário, já que a função só ira ser reescrita, não sera reexecutada, como no useMemo. E está exatamente ai o real problema. Sempre que um estado é alterado, o componente é re-renderizado, sempre que isso acontece, as variáveis e funções são reescritas, sendo assim, causando aquele loop que comentei no início do artigo, quando uma função que encapsula um gerenciamento de estado do componente pai é enviada a um componente filho.&lt;br&gt;
Para evitarmos isso basta utilizar o useCallback, garantindo então que a aplicação deixe de reescrever tal função em memória, atendendo então as práticas recomendadas do framework e garantindo a melhor performance para sua aplicação.&lt;/p&gt;

</description>
      <category>react</category>
      <category>hooks</category>
      <category>performance</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
