<?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: Odinei Ramone</title>
    <description>The latest articles on DEV Community by Odinei Ramone (@odineiramone).</description>
    <link>https://dev.to/odineiramone</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%2F19252%2F4d43f14d-79dd-4fc8-8e65-e8a6f124f16d.jpg</url>
      <title>DEV Community: Odinei Ramone</title>
      <link>https://dev.to/odineiramone</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/odineiramone"/>
    <language>en</language>
    <item>
      <title>A filosofia coletiva no processo de desenvolvimento de software da Plataformatec</title>
      <dc:creator>Odinei Ramone</dc:creator>
      <pubDate>Thu, 27 Apr 2023 11:32:05 +0000</pubDate>
      <link>https://dev.to/odineiramone/a-filosofia-coletiva-no-processo-de-desenvolvimento-de-software-da-plataformatec-36gn</link>
      <guid>https://dev.to/odineiramone/a-filosofia-coletiva-no-processo-de-desenvolvimento-de-software-da-plataformatec-36gn</guid>
      <description>&lt;p&gt;Estava numa reunião de chapter do backend na empresa que trabalho atualmente e eu fui apresentado aos meus colegas &lt;em&gt;backenders&lt;/em&gt;. A pessoa que me apresentou informou aos presentes que eu já tinha trabalhado na &lt;a href="https://plataformatec.com/" rel="noopener noreferrer"&gt;Plataformatec&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Logo após essa informação, um dos presentes disse algo como "o pessoal da Plataformatec manja muito. Qualquer coisa eles nem codam Elixir, já mexem lá no binário e tal" e isso meio que me incomodou um pouco porque não gosto muito quando pensam que as pessoas na Plataformatec eram muito boas apenas individualmente. &lt;/p&gt;

&lt;p&gt;Não me leve a mal, nós éramos sim pessoas programadoras muito boas individualmente mas o nosso "ás na manga" era o poder do coletivo. Aproveitei a deixa para contar para as pessoas presentes como que a força da Plataformatec vinha do coletivo. &lt;/p&gt;

&lt;p&gt;Por incontáveis vezes trazíamos um problema de clientes e discutíamos soluções entre duas, três, quatro pessoas. Muitas vezes de diferentes clientes, sempre com diferentes backgrounds e, de repente, a gente tinha uma solução criada a seis, oito, ou até dez mãos!&lt;/p&gt;

&lt;p&gt;O cliente via apenas uma unidade de pessoa indo com um problema e voltando com uma solução e isso passava a impressão, eu acho, de que a gente era individualmente muito bom.&lt;/p&gt;

&lt;p&gt;Mas, na verdade, a gente era &lt;strong&gt;muito melhor&lt;/strong&gt; trabalhando em equipe!&lt;/p&gt;

&lt;p&gt;Isso era bem legal porque a gente aprendia muito. Tudo isso acontecia no meio do escritório e tinha participação de várias pessoas e, mesmo se alguém não participasse da discussão em si, escutava e aprendia. E a gente tinha um ambiente horizontal o suficiente para as pessoas se sentirem a vontade de dar a sua opinião ou expôr sua duvida independente do nível técnico.&lt;/p&gt;

&lt;p&gt;Ainda hoje eu estava vendo um corte do &lt;a href="https://vm.tiktok.com/ZMY3a1q4C" rel="noopener noreferrer"&gt;João Carvalho no podcast Desce a Letra Show&lt;/a&gt; onde ele fala a frase "O indivíduo floresce quando o individualismo morre" da pedagoga russa &lt;a href="https://pt.wikipedia.org/wiki/Nadejda_Krupskaia" rel="noopener noreferrer"&gt;Nadejda Krupiskaia&lt;/a&gt; e essa citação cai como uma luva nessa característica da Plataformatec.&lt;/p&gt;

&lt;p&gt;Nós não éramos indivíduos tentando fazer a melhor solução de forma individual. Nós éramos um coletivo tentando fazer a melhor solução de forma coletiva. E plantávamos e colhíamos os frutos disso como um coletivo. E ainda documentávamos tudo e deixar salvo para consultas futuras, o que gerou uma quantidade enorme de posts no &lt;a href="https://blog.plataformatec.com.br/" rel="noopener noreferrer"&gt;blog da empresa&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Saudades Plataformatec ❤️&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fee8f1s7mw6a0c2ce14pz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fee8f1s7mw6a0c2ce14pz.png" alt="Equipe da Plataformatec em Fevereiro de 2019" width="800" height="289"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Equipe da Plataformatec em Fevereiro de 2019&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Como fazer um café gostoso (na minha humilde opinião)</title>
      <dc:creator>Odinei Ramone</dc:creator>
      <pubDate>Mon, 20 Jun 2022 20:45:30 +0000</pubDate>
      <link>https://dev.to/odineiramone/como-fazer-um-cafe-gostoso-na-minha-humilde-opiniao-1l13</link>
      <guid>https://dev.to/odineiramone/como-fazer-um-cafe-gostoso-na-minha-humilde-opiniao-1l13</guid>
      <description>&lt;p&gt;Estava no twitter hoje quando me deparei com &lt;a href="https://twitter.com/limowreckk/status/1538935102956249092" rel="noopener noreferrer"&gt;essa pergunta:&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1538935102956249092-705" src="https://platform.twitter.com/embed/Tweet.html?id=1538935102956249092"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1538935102956249092-705');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1538935102956249092&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;@limowreckk: alguém me ensina a fazer um café gostoso? (de vdd sério)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Eu aprendi a fazer café quando trabalhei na &lt;a href="https://plataformatec.com/" rel="noopener noreferrer"&gt;Plataformatec&lt;/a&gt; e, modéstia a parte, minha mãe gosta muito do meu café.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/odineiramone/status/1538969070225195010" rel="noopener noreferrer"&gt;Respondi a Júlia numa thread&lt;/a&gt;  mas quis escrever um texto sobre isso para poder compartilhar com mais pessoas de um jeito mais fácil. &lt;/p&gt;

&lt;p&gt;Agora, sem mais delongas, vamo fazer um cafézinho?&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-986311060931186689-596" src="https://platform.twitter.com/embed/Tweet.html?id=986311060931186689"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-986311060931186689-596');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=986311060931186689&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ciclope dos X-Men diz "Ai que café gostoso" enquanto saboreia um delicioso cafézinho.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Como escolher um bom café?
&lt;/h2&gt;

&lt;p&gt;Embora você possa seguir todo o texto usando o café tradicional da sua preferência, eu encorajo você a procurar um café de mais qualidade. Qualquer café escrito especial ou gourmet na embalagem já é melhor que os cafés tradicionais.&lt;/p&gt;

&lt;p&gt;Sendo bem breve na diferença, os cafés tradicionais encontrados no mercado são torrados com várias "impurezas" como folhas e galhos. E para uniformizar o sabor, as marcas costumam torrar muito o café deixando ele muito escuro e amargo.&lt;/p&gt;

