Todos nós estamos cansados de ouvir o quanto escrever um bom código é essencial para o desenvolvimento de qualquer projeto, e que caso não sigamos essa linha de pensamento teremos os ruins e velhos problemas conhecidos, como por exemplo:
Problemas com a leitura do código: um código mal escrito o torna ilegível, fazendo com que o próprio desenvolvedor que o escreve, caso volte a ler aquele trecho algum tempo depois, corre o risco de não entender o que ele mesmo havia escrito.
Problemas com manutenibilidade: um código ilegível consequentemente dificulta a manutenção e extensão das funcionalidades do sistema, fazendo com que esse processo seja complicado e desgastante para o programador que venha a executá-lo.
Já ouvi muito na faculdade a seguinte frase:
“às três da madrugada de um domingo você não enxerga mais nada” (Prof. Dr. Ítalo Vega).
Esta frase está intimamente ligada ao fato da importância de você ter um código limpo e bem escrito. Pense na seguinte situação: você procurando um bug em uma função que não foi você quem a escreveu, e às 19hrs de uma sexta-feira, em uma aplicação que entrará em produção no sábado (o que é muito comum de acontecer). Se caso o programador que tenha escrito aquela função, um simples pedaço da aplicação, não tenha se preocupado com uma boa prática em codificação provavelmente fará com que você fique madrugada à dentro lendo e relendo todas aquelas linhas até entender o que de fato elas fazem, até encontrar o erro e finalmente corrigi-lo.
Levar mais tempo para fazer manutenção significa que você gastará mais dinheiro para estender ou corrigir pequenas funcionalidades, e gastar dinheiro além do previsto é uma das coisas que nenhum gerente de projetos gosta.
Sendo assim, como podemos codificar de modo que tenhamos um código limpo, legível e produtivo?
Alguns princípios básicos envolvem:
- Escolher bons nomes para suas variáveis, nomes significativos e que estejam de acordo com o contexto empregado são tão importantes quanto todo o código escrito. Dar bons nomes as suas variáveis faz com que todos que leiam seu código compreendam o real motivo dela estar sendo utilizada, facilitando a leitura e compreensão do código.
- Uma função deve fazer apenas UMA coisa – leia isso novamente! Uma função que desempenha mais de uma tarefa torna ainda mais complexa a sua compreensão e se transforma em uma função “bombril”, um pedacinho de código com mil e uma utilidades, o que na hora da manutenção se tornará em um monstro de 7 cabeças, ou dependendo do código escrito 7^7 cabeças.
- Dar bons nomes a funções é tão importante quanto dar bons nomes a variáveis, os nomes dados a funções devem expressar literalmente o que elas fazem de modo que um programador não precise ler o código inteiro de uma função para entender o que ela faz. Um problema ainda muito encontrado são funções em que seu nome não possuí nenhuma relação com o código que descreve o seu verdadeiro comportamento, o que irá confundir o desenvolvedor que usar está função pois ele perceberá que o que ela promete cumprir não condiz com o que ela de fato faz.
- A melhor forma de darmos bons nomes a funções e variáveis é fazermos uma análise do domínio do problema que estamos tentando solucionar, assim podemos extrair boa parte dos nomes que representam de fato os elementos que usaremos para solucionarmos o problema.
- Ainda falando sobre funções um outro aspecto muito importante é o seu tamanho, funções não devem ser grandes demais e caso sejam isso é um sinal de que algo está errado. Não podemos definir exatamente o que é um tamanho bom ou o que é um sinal de que temos um problema à vista, antigamente programadores consideravam o tamanho da tela uma boa métrica para o tamanho de funções porém hoje em dia temos diversos tamanhos de monitores, o que faz com que essa não seja a maneira correta de medirmos o tamanho de uma função. Podemos considerar uma função de tamanho ideal quando a sua quantidade de linhas está na faixa de 15 a 20 linhas, o que é suficiente para desempenhar apenas uma atividade, mas é claro que em alguns momentos isso pode variar para mais ou para menos dependendo do contexto que a qual função pertence fazendo com que tenhamos que usar o bom senso.
Princípios como estes nos ajudam a desenvolver códigos de maior qualidade, fazendo com que tenhamos maior produtividade e torne prazerosa a escrita de qualquer que seja a funcionalidade que o sistema exija, influenciando na manutenibilidade e complexididade do que é produzido, ou seja, são de extrema importância em nosso dia-a-dia.
Recomendo como leitura sobre boas práticas e como escrever um bom código o livro “Código Limpo” de Robert C. Martin, este livro trata a fundo estes pontos e muitos outros considerados indispensáveis para que possamos obter um código bem escrito e funcional.
Ame o seu código, pois ele descreve o profissional que você é.
Esqueci algum princípio para código limpo? Deixe seu comentário! 🙂
Até a próxima!
@marvinferreira
11 Comentários
Ótimo artigo!
Sobre os princípios para um código limpo eu adicionaria a identação. Nada pior que uma cadeia de IF/Loop/Etc e não saber onde começa e termina cada um.
Legal essas dicas, outra coisa seria o estudo dos padroes de projetos e utilizacao de frameworks. Mais esta muito bom e com certeza vou pegar as dicas para nome de variaveis e funcao serem pegues do dominio do problema.
Vlw
Boas dicas! Aproveito para levantar uma questão referente aos **nomes** de uma classe. Vamos assumir que objetos da classe “TextFile” possuem a responsabilidade de ler e escrever dados em um arquivo de texto. Podemos perceber objetos “TextFile” como **mecanismos** para manipulação de arquivos de texto. Se pensarmos em encapsular uma particular **política** de uso desses objetos para gerar arquivos HTML em uma classe, que nome daríamos a ela? Dentre as possibilidades procedimentais (porquê?): “GeradorHTML”, “GeraçãoHTML”, etc. Dentre as possibilidades do tipo mecanismo (ruim?): “HTMLFile”, “TextoHTML”, etc. Quais possibilidades de nomeação da classe seriam sugeridas por um pensamento orientado a objetos? Seriam diferentes das anteriores?
Um grande abraço!
Parabéns pelo post Marvin… Como você disse, na questão da compreensão do código e na manutenibilidade tanto para quem desenvolveu o código ou para outro desenvolvedor que irá mexer no código já escrito, é muito importante manter um código limpo. É importante também para a experiência do usuário, pois um código bem organizado evita vários bugs e caso aconteça de aparecer um, poderá ser resolvido rapidamente sem ter que deixar o usuário esperar muito tempo pela solução do problema. E levemos em consideração a primeira coisa que aprendemos quando começamos estudar programação: “Mantenha a coisa simples”.
Abraço.
Gostei!
Apesar de não fazer tanto sentido para mim devido a minha ignorância sobre o assunto, elogio o texto que foi bem escrito e está bastante fácil de entender.
Parabéns cara.
Abraços
Um bom indicador que você começou a escrever um código ruim eh o primeiro else-if. Nesse caso pare e procure uma outra solução (mais elegante) para o problema.
Abraços
@serragnoli
Muito Bom artigo! Parabéns.
Outra dica que eu acho interessante e importante eh comentar o código inteiro, explicando o que cada parte do código faz. Isso ajuda muito o entendimento quando for necessário fazer alguma alteração no futuro, especialmente se tiver que ser feito por uma pessoa que não escreveu o código.
Um abraço.
Iniciativa bacana Marvin.
Código limpo é um dos meus tópicos favoritos. Lembrei de cara do Bob C Martin. Apenas achei o texto um pouco curto, mas isso pode ser uma deixa para continuações 😉
Recomendo a todos o livro citado pelo Marvin, tenho o meu sempre por perto e todo rabiscado! E para vocês deixo uma das primeiras dicas que recebi no início da carreira: Para escrever um bom código é preciso ler bons códigos.
Putz, entrei em loop no segundo ponto…
Bom artigo, basicamente esses são um dos principais fundamentos usados nas linguagens de programação.
Resumindo (TL; DR): Preocupe-se sempre em definir nomes convincentes para as funções e variáveis criadas, e fragmente seu código em funcionalidades (Dada função é responsável por apenas uma coisa).
Parabéns pela postagem Marvin. Atualmente a flexibilidade que algumas linguagens nos proporcionam, fazem com que acabemos ficando mal acostumados e nossos códigos ficam escritos de maneira suja e as vezes errado. Princípios como evitar converter uma variável string para lista e passar o valor para ela mesma, evitar usar vários try e catch um dentro do outro, são fundamentais para o bom uso da linguagem. Seu post expressa de forma correta e resumida tudo isso. Parabéns amigo.