Clean Code
Todo programador já se deparou com um código mal escrito, onde diversos conceitos estão misturados: atributos não estão declarados de forma clara e expressiva e métodos fazendo mais de uma atividade, por exemplo.
O custo de manter um código ruim é maior, pois leva mais tempo e atenção dos desenvolvedores envolvidos no projeto, além de dificultar a inserção de novas funcionalidades.
Para evitar que esses erros aconteçam, o Clean Code tem se mostrado como uma ótima opção. Esse conceito subjetivo visa a prática da criação de linhas de código que melhoram a escrita e facilitam sua leitura e entendimento.
Neste artigo, iremos discutir sobre os conceitos e ideias apresentadas no livro Clean Code: A Handbook of Agile Software Craftsmanship, de Robert C. Martin.
Em sua obra, Martin traz à tona a visão de grandes programadores sobre o tema e a importância de criarmos um código limpo. Em suma, veremos que um bom programador reconhece que a legibilidade do seu código é tão importante quanto a execução do mesmo.
Como os códigos ruins acontecem?
Os códigos ruins ocorrem por conta de diversos fatores que afetam o desenvolvedor e a tarefa em execução como:
- Regras de negócio que mudam para algo não planejado;
- Não dispor de tempo para revisar a estrutura do código;
- Decisões ruins são tomadas;
- Ocorrem falhas na modelagem dos dados;
- O programador não se sente confortável com a atividade;
- Não se sabe como melhorar o código.
O que é código limpo?
Por se tratar de um conceito subjetivo, existem diversas definições sobre o que é um código limpo.
De acordo com Bjarne Stroustrup, criador do C++ e autor do livro A linguagem de programação C++:
“Gosto do meu código elegante e eficiente. A lógica deve ser direta para dificultar o encobrimento de bugs, as dependências mínimas para facilitar a manutenção, o tratamento de erro completo, de acordo com uma estratégia clara e o desempenho próximo do mais eficiente, de modo a não incitar as pessoas a tornarem o código confuso com otimizações sorrateiras. O código limpo faz bem apenas uma coisa.”
De acordo com Michael Feathers, autor de Working Effectively with Legacy Code:
“Eu poderia listar todas as qualidades que vejo em um código limpo, mas há uma predominante que leva a todas as outras. Um código limpo sempre parece que foi escrito por alguém que se importava. Não há nada de óbvio no que se pode fazer para torná-lo melhor. Tudo foi pensado pelo autor do código e, se tentar pensar em algumas melhoras, você voltará ao início, ou seja, apreciando o código deixado para você por alguém que se importa bastante com essa tarefa.”
Para Ron Jeffries, autor de Extreme Programming Installed and Extreme Programming Adventures in C#
“Nestes anos recentes comecei e quase finalizei com as regras de Kent Beck sobre código simples. Em ordem de prioridade, são:
- Efetue todos os testes;
- Sem duplicação de código;
- Expressa todas as ideias do projeto que não estão no sistema;
- Minimiza o número de entidades, como classes, métodos, funções e outras do tipo.”
Sendo assim, de modo geral, existem seis artifícios a serem considerados quando desejamos obter um código limpo:
1 — Elegante e eficiente;
2 — Faz uma coisa só;
3 — Testes;
4 — Sem duplicação (DRY);
5 — Expressivo;
6 — Fácil manutenção.
Além dos artifícios anteriores, podemos considerar algumas dicas rápidas e de fácil aplicação no dia a dia de um programador:
Nomes
Nomes são a porta de entrada para o código, portanto devem ser bem pensados. O ideal é que sejam expressivos, representando de fato o que estão nomeando.
Geralmente, a nomenclatura seguirá convenções, variando de acordo com o tipo de linguagem de programação escolhida, que facilita as nomeações e padroniza a escrita.
Ainda no que diz respeito a expressividade, é sempre bem-vindo utilizarmos nomes do domínio do problema, contextualizando o leitor ou revisor do código.
Assim devemos evitar, por exemplo, o uso de prefixos e/ou sufixos, como atributos nomeados de aux, x, y, z, etc. Por fim, nos perguntamos: o contexto é claro? O nome é sucinto? É pronunciável?
Funções
As funções/métodos devem executar uma ação. A ideia é de que sejam bem pequenas e tenham suas ações bem definidas dentro do escopo. Quanto menor é, melhor! Para que nossas funções fiquem pequenas, devemos nos atentar aos seguintes detalhes:
- O nível de abstração que a função está inserida;
- A quantidade de números de argumentos (quanto menos, melhor!);
- Evitar argumentos booleanos, pois os mesmos dão a entender que dentro da função lidaremos com uma condição if;
- Evitar argumentos de saída;
- Seguir fielmente o conceito de Do one thing.
Sobre esse conceito de Do one thing, Martin Fowler diz:
“ Se você perdeu tempo tentando identificar o que um bloco de código faz, extraia ele para uma função separada e nomeie a função para refletir o que ela faz.”
E também respeitar o conceito de “DRY” (Don’t repeat yourself).
Ele ainda completa:
“A primeira vez que você fizer algo, só faça. Na segunda, encontre a repetição, mas duplique o código mesmo assim. Na terceira, refatore.”
Comentários
Comentários feitos em códigos devem ser evitados! Códigos bem escritos não demandam um comentário explicando a lógica utilizada.
O uso de comentários também não respeita o conceito DRY (Don’t repeat yourself), pois contém muitas repetições, principalmente os que são criados para gerar javadoc e podem esconder code smells, que são bugs em potencial no código.
Um exemplo de comentário desnecessário é o demonstrado acima, afinal o mesmo apenas explica o que já é possível deduzir através do código e nomes dos atributos.
Logo, comentários raramente são necessários, já que um código bem escrito tem sua lógica clara.
Como criar código limpo?
Pense em todos os requisitos necessários para o código, implemente a funcionalidade, crie testes para o código novo garantindo o seu funcionamento observável e por fim o refatore.
Como manter o código limpo?
A manutenção do código começa com a etapa de criação ou a implantação de novas funcionalidades com a visão global do código, identificando pontos de mudança, criando testes afim de validar esses pontos, pensando em uma nova modelagem para o código, refatorando e, por fim, testando.
Martin Fowler define refatoração como uma mudança feita na estrutura interna do software, a fim de deixá-lo mais compreensível e modificável sem mudar o seu comportamento observável.
E o ato de refatorar como reestruturação do software, aplicando uma série de refatorações sem mudar o seu comportamento observável.
Exemplos de refatoração: extração de blocos lógicos em funções, renomeações, criação de objetos de parâmetro, extração para classes, remoção de código inutilizado e decomposição de condicionais aninhadas.
Para garantir que a refatoração feita não modificou o comportamento do código, precisamos sempre testá-lo.
The Boy Scout Rule
“Leave the campground cleaner than you found it.”
O programador deve se preocupar em aprimorar o código que pode ser otimizado sempre que manipulá-lo.
A regra do escoteiro diz respeito a essa ação de deixar o código sempre melhor do que quando o encontramos.
Conclusão
De acordo com os conceitos apresentados, é possível compreender a importância da criação de um código limpo.
Conforme vamos aplicando em nosso dia a dia, desenvolvemos um olhar mais técnico que identifica com maior facilidade códigos mal escritos e melhorias de prontidão.
O código limpo ajuda na manutenção e consequentemente diminui o custo do projeto.
Se você leu esse artigo até o final, agora está apto a sair treinando a habilidade de criar códigos limpos.
Se você busca uma oportunidade de desenvolvimento, trabalhando com inovação em um negócio de alto impacto, acesse o portal B2W Carreiras! Nele, você consegue acessar todas as vagas disponíveis. Venha fazer parte do nosso time!