&lt;p&gt;Cafés especiais e gourmet usam apenas grãos de café na sua torra além de poderem ser encontrados em torras mais escuras e mais claras.&lt;/p&gt;

&lt;p&gt;Uma opção que eu gosto muito e é relativamente fácil de encontrar são os &lt;a href="https://www.cafe3coracoes.com.br/rituais/nossos-cafes" rel="noopener noreferrer"&gt;cafés da linha Rituais da Três Corações&lt;/a&gt;. O meu preferido é o Mogiana Paulista.&lt;/p&gt;

&lt;p&gt;Caso você queira algo mais especial, recomendo muito também os cafés do &lt;a href="https://por-um-punhado-de-dolares-cafe.lojaintegrada.com.br/cafes" rel="noopener noreferrer"&gt;Por Um Punhado de Dólares&lt;/a&gt;. O meu preferido deles é o Fuck Coffee.&lt;/p&gt;

&lt;p&gt;Cafés especiais costumam ser um pouquinho mais caros que os cafés tradicionais mas vale muito pagar um pouco mais caro pela qualidade e sabor. E com o café tradicional, caro como está (obrigado presida!) a diferença de preço nem é tanta assim.&lt;/p&gt;

&lt;h2&gt;
  
  
  Utensílios utilmente úteis
&lt;/h2&gt;

&lt;p&gt;Existem uma quase infinidade de formas de fazer o café mas aqui vamos ser simples. Um coador de plástico Melitta e filtros de papel darão conta do recado.&lt;/p&gt;

&lt;p&gt;(inclusive, uma dica para o texto: sempre que eu falar "coador" eu estou me referindo ao suporte de plástico para o filtro e quando eu falar "filtro" eu me refiro ao filtro de papel mesmo).&lt;/p&gt;

&lt;p&gt;Caso você geralmente faça poucos cafés, geralmente umas 400ml por vez (vamos falar de medidas mais tarde) eu recomendo comprar o coador e filtros número 102. Mais que isso, recomendo o 103. Caso você faça menos café por vez, há coador e filtros de numero 100.&lt;/p&gt;

&lt;p&gt;Quanto a marcas, escolha o que melhor couber o seu bolso. Eu gosto do coador e filtro da Melitta mesmo. Não é caro e funciona bem pro nosso cafezinho.&lt;/p&gt;

&lt;p&gt;Fora isso você vai precisar de um recipiente para coar o café, uma leiteira fará bem o papel.&lt;/p&gt;

&lt;p&gt;Recomendo também ter uma balança. Se não tiver, procure um conversor de medidas na internet mas uma balança na cozinha salva vidas e você consegue achar boas opções por volta dos 50 pila nas internets da vida.&lt;/p&gt;

&lt;h2&gt;
  
  
  Proporção aurea do café
&lt;/h2&gt;

&lt;p&gt;Como ponto de partida, podemos usar a proporção de 10mg de pó de café para 100ml de água. A medida do pó segue assim assim até uns 2 cafés. Mais que isso, ele vai ficando mais forte mas ai vai do seu gosto.&lt;/p&gt;

&lt;p&gt;Eu uso assim&lt;/p&gt;

&lt;p&gt;1 café = 10mg de pó&lt;br&gt;
2 cafés = 20mg de pó&lt;br&gt;
3 cafés = 28mg de pó&lt;br&gt;
4 cafés = 38~36mg de pó&lt;br&gt;
e por ai vai&lt;/p&gt;

&lt;p&gt;Importante: essas medida não são regras e eu encorajo muito que você teste fazer seus cafés variando a quantidade de pó até chegar numa proporção que te agrade mais, belezinha?&lt;/p&gt;

&lt;p&gt;Importante 2: Coloque um pouco mais de água, por volta de 100ml a mais para escaldar o filtro. Vou falar desse processo mais pra frente.&lt;/p&gt;

&lt;p&gt;Importante 3: Pode parecer meio bobo mas usar água filtrada faz diferença 😉.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mãos à obra!
&lt;/h2&gt;

&lt;p&gt;Bote a água para ferver. Enquanto isso:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;coloque o filtro no coador&lt;/li&gt;
&lt;li&gt;coloque o coador onde o café vai ser coado&lt;/li&gt;
&lt;li&gt;Aprecie sua arte&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Passar café é quase uma alquimia e deve ser apreciado.&lt;/p&gt;

&lt;p&gt;Importante, não ponha o pó de café no filtro ainda.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Água ferveu? Desligou a água.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Antes de colocar o pó no filtro, escalde o filtro. Isso serve para tirar o gosto de papel do filtro e para encharcar o mesmo assim ele não rouba seu café ;D&lt;/p&gt;

&lt;p&gt;Para escaldar o filtro, só jogar água quente nele até ela ficar bem encharcado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Essa água você joga fora.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Com o filtro devidamente escaldado, coloque a quantidade de pó que você vai usar pra fazer seu cafézinho :D&lt;/p&gt;

&lt;p&gt;Depois coloque a água quente que tava descansando no fogo desligado. É importante &lt;em&gt;não&lt;/em&gt; colocar a água fervendo pra não queimar o pó e seu café ficar com gosto de queimado.&lt;/p&gt;

&lt;p&gt;Colocar a água no café é um caso a parte. Tem gente que recomenda colocar a água de duas vezes. Tem gente que joga tudo de uma vez...&lt;/p&gt;

&lt;p&gt;Eu gosto de colocar a água toda de uma vez. Mas o importante mesmo é molhar todo o pó.&lt;/p&gt;

&lt;p&gt;Outra polêmica: Tem gente que diz que não deve mexer o pó e a água enquanto tá filtrando; tem gente que diz que não pode mexer com colher de metal...&lt;/p&gt;

&lt;p&gt;Eu dou uma mexidinha com uma colher pra ter certeza que a agua vai pegar o pó todo, principalmente se o grão estiver fininho e eu mexo com uma colher de metal porque a minha mãe faz café há mais de 40 anos mexendo com colher de metal e NINGUÉM MORREU (beijo mãe!).&lt;/p&gt;

&lt;p&gt;Agora só esperar o café passar todo e aproveitar o cafézinho ☕️&lt;/p&gt;

&lt;p&gt;Tem gente que diz que não precisa lavar o coador de plástico toda vez que fizer café para que o detergente não zoe seu café. Eu não lavo por motivos de: preguiça.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adoçar ou não adoçar o café, eis a questão?
&lt;/h2&gt;

&lt;p&gt;Tem gente que gosta de café doce e tem gente que quase tem um treco ao ouvir de adoçar o café. Eu sou do time que diz que cada pessoa tem que fazer o que achar melhor.&lt;/p&gt;

