Refatorando com confiança!

Você já encontrou algum código e pensou: “Nossa, que código bom!”? (obs: ler com voz irônica).

Talvez sim, mas provavelmente a proporção de base de códigos bom vs ruins é bem baixa. O que leva alguém a escrever um código ruim? Com certeza a habilidade e experiência da pessoa influencia na qualidade do seu código, meus primeiros códigos não tinham a mesma qualidade dos que escrevo hoje (ainda bem!).

Eu acredito que o principal fator que torna um código ruim não é a pessoa que escreveu, mas sim as várias pessoas que passaram por aquele código e não o melhoraram quando necessário (e já adianto que nem vou falar sobre a falta de tempo).

Qual o melhor momento para refatorar código?

Quando você precisa mudar um código para implementar uma nova funcionalidade. Não, não é durante o code review e nem fora das horas de trabalho.

Refatorar fora das horas de trabalho (horas que o time concorda em estar junto trabalhando) cria a cultura do heroísmo onde uma pessoa salva o projeto. O problema é que precisa de um herói para terminar o trabalho de outro herói, e ai já viu né.

Durante o code review é comum fazermos pequenas sugestões, alertar sobre código duplicado ou até conflitos de funcionalidade.

Durante a revisão de código quem está revisando provavelmente não sabe como aquele código vai precisar evoluir, então qualquer sugestão é baseada apenas na experiência da pessoa, é só um chute. Se aquela parte do código nunca mais for tocada, não importa se o código tá duplicado ou se a modelagem está bem feita, se os testes passam e o código funciona tá tudo bem.

Na hora de mudar vai tá tudo uma bagunça

Sim, provavelmente, e isso é bom! Na hora que precisar mudar você vai ter mais contexto de como o código precisa evoluir e qual seria um bom design, o que é bem melhor do que só um chute.

(Essa ideia de que revisão de código aumenta a qualidade do código é o que mais me incomoda na cultura de Pull Requests, mas essa polêmica fica pra outro post)

O que realmente causa a bagunça não é quem escreveu o código (a coitada da pessoa que escreveu não tinha como prever o futuro, certo?) é quem passa por ele e não se preocupa em melhorar.

Uma ideia interessante do livro 99 Bottles of OOP (um excelente livro da Sandi Metz e Katrina Owen, super recomendo) é o Shameless Green, que basicamente segue a ideia do TDD a risca. Escreva o código que faz os testes passarem e pronto.

Não adianta especular generalizações e nem forçar todas as abstrações de domínio possíveis. Apenas se preocupe em escrever o código que faz os testes passarem e confie que quando uma mudança for necessária, a pessoa que estiver escrevendo o código vai melhorá-lo.

Regras de negócio mudam, pessoas ganham mais conhecimento do negócio, da aplicação e de escrita de código em geral, é normal que o código precise de pequenas (ou grandes) melhorias de vez em quando.

Refatore com confiança!

Considerando que você tem mais contexto de quem escreveu o código original é hora de procurar por pontos de melhoria, e ai entram os code smells!

Eu já devo ter escrito por aqui outras vezes mas é sempre bom relembrar: identifique code smells primeiro refatore depois.

Um ponto importante sobre code smells é que eles não são estáticos (apesar de existirem ferramentas de análise estática de código que funcionam muito bem). Pense por um instante: qual é o real problema com o código duplicado?

Eu não acho que é ter duas (ou mais) partes parecidas de código fazendo a mesma coisa, mas sim alguma abstração do domínio que precisa ser identificada.

Aliar o contexto de negócio, sabendo como o código precisa evoluir, com o conhecimento de escrita de software é crucial.

Se você quiser conhecer mais sobre refatoração, padrões de projeto e design orientado a objetos colocando a mão na massa, dá uma olhada nos livros Refatorando com Padrões de Projeto (com versão em Ruby e Java).

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s