Refatorando códigos existentes

 


       Dentre os termos frequentemente utilizados em desenvolvimento de software, “refatoração” é usado na maioria das vezes de forma flexível, sendo utilizado para se referir a qualquer tipo de limpeza no código. Recorrendo a um especialista, de acordo com a definição presente no livro “Refactoring” do Martin Fowler, percebemos que a definição de refatoração vai além, segue definição:  “Refatoração (substantivo): uma modificação feita na estrutura interna do software para deixa-lo mais fácil de compreender e menos custoso para alterar, sem que seu comportamento observável seja alterado.” (Fowler, 2020)

                A definição acima aponta para uma abordagem muito mais abrangente que uma limpeza, podendo ser vista como uma “reestruturação” e estando totalmente ligada à aplicação de pequenos passos que não modificam o comportamento observável da aplicação. E é a soma desses pequenos passos que levam a uma mudança grande. É importante notar que a cada pequena mudança realizada, nenhuma falha deve ser percebida na utilização, ou em outras palavras, ele deve fazer exatamente o que fazia antes de iniciar a refatoração.

                Então a ideia é que se seguirmos com a refatoração em pequenos passos, cuidadosamente, não causaremos nenhuma falha... Mas e se eu cometer um erro? (ou melhor, quando cometer um erro). Erros sempre acontecem, e não são um problema se identificarmos eles rapidamente e os corrigirmos. Daí a importância dos pequenos passos. Se a modificação realizada foi pequena, será mais fácil encontrar onde o problema aconteceu, pois teremos um trecho pequeno de código para verificar. Se não for possível encontrar o erro, podemos voltar a uma versão do código que sabemos que funcionava.

Para facilitar e encontrar os erros rapidamente, outro ponto importante é um conjunto de testes abrangente no código e que possa ser executado rapidamente. Assim, quando um teste falhar, poderemos olhar rapidamente para as modificações que fizemos e comparar o código atual com o último código para o qual o teste passou. Portanto, sempre que fizer uma refatoração, caso não existam testes para as funcionalidades que está modificando, é fundamental criar os testes antes. Isso dará mais segurança ao processo e também a nós programadores.                  

Pode-se também comparar a refatoração com uma otimização de desempenho, pois nos dois casos realiza-se modificações no código que não modificam a funcionalidade do sistema. Porém a diferença está no propósito. A refatoração é sempre feita com a finalidade de deixar o código mais fácil de entender e menos custoso para alterar, sem se preocupar se o código ficará mais lento ou mais rápido. Na otimização a única preocupação é deixar o código mais performático, mesmo que com isso fique mais complexo de entender e difícil de alterar.

Neste ponto você leitor já deve ter uma ideia do que é refatoração, mas deve estar se perguntando quais os principais motivos para realizar uma refatoração. Pois digo que bons motivos são: Melhorar o design do código existente, pois sem ela, ao longo da vida útil do software e as consequentes modificações realizadas por diferentes pessoas, a tendência natural é que o código entre em decadência. Se torna cada vez mais difícil ver a estrutura do software e mais difícil preservá-lo. Sempre que fizer uma refatoração, deixe o código mais fácil de entender do que antes de iniciar, se preocupe com as outras pessoas que irão ler o código. É relativamente fácil escrever um código que o computador seja capaz de entender, mas o desafio e o valor maior estão em escrever um código que outras pessoas vão poder entender rapidamente e sem grande esforço. E isso não é necessariamente algo altruísta. A pessoa que terá de modificar o código pode ser seu eu do futuro, daí a um ou dois anos, quando não se lembrará mais dos códigos que criou.

Outro benefício que pode vir da refatoração é ajudar a localizar, entender e resolver bugs. O trabalho de entender um código para refatorá-lo certemente aumentará sua compreensão da estrutura do programa até o ponto que será inevitável localizar os bugs. O último motivo que darei para refatorar um código é também o mais contraintuitivo. Na maioria das vezes, as pessoas conseguem ver o valor da refatoração no que se refere a promover a melhoraria da qualidade possibilitando um design interno melhor, mais legibilidade e redução de bugs. Mas e o tempo gasto com a refatoração não deixa o desenvolvimento mais lento?

De acordo com Fowler, comparando uma equipe que investe na qualidade interna do software: um bom design interno que permite saber facilmente como e onde devem fazer as alterações para acrescentar uma nova funcionalidade e uma boa modularidade que permita que só seja necessário entender uma pequena porção do software para realizar uma alteração, são equipes que conseguem ser mais rápidas com o passar do tempo para acrescentar novas funcionalidades pois tiram proveito do código existente. Ao passo que as equipes que vêm trabalhando em um sistema há um certo tempo sem promover melhorias, dizem que no começo eram capazes de realizar progressos rapidamente, mas agora demoram muito mais para acrescentar novas funcionalidades e entender como elas se encaixarão na base de código existente.


Em resumo, sabemos agora que sempre é possível melhorar o design de um código existente, mesmo que as necessidades do software mudem. E como é muito difícil fazer um bom design antes que o software seja desenvolvido, a refatoração se torna essencial para caminhar em direção ao caminho virtuoso das funcionalidades rápidas. Espero que este texto tenha agregado algum valor a você na sua jornada como programador. Agredeço a atenção e até a próxima! Deixe seu comentário!


Referências

FOWLER, Martin. Refatoração: Aperfeiçoando o design de códigos existentes. Novatec Editora, 2020.

Comentários

Postagens mais visitadas deste blog

Como utilizar Tag Prefix WinCC Professional

TUTORIAL: Criando WinCC Tags a partir de documentos de texto utilizando script em Python

TUTORIAL: Dashboard com dados de uma CPU S7 utilizando comunicação OPC UA