&lt;p&gt;Se você gosta de um café doce, coloque açúcar 😄&lt;br&gt;
Se você gosta de café sem açúcar, não coloque açúcar 😄&lt;/p&gt;

&lt;p&gt;O importante é não encher o saco das outras pessoas ❤️&lt;/p&gt;

&lt;p&gt;(Só por curiosidade, eu gosto de tomar café sem açúcar e morninho quase frio).&lt;/p&gt;

&lt;h2&gt;
  
  
  Finalizando
&lt;/h2&gt;

&lt;p&gt;Agradeço a galera da &lt;a href="https://plataformatec.com" rel="noopener noreferrer"&gt;Plataformatec&lt;/a&gt; por ter me ensinado a gostar de café e fazer café delícia 😋&lt;/p&gt;

&lt;p&gt;Obrigado pela atenção e até a próxima!&lt;/p&gt;

&lt;p&gt;☕️&lt;/p&gt;

</description>
      <category>coffee</category>
      <category>programming</category>
      <category>comofaz</category>
    </item>
    <item>
      <title>Como desinstalar o Rails?</title>
      <dc:creator>Odinei Ramone</dc:creator>
      <pubDate>Fri, 03 Sep 2021 06:45:32 +0000</pubDate>
      <link>https://dev.to/odineiramone/como-desinstalar-o-rails-2gg6</link>
      <guid>https://dev.to/odineiramone/como-desinstalar-o-rails-2gg6</guid>
      <description>&lt;p&gt;Bom, nem sempre as coisas acontecem como esperamos e, as vezes, precisamos desinstalar o Rails. Seja para fazer downgrade de versão, para corrigir alguma coisa na instalação ou porque simplesmente não gostamos do framework (#triste).&lt;/p&gt;

&lt;p&gt;A idéia de fazer esse post me veio depois que &lt;a href="https://github.com/MoisesBorges" rel="noopener noreferrer"&gt;um amigo&lt;/a&gt; me perguntou como ele poderia desinstalar o Rails para instalar uma versão mais antiga. Obrigado Moisés por todas as perguntas muito instigantes que você tem me feito durante seu processo de aprender Rails!&lt;/p&gt;

&lt;p&gt;E se por acaso você queira instalar a última versão do Rails, você pode seguir o &lt;a href="https://guides.rubyonrails.org/v5.0/getting_started.html#installing-rails" rel="noopener noreferrer"&gt;Rails Guides (em inglês).&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Aviso antes de zarpar 🚢!
&lt;/h2&gt;

&lt;p&gt;Tudo o que vou fazer aqui foi feito no meu computador pessoal, ele roda o MacOS 10.15.5, Ruby 2.7.1 gerenciado pelo ASDF e o meu terminal é o kitty 🐱💻.&lt;/p&gt;

&lt;p&gt;(Para quem não entendeu o porquê de eu ter dado essas informações, acho boa prática dizer qual ambiente eu estou utilizando para realizar os procedimentos e isso não quer dizer que você não vai conseguir seguir esse tutorial se tiver um ambiente totalmente diferente do meu. Caso tenha alguma dificuldade, fique a vontade para postar nos comentários desse post 😊)&lt;/p&gt;

&lt;h2&gt;
  
  
  Mãos à obra!
&lt;/h2&gt;

&lt;p&gt;Para tentar reproduzir um ambiente com mais de uma versão do Rails, instalei as versões 6.0.3.2, 5.2.4.3 e 4.2.11.3. Você pode checar as versões do Rails usando o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;→ gem list | &lt;span class="nb"&gt;grep &lt;/span&gt;rails
rails &lt;span class="o"&gt;(&lt;/span&gt;6.0.3.2, 5.2.4.3, 4.2.11.3&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O comando &lt;code&gt;gem list&lt;/code&gt; serve para listar todas as gems instaladas no seu computador. Enquanto o comando &lt;code&gt;| grep&lt;/code&gt; (a barrinha na vertical se chama pipe e se pronuncia "páip") pega o resultado do comando &lt;code&gt;gem list&lt;/code&gt; e pesquisa nele o que eu passar como argumento, o que no nosso caso é a palavra &lt;code&gt;rails&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para desinstalar uma dessas versões do Rails, podemos usar o comando &lt;code&gt;gem uninstall rails&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;→ gem uninstall rails

Select gem to uninstall:
 1. rails-4.2.11.3
 2. rails-5.2.4.3
 3. rails-6.0.3.2
 4. All versions
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Olha que legal! O comando &lt;code&gt;gem&lt;/code&gt; nos leva para uma CLI (&lt;em&gt;command line interface&lt;/em&gt; ou interface de linha de comando) onde podemos escolher, de forma interativa, qual versão do rails queremos desinstalar! Agora podemos digitar a posição da versão que queremos desinstalar ou desinstalar todas as versões! No meu caso, vou escolher a opção 2 para desinstalar o Rails 5.2.4.3.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gem uninstall rails

Select gem to uninstall:
 1. rails-4.2.11.3
 2. rails-5.2.4.3
 3. rails-6.0.3.2
 4. All versions
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; 2
Successfully uninstalled rails-5.2.4.3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uhul! Desinstalamos uma versão do Rails 🥳 🎉!&lt;/p&gt;

&lt;p&gt;Rodando denovo o &lt;code&gt;gem list | grep rails&lt;/code&gt; vemos que ele não lista mais a versão 5.2.4.3:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;→ gem list | &lt;span class="nb"&gt;grep &lt;/span&gt;rails
rails &lt;span class="o"&gt;(&lt;/span&gt;6.0.3.2, 4.2.11.3&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Outra forma de fazer a mesma coisa
&lt;/h2&gt;

&lt;p&gt;Outra forma de desinstalar uma versão de uma gem, é passar o numero da versão direto no comando &lt;code&gt;gem uninstall&lt;/code&gt;. Por exemplo, para desinstalar a versão 6.0.3.2 do Rails, podemos usar &lt;code&gt;gem uninstall rails -v 6.0.3.2&lt;/code&gt;. Vamos rodar esse comando no terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;→ gem uninstall rails &lt;span class="nt"&gt;-v&lt;/span&gt; 6.0.3.2
Successfully uninstalled rails-6.0.3.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Denovo, checando as versões do Rails instaladas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;→ gem list | &lt;span class="nb"&gt;grep &lt;/span&gt;rails
rails &lt;span class="o"&gt;(&lt;/span&gt;4.2.11.3&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uau! Ficamos apenas com uma versão do Rails instalada!&lt;/p&gt;

&lt;h2&gt;
  
  
  O Rails que me amava
&lt;/h2&gt;

&lt;p&gt;Para finalizar, podemos rodar o comando &lt;code&gt;gem uninstall rails -v 4.2.11.3&lt;/code&gt; (ou usar apenas &lt;code&gt;gem uninstall rails&lt;/code&gt; já que só temos uma versão instalada) e desinstalar todas as versões do Rails!&lt;/p&gt;

&lt;p&gt;Porém, ao rodar o comando &lt;code&gt;rails -v&lt;/code&gt; em vez de vermos uma mensagem de erro, nos deparamos com isso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;→ rails &lt;span class="nt"&gt;-v&lt;/span&gt;
Rails 6.0.3.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;"Como assim????? Eu desinstalei tudo!!!!!"&lt;/em&gt; você pode pensar, mas tem um ponto que eu não mencionei: Precisamos desinstalar todos os  &lt;em&gt;Railties&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;O Railties é a gem responsável por "colar" todas as peças do framework. É ela que faz todo o procedimento inicial para rodarmos um app Rails, nos dá comandos CLI do framework e os generators. Caso se interesse, essa gem está disponível &lt;a href="https://github.com/rails/rails/tree/master/railties" rel="noopener noreferrer"&gt;lá no GitHub.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como o Railties é uma gem, podemos desinstalar ela rodando o comando &lt;code&gt;gem uninstall railties&lt;/code&gt;. Como não estamos passando a versão, vamos entrar no modo interativo onde podemos desinstalar todas as versões da gem Railties de uma vez só:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;→ gem uninstall railties

Select gem to uninstall:
 1. railties-4.2.11.3
 2. railties-5.2.4.3
 3. railties-6.0.3.2
 4. All versions
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; 4
Successfully uninstalled railties-4.2.11.3
Successfully uninstalled railties-5.2.4.3
Remove executables:
        rails

&lt;span class="k"&gt;in &lt;/span&gt;addition to the gem? &lt;span class="o"&gt;[&lt;/span&gt;Yn]  y
Removing rails
Successfully uninstalled railties-6.0.3.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você pode notar que antes de desinstalar a ultima versão do Rails ele pergunta se você deseja desinstalar o executável de linha de comando "rails". Digite apenas "y" para "yes" (ou "s" para "sim", caso seu esteja em português) para finalizar a desinstalação. E para termos certeza que desinstalamos o Rails de uma vez por todas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rails &lt;span class="nt"&gt;-v&lt;/span&gt;
asdf: No preset version installed &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="nb"&gt;command &lt;/span&gt;rails
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto! Rails desinstalado! No seu computador, a segunda linha pode ser um pouco diferente. A minha aparece assim porque utilizo o &lt;a href="https://github.com/asdf-vm/asdf" rel="noopener noreferrer"&gt;ASDF&lt;/a&gt; para gerenciar as versões das linguagens de programação que uso no meu computador. Caso você não utilize um gerenciador para isso, recomendo que use um :D&lt;/p&gt;

&lt;h2&gt;
  
  
  Ora, ora! Um Xeroque Rolmes!
&lt;/h2&gt;

&lt;p&gt;Caso você tenha notado, sempre que rodamos o comando &lt;code&gt;gem list | grep rails&lt;/code&gt; aparecem outras gems com a palavra "rails" no nome. Essas gems são de funcionalidades descontinuadas nas versões mais novas do Rails que foram extraidas para gems externas para que as versões antigas possam continuar utilizando. Aqui no meu computador, tenho as seguintes gems dessa situação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;→ gem list | &lt;span class="nb"&gt;grep &lt;/span&gt;rails
rails-deprecated_sanitizer &lt;span class="o"&gt;(&lt;/span&gt;1.0.3&lt;span class="o"&gt;)&lt;/span&gt;
rails-dom-testing &lt;span class="o"&gt;(&lt;/span&gt;2.0.3, 1.0.9&lt;span class="o"&gt;)&lt;/span&gt;
rails-html-sanitizer &lt;span class="o"&gt;(&lt;/span&gt;1.3.0&lt;span class="o"&gt;)&lt;/span&gt;
sprockets-rails &lt;span class="o"&gt;(&lt;/span&gt;3.2.1&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para desinstalá-las, você pode usar o nosso bom e velho &lt;code&gt;gem uninstall &amp;lt;nome da gem&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Espero que tenham gostado do texto é até uma próxima! 👋&lt;/p&gt;

&lt;h2&gt;
  
  
  Fontes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/a/38607861" rel="noopener noreferrer"&gt;Stack Overflow - Uninstall Rails completely&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.jetbrains.com/pt-pt/lp/mono/" rel="noopener noreferrer"&gt;JetBrains Mono&lt;/a&gt; (essa aqui eu uso no Sublime 😆)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
    </item>
    <item>
      <title>Quando usar e quando não usar gems?</title>
      <dc:creator>Odinei Ramone</dc:creator>
      <pubDate>Fri, 03 Sep 2021 06:42:43 +0000</pubDate>
      <link>https://dev.to/odineiramone/quando-usar-e-quando-nao-usar-gems-4f56</link>
      <guid>https://dev.to/odineiramone/quando-usar-e-quando-nao-usar-gems-4f56</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Essa pergunta foi feita pelo &lt;a href="https://github.com/LeoFragozo" rel="noopener noreferrer"&gt;Leonardo Fragozo&lt;/a&gt; lá no &lt;a href="https://t.me/rubybrasil" rel="noopener noreferrer"&gt;canal Ruby Brasil no Telegram&lt;/a&gt; e achei bacana postar a resposta em forma de texto para servir de consulta para quem mais tiver esse tipo de dúvida.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nesse texto eu falo um pouco sobre a minha forma de pensar quando me deparo com essa questão. Não sei se a minha opinião é a opinião da maioria das pessoas na comunidade Ruby porém espero que você termine de ler esse texto e tenha um pouco mais de insumos para te ajudar a decidir quando usar e quando não usar gems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Um pouco sobre dependência e como decidir qual usar
&lt;/h2&gt;

&lt;p&gt;Usar uma gem significa ter uma dependência no seu projeto. Significa você ficar dependente de um código externo que você não tem muito controle. Logo, é bom pensar em quem mantém as gems que você tá usando. No caso de usar uma gem, é melhor você usar uma que seja atualizada com alguma frequencia e/ou que tenha uma empresa por trás da manutenção dela.&lt;/p&gt;

&lt;p&gt;Um lugar legal que pode ajudar muito a ver como anda a "saúde" de uma gem ("saúde" de uma gem seria se a gem recebe updates, se tem muitas &lt;em&gt;issues&lt;/em&gt; abertas, etc.) é o &lt;a href="https://www.ruby-toolbox.com" rel="noopener noreferrer"&gt;Ruby Toolbox&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Dê uma olhada na categoria &lt;a href="https://www.ruby-toolbox.com/categories/Background_Jobs?display=compact&amp;amp;order=score" rel="noopener noreferrer"&gt;&lt;em&gt;Background Jobs&lt;/em&gt;&lt;/a&gt; (processamento em segundo plano). Na página você verá um gráfico comparando o &lt;em&gt;score&lt;/em&gt; de cada gem da categoria (sinceramente, não sei como esse &lt;em&gt;score&lt;/em&gt; é calculado 😅). Mais para baixo você encontra todas as gems da categoria com informações como quantidade de downloads, quantidade de estrelas no GitHub e algumas &lt;em&gt;badges&lt;/em&gt; falando sobre a saúde do projeto:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhhx6n2ymrs7maa8vchwe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhhx6n2ymrs7maa8vchwe.png" alt="Tela com informações sobre gems de Background Jobs no site Ruby Toolbox" width="800" height="692"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Usar ou não usar gems, eis a questão
&lt;/h2&gt;

&lt;p&gt;Eu gosto de usar gems quando eu preciso de uma solução que não seja o foco do meu negócio e que seja para algo mais complexo de lidar. Um exemplo bem bom disso é autenticação. Autenticação dificilmente vai ser core no meu negócio, então eu posso delegar isso para uma gem como o &lt;a href="https://github.com/heartcombo/devise" rel="noopener noreferrer"&gt;Devise&lt;/a&gt;, por exemplo ❤️ .&lt;/p&gt;

&lt;p&gt;Outra situação onde eu posso usar uma gem é para validação de CPF. Denovo, isso não é o core do meu negócio e eu posso delegar isso para uma gem. Porém validar CPF não é algo tão complexo como autenticação. Eu posso fazer uma &lt;a href="https://www.campuscode.com.br/conteudos/codigo-ruby-para-calculo-de-validacao-de-cpf" rel="noopener noreferrer"&gt;validação mais simples&lt;/a&gt;, por exemplo, e não ter uma dependência desse tipo no meu projeto.&lt;/p&gt;

&lt;p&gt;Vamos ver outro caso aqui: Eu tenho uma loja online e preciso cotar frete nos correios e em empresas de entregas. Isso é parte do meu negócio, posso delegar para uma gem? Posso (apesar de não conhecer nenhuma gem que faça isso), porém eu teria uma dependência externa de um código que eu não tenho muito controle. Se eu fizer essa pesquisa de frete na minha aplicação, eu tenho muito mais controle das consultas e posso utilizar esses dados com mais inteligência e exibir um comparativo das empresas que fazem entregas, por exemplo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Um pouco mais de lenha na fogueira 🔥
&lt;/h2&gt;

&lt;p&gt;Antes de finalizar, quero puxar um assunto bacana aqui:  As vezes, faz sentido reinventar a roda!&lt;/p&gt;

&lt;p&gt;As vezes faz sentindo você implementar algo que não faz parte do seu negócio dentro do seu projeto. Principalmente se você estiver estudando novas tecnologias.&lt;/p&gt;

&lt;p&gt;É muito fácil pegar o Devise, por exemplo, e botar ele pra funcionar. Ele só funciona e pronto. Mas ai eu te pergunto, você sabe o que tá acontecendo embaixo dos panos ali?&lt;/p&gt;

&lt;p&gt;O próprio &lt;a href="https://github.com/heartcombo/devise/blob/master/README.md#starting-with-rails" rel="noopener noreferrer"&gt;README do Devise recomenda &lt;em&gt;não&lt;/em&gt; usá-lo se você estiver construindo sua primeira aplicação em Rails&lt;/a&gt; (eu AMO essa parte desse README)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbek7efxihuxf3o29bt1l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbek7efxihuxf3o29bt1l.png" alt="Trecho da gem Devise cuja tradução se encotra logo abaixo no texto" width="800" height="278"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Tradução: Iniciando com Rails? Se você estiver construindo sua primeira aplicação Rails, nós recomendamos que você não use o Devise. O Devise requer um bom conhecimento do Rails. Nestes casos, nós recomendamos que você começe com uma autenticação feita do zero. Aqui tem algumas fontes que podem te ajudar (fontes em inglês):&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;O livro do Michael Hartl: &lt;a href="https://www.railstutorial.org/book/modeling_users" rel="noopener noreferrer"&gt;https://www.railstutorial.org/book/modeling_users&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Railscasts com Ryan Bate: &lt;a href="http://railscasts.com/episodes/250-authentication-from-scratch" rel="noopener noreferrer"&gt;http://railscasts.com/episodes/250-authentication-from-scratch&lt;/a&gt; e &lt;a href="http://railscasts.com/episodes/250-authentication-from-scratch-revised" rel="noopener noreferrer"&gt;http://railscasts.com/episodes/250-authentication-from-scratch-revised&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Ruby on Rails no Codecademy: Authentication and Authorization: &lt;a href="https://www.codecademy.com/learn/rails-auth" rel="noopener noreferrer"&gt;https://www.codecademy.com/learn/rails-auth&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por último, mas de forma alguma menos importante, um grande amigo, o glorioso Paulo Henrique fez uma talk sobre porque, as vezes, é importante "reinventar a roda" e eu recomendo DEMAIS que ela seja assistida: &lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/l2q94BE2mA8"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Concluindo
&lt;/h2&gt;

&lt;p&gt;É um pouco complexo saber quando usar gems ou não. Acho que o que eu escrevi aqui nesse texto pode ajudar mas não deixe de desenvolver seu próprio “faro” para quando usar gems ou não.&lt;/p&gt;

&lt;p&gt;Espero que tenham gostado do texto é até uma próxima! 👋&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
    </item>
    <item>
      <title>Um comentário sobre comentários de código</title>
      <dc:creator>Odinei Ramone</dc:creator>
      <pubDate>Fri, 03 Sep 2021 06:35:14 +0000</pubDate>
      <link>https://dev.to/odineiramone/um-comentario-sobre-comentarios-de-codigo-1h4d</link>
      <guid>https://dev.to/odineiramone/um-comentario-sobre-comentarios-de-codigo-1h4d</guid>
      <description>&lt;p&gt;Comentários de código foram algo muito confuso para mim por muito tempo. Durante a faculdade, todos os professores de todas as disciplinas que abordavam programação de software sempre diziam que todo o seu código deveria ser comentado. As justificativas sempre eram no sentido de que quando você, ou outra pessoa, precisar voltar naquele trecho, o comentário iria ajudar o programador a compreender melhor o que o código está fazendo. Eu concordo com a faculdade, em partes, mas preciso dizer que acabava sempre fazendo esse tipo de comentário:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="c1"&gt;# Public: Return the sum of two numbers.&lt;/span&gt;
  &lt;span class="c1"&gt;#&lt;/span&gt;
  &lt;span class="c1"&gt;# number1 - First number to sum.&lt;/span&gt;
  &lt;span class="c1"&gt;# number2 - Second number to sum.&lt;/span&gt;
  &lt;span class="c1"&gt;#&lt;/span&gt;
  &lt;span class="c1"&gt;# Examples&lt;/span&gt;
  &lt;span class="c1"&gt;#&lt;/span&gt;
  &lt;span class="c1"&gt;#   sum(2, 5)&lt;/span&gt;
  &lt;span class="c1"&gt;#   # =&amp;gt; 7&lt;/span&gt;
  &lt;span class="c1"&gt;#&lt;/span&gt;
  &lt;span class="c1"&gt;# Returns the duplicated String.&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;number1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;number2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;number1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;number2&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fora da faculdade, quando comecei a usar linguagens com propostas mais modernas, me deparei com pessoas, livros e posts que diziam que meu código precisava ser limpo, auto-explicativo e qualquer tipo de comentário deveria ser evitado em favor de um código que fosse mais limpo e mais auto-explicativo. Um memória muito boa que tenho disso é do meu bom amigo &lt;a href="https://github.com/arthurfsilva" rel="noopener noreferrer"&gt;Arthur&lt;/a&gt; comentando sobre um parágrafo do livro &lt;a href="https://www.amazon.com.br/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882" rel="noopener noreferrer"&gt;Clean Code&lt;/a&gt; escrito por Robert C. Martin, mais conhecido como &lt;a href="https://blog.cleancoder.com/" rel="noopener noreferrer"&gt;Uncle Bob&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;So when you find yourself in a position where you need to write a comment, think it through and see whether there isn’t some way to turn the tables and express yourself in code. Every time you express yourself in code, you should pat yourself on the back. Every time you write a comment, you should grimace and feel the failure of your ability of expression.&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Robert C. Martin. Clean Code. Page 54, line 7.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Tradução livre: Então quando você se ver numa situação onde precisa escrever um comentário, pense se não há uma maneira de contornar e se expressar através de código. Sempre que conseguir se expressar através do código, você deve dar-se um tapinha nas costas. Sempre que não conseguir, você deve fazer uma careta e sentir a falha da suas habilidades de expressão.)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Ok, vamos tentar no mundo real agora
&lt;/h2&gt;

&lt;p&gt;Num belo dia, me pego escrevendo uma função onde eu desejei desde o primeiro caractere que houvesse um comentário para que eu economizasse tempo quando precisasse voltar a ela.&lt;/p&gt;

&lt;p&gt;Em vez de explicar o que está acontecendo, vou deixar o código com seu comentário e sugerir um exercício: Imagine que não há comentário documentando o código e tente entender o que a função faz. Acredito que a tarefa será um pouco complicada.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# In some worksheet rows, is returned formula errors that are inside&lt;/span&gt;
&lt;span class="c1"&gt;# an extra cell object, at the end of map process, an array is returned&lt;/span&gt;
&lt;span class="c1"&gt;# with an extra element.&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# As we are treating that values by this position, this extra element&lt;/span&gt;
&lt;span class="c1"&gt;# in the array beginning causes validations errors when the line is&lt;/span&gt;
&lt;span class="c1"&gt;# persisted on the database.&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Examples&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;#  clean_formula_errors_from(['item 1', 'item 2', 'item 3'])&lt;/span&gt;
&lt;span class="c1"&gt;#  # =&amp;gt; ['item 1', 'item 2', 'item 3']&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;#  clean_formula_errors_from(['#SomeKindOfError!', 'item 1', 'item 2', 'item 3'])&lt;/span&gt;
&lt;span class="c1"&gt;#  # =&amp;gt; ['item 1', 'item 2', 'item 3']&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Returns an array without error items&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;clean_formula_errors_from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="ss"&gt;:value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reject&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/^\#\w*!$/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Muito mais simples de entender com o comentário, não?&lt;/p&gt;

&lt;p&gt;Comentários valorosos para a sua aplicação são aqueles que, além de explicar o que o seu código faz, explica o por quê do seu código estar fazendo aquilo. Isso não invalida o fato de que você sempre deve manter o seu código o mais limpo e auto-explicativo possível, mas como vimos no exemplo, nem sempre é possível fazer um código totalmente auto-explicativo. Muitas vezes é necessário entender o contexto para que esse trecho de código de código limpo e auto-explicativo faça sentido.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dicas rápidas
&lt;/h2&gt;

&lt;p&gt;Quando precisar fazer, deixe seus comentários com a linguagem o mais simples possível. Não economize na hora de escrever mas mantenha o bom senso: Se o seu comentário está muito grande considere refatorar seu código. Procure sempre a opinião de um colega de trabalho ou algum desenvolvedor mais sênior, seja pessoalmente ou na hora do Code Review. E sempre que surgir dúvidas sobre documentar ou não, provavelmente é melhor documentar.&lt;/p&gt;

&lt;p&gt;Para escrever esses comentários do texto eu utilizei as regras do &lt;a href="http://tomdoc.org/" rel="noopener noreferrer"&gt;TomDoc&lt;/a&gt;. Vale muito a pena ler não importa qual seja seu nível de experiência em desenvolvimento de software. Embora o TomDoc seja focado em Ruby, há padrões para outras linguagens como &lt;a href="http://usejsdoc.org/" rel="noopener noreferrer"&gt;JSDoc&lt;/a&gt; para Javascript ou as definições da &lt;a href="https://www.python.org/dev/peps/pep-0257/" rel="noopener noreferrer"&gt;PEP 257&lt;/a&gt; para Python.&lt;/p&gt;

&lt;h2&gt;
  
  
  Um (muito) breve comentário sobre documentação fora do código
&lt;/h2&gt;

&lt;p&gt;Sobre documentação fora do código para procedimentos e/ou especificidades que não estejam totalmente ligadas ao código: Sim, vale muito a pena pois você compartilha o conhecimento sobre determinada parte do seu sistema com os demais programadores além de facilitar muito para programadores novos entenderem melhor sobre o sistema.&lt;/p&gt;

&lt;p&gt;Fui breve aqui pois acredito que alguém possa ficar com dúvidas sobre comentários fora do código. E também por que pretendo abordar esse assunto melhor em post futuro.&lt;/p&gt;

&lt;p&gt;Obrigado! 😄&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
    </item>
    <item>
      <title>Como funcionam os getters e setters no Ruby?</title>
      <dc:creator>Odinei Ramone</dc:creator>
      <pubDate>Fri, 03 Sep 2021 06:26:27 +0000</pubDate>
      <link>https://dev.to/odineiramone/como-funcionam-os-getters-e-setters-no-ruby-mj2</link>
      <guid>https://dev.to/odineiramone/como-funcionam-os-getters-e-setters-no-ruby-mj2</guid>
      <description>&lt;p&gt;Há alguns dias &lt;a href="https://github.com/MoisesBorges" rel="noopener noreferrer"&gt;um amigo&lt;/a&gt; me mandou a seguinte pergunta: O que são e como funcionam os &lt;em&gt;getters&lt;/em&gt; e &lt;em&gt;setters&lt;/em&gt;?&lt;/p&gt;

&lt;p&gt;Fui pensar um pouco nisso para bolar uma resposta e lembrei que eu também tive dificuldade com esse tópico quando comecei a programar e continuei tendo dificuldades com isso quando iniciei no mundo de Ruby 😅.&lt;/p&gt;

&lt;p&gt;Assim, mandei um textão para meu amigo explicando o que seriam os &lt;em&gt;getters&lt;/em&gt; e &lt;em&gt;setters&lt;/em&gt; e achei que seria um ótimo tópico para compartilhar aqui com vocês! Vamos lá?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Getters&lt;/em&gt; e &lt;em&gt;setters&lt;/em&gt; servem para você manipular atributos do objeto (atributos são informações sobre objeto).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Setters&lt;/em&gt; servem para atribuir valores aos atributos do objeto que são guardadas em variáveis de instâncias (variáveis de instância sempre começam com @) e &lt;em&gt;getters&lt;/em&gt; leem os valores dessas variáveis nos permitindo acessa-los sempre que necessário.&lt;/p&gt;

&lt;p&gt;Em código ruby, um objeto com &lt;em&gt;getters&lt;/em&gt; e &lt;em&gt;setters&lt;/em&gt; seria assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Humano&lt;/span&gt;
  &lt;span class="c1"&gt;# aqui eu inicializo meu objeto apenas&lt;/span&gt;
  &lt;span class="c1"&gt;# com o atributo nome:&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="vi"&gt;@nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="c1"&gt;# aqui eu defino um getter para nome que&lt;/span&gt;
  &lt;span class="c1"&gt;# me permite ler o valor desse atributo:&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;nome&lt;/span&gt;
    &lt;span class="vi"&gt;@nome&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="c1"&gt;# aqui eu defino um setter para idade que&lt;/span&gt;
  &lt;span class="c1"&gt;# me permite atribuir um valor para esse atributo:&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="vi"&gt;@idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="c1"&gt;# aqui eu defino um getter para idade que&lt;/span&gt;
  &lt;span class="c1"&gt;# me permite ler o valor desse atributo:&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;idade&lt;/span&gt;
    &lt;span class="vi"&gt;@idade&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Podemos usar esse objeto assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# aqui eu instancio um novo objeto Humano com&lt;/span&gt;
&lt;span class="c"&gt;# o valor "odinei" no atributo nome e o atribuo&lt;/span&gt;
&lt;span class="c"&gt;# à variável "odinei"&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; eu &lt;span class="o"&gt;=&lt;/span&gt; Humano.new&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'odinei'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="c"&gt;#&amp;lt;Humano:0x00007fa450006918 @nome="odinei"&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;# aqui eu chamo o getter nome para que ele me&lt;/span&gt;
&lt;span class="c"&gt;# devolva o valor do atributo nome do meu objeto&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; eu.nome
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"odinei"&lt;/span&gt;

&lt;span class="c"&gt;# aqui eu chamo o getter idade para que ele me&lt;/span&gt;
&lt;span class="c"&gt;# devolva o valor do atributo idade do meu objeto&lt;/span&gt;
&lt;span class="c"&gt;# como eu não atribui valor à esse atributo, ele&lt;/span&gt;
&lt;span class="c"&gt;# me devolve nil (nulo) como valor&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; eu.idade
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; nil

&lt;span class="c"&gt;# aqui eu chamo o setter idade para atribuir à&lt;/span&gt;
&lt;span class="c"&gt;# esse atributo o valor 28&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; eu.idade &lt;span class="o"&gt;=&lt;/span&gt; 28
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 28

&lt;span class="c"&gt;# aqui eu chamo o getter idade para que ele me&lt;/span&gt;
&lt;span class="c"&gt;# devolva o valor do atributo idade do meu objeto,&lt;/span&gt;
&lt;span class="c"&gt;# que agora tem um valor&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; eu.idade
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 28

&lt;span class="c"&gt;# aqui eu sobreescrevo o valor anterior do atributo&lt;/span&gt;
&lt;span class="c"&gt;# idade para o valor 23&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; eu.idade &lt;span class="o"&gt;=&lt;/span&gt; 23
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 23

&lt;span class="c"&gt;# aqui eu chamo o getter idade para que ele me&lt;/span&gt;
&lt;span class="c"&gt;# devolva o valor do atributo idade do meu objeto,&lt;/span&gt;
&lt;span class="c"&gt;# que agora tem um valor diferente do anterior&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; eu.idade
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 23

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

&lt;/div&gt;



&lt;p&gt;Porém, como eu não defini um &lt;em&gt;setter&lt;/em&gt; para nome, eu não consigo trocar o valor do atributo nome do meu objeto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;eu.nome &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Arthur'&lt;/span&gt;
Traceback &lt;span class="o"&gt;(&lt;/span&gt;most recent call last&lt;span class="o"&gt;)&lt;/span&gt;:
        4: from /Users/odineiribeiro/.asdf/installs/ruby/2.6.2/bin/irb:23:in &lt;span class="sb"&gt;`&lt;/span&gt;&amp;lt;main&amp;gt;&lt;span class="s1"&gt;'
        3: from /Users/odineiribeiro/.asdf/installs/ruby/2.6.2/bin/irb:23:in `load'&lt;/span&gt;
        2: from /Users/odineiribeiro/.asdf/installs/ruby/2.6.2/lib/ruby/gems/2.6.0
                /gems/irb-1.0.0/exe/irb:11:in &lt;span class="sb"&gt;`&lt;/span&gt;&amp;lt;top &lt;span class="o"&gt;(&lt;/span&gt;required&lt;span class="o"&gt;)&amp;gt;&lt;/span&gt;&lt;span class="s1"&gt;'
        1: from (irb):26
NoMethodError (undefined method `nome='&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="c"&gt;#&amp;lt;Humano:0x00007fa450006918 @nome="odinei", @idade=23&amp;gt;)&lt;/span&gt;
Did you mean?  nome

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

&lt;/div&gt;



&lt;p&gt;Aqui temos uma parte interessante do erro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;NoMethodError &lt;span class="o"&gt;(&lt;/span&gt;undefined method &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nv"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;' for #&amp;lt;Humano:0x00007fa450006918 @nome="odinei", @idade=23&amp;gt;)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O ruby está no dizendo que o nosso objeto não tem o método &lt;em&gt;setter&lt;/em&gt; &lt;code&gt;def nome=&lt;/code&gt; por isso, não podemos atribuir um valor para o atributo nome do nosso objeto!&lt;/p&gt;

&lt;h3&gt;
  
  
  A mesma coisa, só que diferente
&lt;/h3&gt;

&lt;p&gt;Em ruby, podemos usar alguns métodos nos nossos objetos para poupar linhas ao escrever nossos &lt;em&gt;getters&lt;/em&gt; e &lt;em&gt;setters&lt;/em&gt;.&lt;br&gt;
São eles&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;attr_accessor&lt;/code&gt; que cria os métodos de leitura (&lt;em&gt;getter&lt;/em&gt;) e escrita (&lt;em&gt;setter&lt;/em&gt;) para um determinado atributo.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;attr_writer&lt;/code&gt; que cria apenas o método de escrita (&lt;em&gt;setter&lt;/em&gt;) para um determinado atributo.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;attr_reader&lt;/code&gt; que cria apenas o método de leitura (&lt;em&gt;getter&lt;/em&gt;) para um determinado atributo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vejamos um exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Humano&lt;/span&gt;
  &lt;span class="c1"&gt;# aqui eu crio um getter para o atributo nome&lt;/span&gt;
  &lt;span class="nb"&gt;attr_reader&lt;/span&gt; &lt;span class="ss"&gt;:nome&lt;/span&gt;

  &lt;span class="c1"&gt;# aqui eu crio um getter e um setter para o atributo idade &lt;/span&gt;
  &lt;span class="nb"&gt;attr_accessor&lt;/span&gt; &lt;span class="ss"&gt;:idade&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="vi"&gt;@nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Esse novo objeto &lt;code&gt;Humano&lt;/code&gt; se comporta igual ao objeto que criamos anteriormente! Inclusive dando o mesmo erro ao chamarmos um &lt;em&gt;setter&lt;/em&gt;  inexistente!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;eu &lt;span class="o"&gt;=&lt;/span&gt; Humano.new&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'odinei'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="c"&gt;#&amp;lt;Humano:0x00007fb20d0344b0 @nome="odinei"&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; eu.nome
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"odinei"&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; eu.idade
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; nil
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; eu.idade &lt;span class="o"&gt;=&lt;/span&gt; 27
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 27
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; eu.idade
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 27
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; eu.idade &lt;span class="o"&gt;=&lt;/span&gt; 23
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 23
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; eu.nome &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Arthur'&lt;/span&gt;
Traceback &lt;span class="o"&gt;(&lt;/span&gt;most recent call last&lt;span class="o"&gt;)&lt;/span&gt;:
        4: from /Users/odineiribeiro/.asdf/installs/ruby/2.6.2/bin/irb:23:in &lt;span class="sb"&gt;`&lt;/span&gt;&amp;lt;main&amp;gt;&lt;span class="s1"&gt;'
        3: from /Users/odineiribeiro/.asdf/installs/ruby/2.6.2/bin/irb:23:in `load'&lt;/span&gt;
        2: from /Users/odineiribeiro/.asdf/installs/ruby/2.6.2/lib/ruby/gems/2.6.0
                /gems/irb-1.0.0/exe/irb:11:in &lt;span class="sb"&gt;`&lt;/span&gt;&amp;lt;top &lt;span class="o"&gt;(&lt;/span&gt;required&lt;span class="o"&gt;)&amp;gt;&lt;/span&gt;&lt;span class="s1"&gt;'
        1: from (irb):17
NoMethodError (undefined method `nome='&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="c"&gt;#&amp;lt;Humano:0x00007fb20d0344b0 @nome="odinei", @idade=23&amp;gt;)&lt;/span&gt;
Did you mean?  nome

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Método de escrita, para que te quero?
&lt;/h3&gt;

&lt;p&gt;O &lt;code&gt;attr_writer&lt;/code&gt; pode ser um pouco estranho de entender quando usar, afinal, para que eu vou colocar um valor em um atributo do meu objeto sem ter um método para lê-lo?&lt;/p&gt;

&lt;p&gt;A resposta é simples: Você pode querer um valor para fazer alguma operação com ele e retorna-lo de uma forma diferente. Vamos ver um exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; eu &lt;span class="o"&gt;=&lt;/span&gt; Humano.new&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'odinei'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="c"&gt;#&amp;lt;Humano:0x00007fd577a279a8 @nome="odinei"&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; eu.nome
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"odinei"&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; eu.ano_nascimento &lt;span class="o"&gt;=&lt;/span&gt; 1992
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 1992
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; eu.idade
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 28

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

&lt;/div&gt;



&lt;p&gt;No exemplo acima eu calculo a minha idade com base na atributo &lt;code&gt;ano_nascimento&lt;/code&gt; que foi criada apenas para leitura!&lt;/p&gt;

&lt;p&gt;Em ruby é muito mais comum usar os &lt;code&gt;attr_accessor&lt;/code&gt;, &lt;code&gt;attr_reader&lt;/code&gt; e &lt;code&gt;attr_writer&lt;/code&gt; para criar métodos de leitura e escrita em vez de criar esses métodos "na mão" para termos menos linhas no nossos arquivos 😄!&lt;/p&gt;

&lt;h2&gt;
  
  
  Quando usar attr_accessor e quando usar getters e setters?
&lt;/h2&gt;

&lt;p&gt;Segundo o livro &lt;a href="http://patshaughnessy.net/ruby-under-a-microscope" rel="noopener noreferrer"&gt;Ruby Under a Microscope&lt;/a&gt; escrito pelo &lt;a href="http://patshaughnessy.net/" rel="noopener noreferrer"&gt;Pat Shaughnessy&lt;/a&gt; (leitura recomendadíssima para quem quer entender como as mágicas do Ruby funcionam ;D) o Ruby otimiza o uso do &lt;em&gt;attr_reader&lt;/em&gt;, &lt;em&gt;attr_writer&lt;/em&gt; e &lt;em&gt;attr_accessor&lt;/em&gt; fazendo a criação e acesso à variáveis de instância funcionar mais rápido 🚗💨!&lt;/p&gt;

&lt;p&gt;O livro entra em mais detalhes do porquê os &lt;em&gt;attr_accessor&lt;/em&gt; serem mais rápidos do que os outros &lt;em&gt;getters&lt;/em&gt; e &lt;em&gt;setters&lt;/em&gt; mas basicamente o Ruby implementa métodos escritos em C que são especializados no tratamento dos &lt;em&gt;attr_accessors&lt;/em&gt;, ou seja, eles não são simples atalhos  para os métodos em C que criam os &lt;em&gt;getters&lt;/em&gt; e &lt;em&gt;setters&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Caso você queira ler a explicação completa no Ruby Under a Microscope, a parte que trata desses métodos estão na página 97 em &lt;em&gt;"Calling attr_reader and attr_writer"&lt;/em&gt; e na página 98 em &lt;em&gt;"Method Dispatch Optimizes attr_reader and attr_writer".&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Espero que tenham gostado do texto é até uma próxima! 👋&lt;/p&gt;

&lt;h3&gt;
  
  
  Fontes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://patshaughnessy.net/ruby-under-a-microscope" rel="noopener noreferrer"&gt;Ruby Under a Microscope&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.jetbrains.com/pt-pt/lp/mono/" rel="noopener noreferrer"&gt;JetBrains Mono&lt;/a&gt; (essa aqui eu uso no Sublime 😆)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
    </item>
  </channel>
</rss>
