Boas práticas de código

Artigos - 12/Dez/2022 - por André Kanamura

Artigo revisado em 03/10/2023

Introdução

Na Campus Code gostamos de reforçar, sempre que possível, a importância das boas práticas de código. Seguindo no dia a dia algumas orientações e técnicas simples, conseguimos uma série de benefícios quando estamos trabalhando em times num projeto grande de software. Escrever código com boas práticas normalmente resulta em código mais claro, fácil de ler e de ser compreendido e, consequentemente, mais fácil de manter e detectar erros. Se toda a equipe seguir os padrões estabelecidos, o código ficará mais uniforme, mesmo sendo criado por muitas pessoas. Em conjunto, tudo isso vai ajudar a melhorar a qualidade do código e a produtividade do time, gerando resultados mais rápidos e melhores.

A lista das tais boas práticas em desenvolvimento de software é muito extensa, mas aqui vamos destacar algumas que consideramos mais importantes, principalmente para quem está dando seus primeiros passos com programação ou para quem está tendo seu primeiro contato com Ruby, que é a linguagem de programação mais utilizada nos treinamentos da Campus Code.

Vale lembrar que os padrões de boas práticas podem variar de acordo com a linguagem de programação ou área da indústria. Algumas das práticas listadas abaixo podem não se aplicar a outros contextos, mas a maioria delas é indicada para qualquer cenário. Além disso, as dicas nesse artigo são apenas recomendações que podem ou não ser adotadas dentro das empresas ou grupos de pessoas desenvolvedoras envolvidas num determinado projeto, sendo que a orientação do time deveria ter prioridade sobre qualquer preferência pessoal.

Depois dessa longa introdução, vamos à nossa lista!

Convenções para nomes de variáveis, classes e métodos

Variáveis, classes e métodos devem ter nomes autoexplicativos e seguir uma temática consistente por todo o código. Nomes de variáveis precisam ser fáceis de entender e devem representar claramente a informação armazenada: essa é uma característica essencial para um código legível. Evite declarar variáveis usando somente letras, como x ou y e tome cuidado com nomes genéricos como result ou value. A legibilidade sempre será melhor com variáveis autoexplicativas. Imagine que você criou um trecho de código que escolhe os usuários que irão receber um e-mail com promoções em um e-commerce. A variável que armazena este array de usuários poderia se chamar selected_users ao invés de users, por exemplo.

Em Ruby, costuma-se nomear variáveis e métodos usando o formato snake_case (wikipedia), por exemplo user_products. Já as classes seguem o formato CamelCase (wikipedia), como, por exemplo, ProductReview.

Comentários

Esse é um tópico um pouco polêmico. De maneira geral, para muitas linguagens de programação, o uso de comentários é aceito e recomendado, desde que seja feito de forma clara e concisa.

Em Ruby, no entanto, comentários são, em geral, evitados. Como a linguagem de programação permite escrever código legível e facilmente compreensível, comentários costumam ser desnecessários. Inclusive, em alguns casos pode ser dito que se o código PRECISA de comentários, ele provavelmente pode ser reescrito de uma forma mais legível.

