Descubra a importância do Clean Code: escrever código limpo, significativo e de fácil manutenção para economizar tempo e evitar dores de cabeça.
Tempo de Leitura: 7 minutos
Podemos traduzir, de forma literal, “Clean Code” como sendo “Código Limpo”, porém ainda assim não estaríamos expressando o verdadeiro valor que existe nesta filosofia de desenvolvimento de software. Isso mesmo, “filosofia de desenvolvimento”.
O Clean Code é um conceito, uma abordagem, uma maneira de se olhar para a arte da programação, em busca de atingir um nível satisfatório de organização, beleza, originalidade, entendimento, coesão e eficiência de um programa de software. Continue a leitura para saber mais.
Imagine a seguinte situação: você viu uma vaga de programador de software em uma empresa multinacional, então decide aplicar para vaga. Analisando os requisitos, percebe que um dos principais é explicar uma aplicação própria criada para resolver algum problema. Sem delongas, você acessa seu repositório de projetos, em busca de algum projeto que tenha sido concluído por completo e que satisfaça os requisitos mínimos da vaga. Lá está, um projeto que fez alguns meses atrás, o projeto nomeado “BuscadorDeCep”.
Estranhamente o projeto não contém um “leia-me”, mas bem, se o nome é “BuscadorDeCep”, obviamente é uma aplicação que busca informações de um CEP qualquer, não é mesmo? Então você acessa o projeto e tem a primeira decepção, na verdade esta aplicação não retorna informações de endereço através do CEP, é apenas um projeto destinado a conectar-se a um banco de dados e buscar literalmente só o código CEP de uma tabela de dados de pessoas. Porém a situação fica mais agravante quando você navega pelas classes e arquivos deste projeto, nomes estranhos, parte do código está em inglês e outra em português – chamamos isto de “código bilíngue”, o conhecido:
String getName() {
return this.nome;
}
E não para por aí, alguns trechos do código você simplesmente não consegue compreender o que fazem, pois usam variáveis com nomes incompreensíveis, comentários sem sentido:
int retornos(int numA, int numB) {
if (numA >= numB) {
return 0; //Retorno era maior que o esperado
} else {
return numA;
}
}
Estes exemplos são casos bem comuns para quem desenvolve sem utilizar padrões de desenvolvimento, princípios e boas práticas. Para resolver este problema surgiu o Clean Code, uma maneira simples de tornar códigos mais legíveis, compreensíveis, reutilizáveis, “bonitos” aos olhos.
Afinal, o que é Clean Code?
O termo “Clean Code” foi abordado pela primeira vez no livro “Clean Code: A Handbook of Agile Software Craftsmanship”, uma obra de Robert Cecil Martin, conhecido carinhosamente pela comunidade de TI como “Uncle Bob”, que foi um dos pioneiros da metodologia ágil de desenvolvimento, pois, participou da criação do documento “O Manifesto Ágil”.
O autor, que atua na área desde 1970, percebeu que a maior parte do tempo do processo de desenvolvimento de software é destinado na manutenção do código e na leitura e interpretação de códigos já criados do que de fato criação e escrita de novos códigos, isso mostra a importância em programar de maneira padronizada, seguindo princípios bem definidos, ou seja, escrever um “código limpo”.
Por que aprender sobre Clean Code?
“Tempo é dinheiro!” – Já ouviu essa frase antes?
Acredite, o mundo da TI tem uma constante não constância, as ferramentas, bibliotecas, a forma de se pensar algo, mudam a todo instante. Infelizmente, logo após finalizar um projeto, de qualquer porte, ele já poderá ser etiquetado como código legado, pois provavelmente já foram feitas atualizações ou criadas novas abordagens e metodologias para resolver problemas que você enfrentou durante o desenvolvimento de seu software. Traduzindo isto, temos um resultado bem simples: a manutenção é o que toma mais tempo no processo de desenvolvimento. E dentro da manutenção entra a análise de código e é aí onde ocorre o “pulo do gato”.
O Clean Code poderá te ajudar – e muito – no processo de manutenção, visto que você terá escrito, desde o início, um código organizado, eficiente, com escopo bem definido. Ao invés de passar horas tentando entender porque algo não funciona, você poderá passar horas pensando em como melhorar em algo, estudando, evoluindo de fato, agregando valor.
Um dos principais pontos do Clean Code é justamente isto, escrever um código que agregue valor de verdade. Que faça o que foi escrito para fazer e não cause dores de cabeça no futuro. No próprio livro “Código limpo: Habilidades práticas do Agile Software” é exibido uma tirinha que demonstra duas portas de escritórios de revisão de código, onde os autores explicam que a porta de onde se escuta mais “que diabos é isso?!” por minuto é onde se encontra um código de baixa qualidade e nós, programadores, sabemos que isto é uma realidade, e por conta disso podemos concordar que vale muito a pena demandar algumas horinhas a mais e gastar alguns neurônios pensando em um bom código limpo do que escrever de qualquer jeito e sofrer muito na hora de dar manutenção.
Princípios do Clean Code
No livro, os autores apresentam uma série de capítulos que decorrem por abordagens de desenvolvimento, boas práticas e bons modos ao se escrever código. Em seguida, abordaremos alguns dos principais princípios do Clean Code, que certamente elevarão suas habilidades como programador.
O custo de um código confuso
Ter que dar manutenção em um código ruim é muito custoso para qualquer empresa e nós como desenvolvedores profissionais devemos ter ciência e levar isto em conta na hora de escrever os programas. Na maioria das vezes você encontrará projetos legados já em andamento, são raras as vezes que se inicia um grande projeto do zero, isto pode ser visto em casos de startups ou empresas que migram para um sistema novo, mais robusto, ou até abandonam o projeto antigo justamente por ser inviável prosseguir.
Então, justamente por saber dessa realidade, escrever um código limpo se torna uma motivação constante. Escrever códigos confusos, sem padrões, podem ser custosos inclusive no curto prazo, pois você pode muito bem esbarrar em um bug envolvendo regra de negócio e pode ser uma grande dor de cabeça conseguir rastrear onde está ocorrendo o erro.
Um dos princípios do Clan Code é justamente escrever código de maneira “harmoniosa”, de modo que fique fácil ler e interpretar o que acontece, observe os dois exemplos de código abaixo:
void pares() {
int s = 0;
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) {
s += i;
}
}
System.out.println(s);
}
void somaNumerosPares(int limiteMaximo) {
int somaNumerosPares = 0;
for (int numero = 0; numero <= limiteMaximo; numero++) {
if (numero % 2 == 0) {
somaNumerosPares += numero;
}
}
System.out.println("A soma dos números de 0 a " +
limiteMaximo + " é " +
somaNumerosPares);
}
Observe que no exemplo 2 são usados nomes mais detalhados, que expressam o que aquelas variáveis guardam, assim facilita muito a leitura e interpretação do que aquele bloco de código realiza. Assim, conforme você for “organizando” o código, cada vez ficará mais legível e mais fácil de dar manutenção.
Nomes significativos
Conforme vimos nos exemplos anteriores, um método com nome “PopulaPropriedadesDaConta” parece ser muito mais significativo do que simplesmente “Dados”. Devemos tomar muito cuidado ao nomear métodos, funções, classes e até variáveis e propriedades em nosso código, pois, quanto mais legível e de fácil entendimento for, menos trabalho você terá na hora de retomar um projeto ou de dar manutenção ao software.
Nessa hora não valem brincadeiras e nem piadas de mau gosto, nomear métodos como “AniquilaTarefas” ou “TaVazio” podem ser engraçados de momento e até fazer sentido para você, porém quando outra pessoa fora de seu contexto ler estes nomes, não ficará tão claro quanto se fosse “EncerraTarefaEmExecucao” e “ValidaSeEstaVazioOuNullo”, por exemplo.
Os nomes de métodos, principalmente, devem ser claros, objetivos e bem expressivos. Não tenha medo caso o nome fique muito grande, é importante deixar bem claro, da melhor forma possível, o que o método faz. Claro, existem casos em que pode-se abreviar ou usar palavras mais curtas, desde que o nome do método não perca sentido ou não expresse bem o que o bloco de código da sequência faz.
Apenas uma responsabilidade
Uma classe nomeada “ValidadorDeCnpj” obviamente deve verificar um CNPJ, não é mesmo? Bom, é o que esperamos, mas na realidade é comum atribuirmos responsabilidades a mais em nossas classes e métodos. Não é esperado, por exemplo, que uma classe com este nome realize uma conexão com banco de dados, afinal de contas, se ela foi criada para validar um CNPJ, esta deve ser sua única responsabilidade. Qualquer outra função que precise ser executada, como validar campos nullos, salvar dados em um banco, deve ser atribuída a sua devida classe ou método.
Uma forma muito simples de verificarmos se algum trecho de código faz muito mais do que deveria é pela quantidades de letras “E” que aparecem no nome da classe ou método, por exemplo “CalculaCordenadasEMostraNaTela”, “GeraRelatorioEAtualizaDadosENoticaEmail” são nomes que explicitamente indicam que este código está com mais de uma responsabilidade. Além de ficar maior e mais complexo, fica difícil de identificar código duplicado, pois podem ter métodos diferentes que implementem uma mesma funcionalidade, justamente por conta deste descuido na hora de atribuir responsabilidades na escrita do código.
Um bom código é sua própria documentação
No livro, Uncle Bob explica que “os comentários mentem”, isso porque é muito comum serem realizadas modificações no código, mas não nos comentários, por conta disso, ao longo do tempo, os comentários sobre um bloco de código deixam de fazer sentido.
A situação ideal seria se o próprio código pudesse deixar bem claro o que ele realiza. Veja os exemplo abaixo:
int somaDoisNumerosInteiros(int numeroA, int numeroB) {
return numeroA + numeroB;
}
void cadastraCertificadoDigital(Usuario usuario, Certificado certificado) {
vinculaCertificadoNoUsuario(usuario, certificado);
atualizaDadosDeUsuario(usuario);
}
O código por si explica o que ele vai fazer, só de bater o olho podemos entender que o primeiro exemplo “somaDoisNumerosInteiros” é um método que recebe dois números inteiros, soma eles e retorna o resultado desta soma. Assim como no segundo exemplo, é um método de cadastro de certificado digital, que recebe um usuário e um certificado e realiza a chamada de dois outros métodos com nomes bem sugestivos do que fazem. Já se não tivéssemos uma harmonia e organização boas, talvez tivéssemos que recorrer a comentários para esclarecer o que o código está fazendo:
void cadastraCertificadoDigital(Usuario usuario, Repositorio certificados) {
String nome = certificados.nomes[usuario.cpf]; //encontra o certificado pelo cpf do usuario
usuario.certificado = nome; //vincula o nome do certificado no cadastro do usuario
}
Então, sempre antes de comentar um trecho de código, pense em como melhorar o próprio código, visando torná-lo mais claro e objetivo.
Formatação de código
Por fim, e não menos importante, lembre-se de seguir uma única convenção de indentação, nomeação e estrutura em todo seu projeto. Isso vai te ajudar a dar manutenção no código e também ficará mais fácil para novos colaboradores iniciarem seu processo de desenvolvimento no mesmo projeto.
Conclusão
Estes princípios são apenas uma parte ínfima do Clean Code, mas muito importantes para a vida útil de seu software. Unindo estas dicas com demais arquiteturas e filosofias de desenvolvimento, como SOLID, Microsserviços, Reutilização de Software, você terá um embasamento fortificado para dar vida a um software de excelência.
Vamos continuar a conversar sobre lá no fórum da Casa do Desenvolvedor?