{"id":26847,"date":"2019-03-14T09:59:04","date_gmt":"2019-03-14T09:59:04","guid":{"rendered":"https:\/\/devlooper.blog.br\/?p=731"},"modified":"2019-03-14T09:59:04","modified_gmt":"2019-03-14T09:59:04","slug":"gems-para-melhorar-a-qualidade-do-seu-codigo","status":"publish","type":"post","link":"https:\/\/www.locaweb.com.br\/blog\/temas\/codigo-aberto\/gems-para-melhorar-a-qualidade-do-seu-codigo\/","title":{"rendered":"Gems para melhorar a qualidade do seu c\u00f3digo"},"content":{"rendered":"<p><span style=\"font-weight: 400\">Ano passado, fiz uma <\/span><a href=\"https:\/\/www.youtube.com\/watch?v=U9k7lUh-_A4&amp;t=18s\"><i><span style=\"font-weight: 400\">talk<\/span><\/i><\/a><span style=\"font-weight: 400\"> em um <\/span><i><span style=\"font-weight: 400\">meetup<\/span><\/i><span style=\"font-weight: 400\"> online sobre monitoramento de aplica\u00e7\u00f5es. <\/span><\/p>\n<p><span style=\"font-weight: 400\">Na talk ensinei a usar a gem <\/span><b>sentry-raven <\/b><span style=\"font-weight: 400\">que \u00e9 a gem que faz a integra\u00e7\u00e3o toda a m\u00e1quina de logar os erros da sua aplica\u00e7\u00e3o ruby no sentry.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Uma amiga que assistiu a <\/span><i><span style=\"font-weight: 400\">talk<\/span><\/i><span style=\"font-weight: 400\"> comentou que seria legal eu comentar mais sobre gems. Nesse post vou falar sobre as gems que utilizo para padronizar e manter a qualidade do meu c\u00f3digo.<\/span><\/p>\n<h2><b>Rubocop<\/b><\/h2>\n<p><span style=\"font-weight: 400\">O <\/span><a href=\"https:\/\/github.com\/rubocop-hq\/rubocop\"><span style=\"font-weight: 400\">Rubocop<\/span><\/a><span style=\"font-weight: 400\"> \u00e9 uma gem bastante conhecida e usada na comunidade de ruby. Ela j\u00e1 traz configurada o <\/span><a href=\"https:\/\/github.com\/rubocop-hq\/ruby-style-guide\"><span style=\"font-weight: 400\">style guide<\/span><\/a><span style=\"font-weight: 400\"> da linguagem. <\/span><\/p>\n<p><span style=\"font-weight: 400\">O mais legal \u00e9 que n\u00e3o precisamos seguir fielmente o <\/span><i><span style=\"font-weight: 400\">style guide <\/span><\/i><span style=\"font-weight: 400\">do Rubocop, podemos adaptar \u00e0 realidade do nosso time. <\/span><\/p>\n<p><span style=\"font-weight: 400\">Um belo exemplo disso \u00e9 o limite de 80 caracteres por linha. Se voc\u00ea estudou a hist\u00f3ria do computador e viu aquelas telas antigas, de 800&#215;600 ou menor, vai lembrar que devido a resolu\u00e7\u00e3o pouca coisa cabia em uma linha &#8211; normalmente 80 caracteres. <\/span><\/p>\n<p><span style=\"font-weight: 400\">Hoje essa limita\u00e7\u00e3o j\u00e1 n\u00e3o existe, ent\u00e3o esse \u00e9 um tipo de padr\u00e3o desnecess\u00e1rio. <\/span><\/p>\n<p><span style=\"font-weight: 400\">Acho v\u00e1lido um limite de caracteres para n\u00e3o ter que ficar usando o scroll lateral. Normalmente eu utilizo 105 caracteres pela resolu\u00e7\u00e3o compat\u00edvel com os monitores de todo o time, assim temos uma liberdade maior nesse sentido.<\/span><\/p>\n<p><span style=\"font-weight: 400\">O meu rubocop.yml default para um projeto Ruby on Rails \u00e9 o seguinte:<\/span><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"ruby\">Documentation:\n\u00a0Enabled: false\n\nMetrics\/BlockLength:\n\u00a0Enabled: true\n\u00a0Exclude:\n\u00a0\u00a0\u00a0- spec\/**\/*\n\nMetrics\/LineLength:\n\u00a0Max: 105\n\nAllCops:\n\u00a0Exclude:\n\u00a0\u00a0\u00a0- '**\/Rakefile'\n\u00a0\u00a0\u00a0- 'vendor\/**\/*'\n\u00a0\u00a0\u00a0- 'spec\/fixtures\/**\/*'\n\u00a0\u00a0\u00a0- 'spec\/*_helper.rb'\n\u00a0\u00a0\u00a0- 'tmp\/**\/*'\n\u00a0\u00a0\u00a0- 'bin\/**\/*'\n\u00a0\u00a0\u00a0- 'db\/**\/*'\n\u00a0\u00a0\u00a0- 'config\/**\/*'<\/pre>\n<p><span style=\"font-weight: 400\">No `Documentation`, eu desabilito para evitar alertas do rubocop para coment\u00e1rios no in\u00edcio das classes. Normalmente um model User n\u00e3o precisa de um coment\u00e1rio descrevendo, por isso n\u00e3o vale a pena esse tipo de <\/span><i><span style=\"font-weight: 400\">warning<\/span><\/i><span style=\"font-weight: 400\"> (nesse caso).<\/span><\/p>\n<p><span style=\"font-weight: 400\">O `Metrics\/BlockLength` verifica se seus m\u00e9todos e blocos est\u00e3o muito grandes. <\/span><\/p>\n<p><span style=\"font-weight: 400\">Acho essa m\u00e9trica extremamente v\u00e1lida.Voc\u00ea precisa sempre se preocupar em escrever m\u00e9todos enxutos e respeitando o princ\u00edpio do <\/span><i><span style=\"font-weight: 400\">Single Responsability<\/span><\/i> <a href=\"http:\/\/blog.locaweb.com.br\/artigos\/desenvolvimento-artigos\/conheca-arte-do-solid\/\"><span style=\"font-weight: 400\">(veja esse artigo sobre SOLID)<\/span><\/a><span style=\"font-weight: 400\">. Por\u00e9m esse cara eu desabilito nos testes, pois testes usando <\/span><a href=\"http:\/\/www.betterspecs.org\/\"><span style=\"font-weight: 400\">Better Spec<\/span><\/a><span style=\"font-weight: 400\"> tendem a quebrar esse item.<\/span><\/p>\n<p><span style=\"font-weight: 400\">O caso que comentei das 80 linhas \u00e9 o `Metrics\/LineLength`, onde eu altero o default de 80 para 105. Perceba que em cima de uma m\u00e9trica podemos habilitar, desabilitar, alterar o valor dela, excluir ou incluir arquivos \u00e0 uma regra.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Por fim, no `AllCops`, estou excluindo todas as regras do Rubocop para uma lista de arquivos. Assim, sempre antes de fazer um <\/span><i><span style=\"font-weight: 400\">push<\/span><\/i><span style=\"font-weight: 400\"> rodando `rubocop -a`, o rubocop, ir\u00e1 aplicar as regras ao seu sistema. <\/span><\/p>\n<p><span style=\"font-weight: 400\">Se estiver algo errado e ele souber como corrigir, ele far\u00e1, se n\u00e3o souber ele vai avisar que n\u00e3o sabe e apontar o erro, nesse ponto voc\u00ea precisa ler o erro e alterar conforme a regra para manter seu c\u00f3digo padronizado.<\/span><\/p>\n<h2><b>Rails best practices<\/b><\/h2>\n<p><span style=\"font-weight: 400\">A Gem <\/span><a href=\"https:\/\/github.com\/flyerhzm\/rails_best_practices\"><span style=\"font-weight: 400\">Rails Best Practices<\/span><\/a><span style=\"font-weight: 400\"> foi uma grata surpresa que tive de conhecer ano passado. Ela \u00e9 uma gem espec\u00edfica para trabalhar com projetos Rails e ela cumpre muito bem o papel dela. Ela segue a mesma linha de pensamento do rubocop. Ela faz uma varredura no seu projeto e se encontra algo fora do padr\u00e3o, gera <\/span><i><span style=\"font-weight: 400\">warnings<\/span><\/i><span style=\"font-weight: 400\">, para que possam ser corrigidos. H\u00e1 tamb\u00e9m a possibilidade de habilitar, desabilitar e configurar regras de padroniza\u00e7\u00e3o.<\/span><\/p>\n<p><span style=\"font-weight: 400\">O que mais me chamou a aten\u00e7\u00e3o nessa gem \u00e9 que ela me ajudou muito a sempre aplicar a Lei de Demeter. Eu conhecia, sabia como usar, mas sempre esquecia. E essa gem produz alertas facilitando a aplica\u00e7\u00e3o da regra no seu c\u00f3digo. <\/span><\/p>\n<p><span style=\"font-weight: 400\">Ela possui outras regras legais como `ProtectMassAssignmentCheck`, que ajudam voc\u00ea a identificar erros de <\/span><i><span style=\"font-weight: 400\">Mass Assignment <\/span><\/i><span style=\"font-weight: 400\">que voc\u00ea n\u00e3o est\u00e1 vendo e que poderiam estourar erros durante a utiliza\u00e7\u00e3o do sistema. <\/span><\/p>\n<p><span style=\"font-weight: 400\">J\u00e1 uma regra que foge o padr\u00e3o \u00e9 a `UseParenthesesInMethodDefCheck`, que for\u00e7a voc\u00ea a colocar par\u00eanteses na declara\u00e7\u00e3o de m\u00e9todos, independentemente de receber par\u00e2metros ou n\u00e3o. Essa eu deixou desabilitada.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Para usar depois de adicionar a gem `rails_best_practices` ao Gemfile do seu projeto Rails, basta rodar o `rails_best_practices -g` para gerar o arquivo de configura\u00e7\u00e3o e ajustar ele conforme a necessidade. Para desabilitar e habilitar regras, \u00e9 s\u00f3 comentar e descomentar a linha. Depois parar rodar o a gem no projeto s\u00f3 usar o `rails_best_practices .`<\/span><\/p>\n<h2><b>Ruby critic<\/b><\/h2>\n<p><span style=\"font-weight: 400\">Uma das gems mais poderosas quando falamos em qualidade de c\u00f3digo \u00e9 a <\/span><a href=\"https:\/\/github.com\/whitesmith\/rubycritic\"><span style=\"font-weight: 400\">Ruby Critic<\/span><\/a><span style=\"font-weight: 400\">. Ela \u00e9 a uni\u00e3o de gems anal\u00edticas (<\/span><a href=\"https:\/\/github.com\/troessner\/reek\"><span style=\"font-weight: 400\">Reek<\/span><\/a><span style=\"font-weight: 400\">,<\/span><a href=\"https:\/\/github.com\/seattlerb\/flay\"> <span style=\"font-weight: 400\">Flay<\/span><\/a><span style=\"font-weight: 400\"> and<\/span><a href=\"https:\/\/github.com\/seattlerb\/flog\"> <span style=\"font-weight: 400\">Flog<\/span><\/a><span style=\"font-weight: 400\">), com essas gems ela \u00e9 capaz de gerar um relat\u00f3rio completo do seu c\u00f3digo mostrando classes boas e ruins, al\u00e9m de dizer como e onde melhorar.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Um dos pontos fortes \u00e9 que o Ruby Critic verifica a complexidade ciclom\u00e1tica das classes e da uma nota de A a E na sua classe pelo que \u00e9 apresentado.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Depois de adicionar a gem ao Gemfile, basta rodar `bundle exec rubycritic`. Assim o ruby critic vai analisar o projeto todo. <\/span><\/p>\n<p><span style=\"font-weight: 400\">Particularmente, prefiro rodar `bundle exec rubycritic app`. Desta forma, ao rodar o Ruby Critic ele ir\u00e1 olhar apenas para a pasta app. Se o projeto tiver uma pasta lib separada da app, basta adicionar ela na frente desta forma: `bundle exec rubycritic app lib`. Fa\u00e7o isso para saber de fato a qualidade do meu c\u00f3digo sem olhar para classes do pr\u00f3prio framework e testes (no caso de estarmos trabalhando com Rails).<\/span><\/p>\n<p><span style=\"font-weight: 400\">Uma coisa interessante \u00e9 que voc\u00ea pode rodar o Ruby Critic para mostrar os resultados no navegador ou no terminal. Para mostrar os resultados no console, basta rodar dessa forma: `bundle exec rubycritic app -f console`. O resultado ser\u00e1 mostrado assim:<\/span><\/p>\n<p><img decoding=\"async\" class=\"alignnone wp-image-747 size-full\" src=\"https:\/\/devlooper.blog.br\/wp-content\/uploads\/2019\/03\/rubycritic1-1.png\" alt=\"\" width=\"1016\" height=\"564\" \/><\/p>\n<p><span style=\"font-weight: 400\">Para mostrar o resultado no navegador, basta rodar normalmente `bundle exec rubycritic app` e os resultados ser\u00e3o assim:<\/span><\/p>\n<p><img decoding=\"async\" class=\"alignnone wp-image-746 size-full\" src=\"https:\/\/devlooper.blog.br\/wp-content\/uploads\/2019\/03\/rubycritic2.png\" alt=\"\" width=\"1357\" height=\"578\" \/><\/p>\n<p><span style=\"font-weight: 400\">Desta forma tamb\u00e9m \u00e9 gerado um arquivo html no seu projeto normalmente na pasta `tmp\/rubycritic\/overview.html` . Abrindo a pasta voc\u00ea ter\u00e1 acesso a esse relat\u00f3rio caso tenha fechado a aba.<\/span><\/p>\n<p><span style=\"font-weight: 400\">No v\u00eddeo abaixo, mostro o funcionamento de de cada uma das gems, desde o momento que adicionei ela ao projeto at\u00e9 a execu\u00e7\u00e3o.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Gostou do conte\u00fado? Quer saber alguma outra coisa a respeito? D\u00favidas, sugest\u00f5es? Deixe um coment\u00e1rio.<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ano passado, fiz uma talk em um meetup online sobre monitoramento de aplica\u00e7\u00f5es. Na talk ensinei a usar a gem sentry-raven que \u00e9 a gem que faz a integra\u00e7\u00e3o toda a m\u00e1quina de logar os erros da sua aplica\u00e7\u00e3o ruby no sentry. Uma amiga que assistiu a talk comentou que seria legal eu comentar mais [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":33306,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[5],"tags":[],"class_list":["post-26847","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-aberto"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/posts\/26847","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/comments?post=26847"}],"version-history":[{"count":0,"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/posts\/26847\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/media\/33306"}],"wp:attachment":[{"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/media?parent=26847"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/categories?post=26847"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/tags?post=26847"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}