Naturalmente, em algumas situações em que o código, por alguma razão, foge dos padrões do projeto ou não foi encontrada uma forma mais clara de escrevê-lo, comentários são bem-vindos, desde que sejam concisos e claros. Em Ruby existem diferentes formas de adicionar comentários ao código, você pode conhecer melhor suas opções aqui (https://docs.ruby-lang.org/en/master/syntax/comments_rdoc.html).

Indentação e formatação

Formatação e indentação estão relacionados à organização, que é essencial para facilitar a leitura e compreensão do código pelo time. Incluem padrões de espaçamento, quebras de linha, quantidade máxima de caracteres, uso de vírgulas, pontos e chaves, entre outros.

Diferentes linguagens de programação têm diferentes regras para formatação e indentação. Abaixo, seguem alguns dos principais padrões para a linguagem Ruby:

  • Indentação de 2 espaços. Não use tab;
  • Não use espaços entre parênteses e entre colchetes;
  • Dê preferência a guard clauses no lugar de blocos if/else ou ternários;
  • Use linhas em branco para separar métodos longos em parágrafos lógicos;
  • Linhas devem ter menos de 80 caracteres;
  • Evite espaços em branco à direita.

Portabilidade

Se o seu código possui valores fixos (“hardcoded”), ele provavelmente não vai ser aplicável a diferentes contextos. Portabilidade é um aspecto crucial para qualquer aplicação, então garanta que seu código seja flexível.

Reusabilidade

Em desenvolvimento de software, reusabilidade é algo extremamente importante, já que ajuda a economizar tempo. Além da própria funcionalidade estar sendo reaproveitada em outros cenários, esse código já foi testado e facilita a manutenção ao longo do tempo.

Sempre que possível, isole códigos de determinadas partes da aplicação em métodos, classes ou módulos para que possam ser reaproveitados com facilidade em outras áreas da aplicação.

Identificar código a ser reutilizado pode ser um desafio no começo de sua jornada com programação. Nossa sugestão é que você comece escrevendo a solução mais simples possível para o problema que está procurando resolver. Quando o código estiver pronto, volte e leia novamente com calma em busca de repetições. Caso as encontre, crie métodos para isolar os trechos repetidos, sempre garantindo que o código continue funcionando.

Legibilidade e tamanho do código

Esse também é um tópico um tanto polêmico, mas, de maneira geral, acreditamos que a maioria das pessoas entenda a importância da legibilidade do código. Dito isso, normalmente procura-se escrever a menor quantidade de linhas possível sem que isso prejudique a legibilidade e manutenção do código ao longo do tempo. Nesse sentido, entender quando é interessante, por exemplo, isolar código em métodos nomeados de forma bem clara, pode ajudar na compreensão de uma funcionalidade.

Aqui vale a mesma dica do tópico anterior, encontre primeiro a solução mais trivial e simples possível sem se preocupar com o tamanho do código e com eventuais repetições. Com o problema resolvido, volte e leia-o com calma, buscando por oportunidades de melhorar a legibilidade e criar métodos para isolar trechos repetitivos.

Sintaxe

Seguir as convenções de sintaxe de cada linguagem ajuda a manter a uniformidade do código de uma aplicação inteira. Isso vai facilitar a manutenção e a compreensão do código como um todo, o que se traduz, a longo prazo, em economia de tempo e dinheiro.

Cada linguagem terá seu próprio conjunto de regras. Abaixo, vamos listar algumas das principais recomendações em Ruby:

  • Prefira usar each no lugar do for ou iterações com while;
  • Evite usar then. Uma nova linha deve funcionar;
  • Prefira usar palavras a símbolos;
  • Evite ternários. Prefira usar guard clauses;
  • Prefira unless a negações com if;
  • Para blocos de múltiplas linhas, prefira do e end;
  • Para blocos de uma linha, prefira { … };
  • Evite return quando não for necessário.

Testes

Essa é mais uma recomendação para projetos como um todo e não para código isolado, mas mesmo assim achamos válido sempre apontar que testes são fundamentais para garantir a estabilidade e maturidade do software.

Testes também são parte do código da aplicação e não só devem seguir as boas práticas de programação, como possuem suas próprias regras para que o conjunto de testes seja padronizado, compreensível e de fácil manutenção.

Conclusão

Seguir todas as boas práticas em desenvolvimento de software não é algo fácil e rápido. Leva algum tempo para nos habituarmos com todas práticas e técnicas. Por isso é importante continuar estudando, pedir revisão de código, aprender a ouvir críticas e estudar as técnicas. Tenha paciência e dedicação. 😊

Abaixo, listamos alguns links bacanas pra quem está começando a aprender Ruby:

Referências:

Foto de perfil do autor
André Kanamura

Dev na Campus Code