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 dofor
ou iterações comwhile
; - 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 comif
; - Para blocos de múltiplas linhas, prefira
do
eend
; - 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:
- Loops em Ruby com métodos times e upto
- Métodos de Arrays do Ruby que você precisa conhecer!
- Guard Clause em Ruby
- Processando arrays com operador ampersand (&) em Ruby
- Como funciona o "Syntactic Sugar" em Ruby
- Dicas de boas práticas
- Boas fontes e conteúdos para evoluir em Ruby
- Dicas de carreira
Referências: