DevOps

Entenda o que é refatoração e suas principais técnicas

Refatoração é o processo de mudança de software de uma forma que não altere seu comportamento externo e melhore sua estrutura interna. Ele é usado para manter o software bem projetado, mesmo ao longo do tempo e das mudanças que serão experimentadas. Com isso em mente, e para facilitar o entendimento do conceito, veremos neste artigo como utilizar a técnica de refatoração em uma pequena aplicação de exemplo.

Durante o desenvolvimento de software, mais especificamente durante a fase de codificação, geralmente um grupo de desenvolvedores é responsável pelo trabalho de escrever o código, o que significa que várias pessoas irão escrever e compartilhar código entre si até que o software esteja completo.

Quanto maior a equipe, menor o contato entre os desenvolvedores e maior a chance de pequenos erros, como código duplicado, classes no pacote errado, métodos na classe errada e outras coisas que podem levar à estrutura interna do software Os erros são um pouco confusos, até confusos.

Em algum ponto da fase de desenvolvimento, entender o código pode ser tão confuso e/ou complexo que começa a atrapalhar o desenvolvimento de novos recursos. Neste ponto, os desenvolvedores podem gastar mais tempo corrigindo bugs causados ​​por código mal escrito do que adicionando novos recursos.

Uma boa prática para evitar que isso aconteça é fazer alterações no código, ou seja, refatorar, sempre que encontrar algo que fuja do padrão (orientação a objetos, frameworks utilizados, padrões da empresa, etc.) para que fique simples e organizado.

Neste artigo, explicaremos o conceito de refatoração e demonstraremos seu uso na prática por meio de uma série de refatorações de código (intencionalmente) mal escrito para mostrar o quanto a refatoração pode melhorar a compreensão do código e o design de software. Para realizar esse tipo de refatoração, usaremos o Eclipse IDE e as ferramentas que ele fornece para automatizar a refatoração.

Extreme Programming (XP)

XP (Extreme Programming) é um método ágil focado no desenvolvimento de software. Possui valores e princípios que devem ser aplicados durante a fase de desenvolvimento de software.

Os cinco valores fundamentais são: Comunicação, Simplicidade, Feedback, Coragem e Respeito.

Nesse sentido, possui os princípios básicos de feedback rápido, simplicidade de suposições, mudança incremental, aceitação da mudança e trabalho de qualidade.

As práticas extremas de programação incluem os principais núcleos do processo que demonstram o valor necessário e suficiente de um projeto de sucesso: presença do cliente, planejamento, reuniões stand-up, programação em pares, testes contínuos, código coletivo, padronização de código, design simples, integração contínua, versões curtas e nossa A prática descrita neste artigo, refatoração.

Refatoração e Código Limpo

Tornar o código limpo também é um processo de refatoração, ou pelo menos pode ser um processo de refatoração, dependendo se isso foi feito ou não durante o desenvolvimento da versão de lançamento.

Uma referência sobre este tópico é Clean Code: A Handbook of Agile Software Craftsmanship. É uma das melhores referências que temos para entender e aplicar práticas de código limpo.

Código limpo nada mais é do que um código simples, elegante e direto. Ele pode ser facilmente entendido por qualquer desenvolvedor escrevendo código para fins de manutenção. Mas não se deixe levar por um conceito ou definição. De acordo com Robert C. Martin, deve haver tantas definições de código limpo quanto programadores. Algumas práticas de código limpo são:

Utilizar nomes significativos.

Funções curtas.

Bons comentários.

Formatação de código.

Tratamento de erros.

etc.

Refatorar um código para deixá-lo limpo significa:

Remover todo código duplicado.

Remover classes desnecessárias, tornando o número delas mínimo com responsabilidades bem definidas.

Fazer de tal forma que todos os teste passem.

Quando devemos refatorar?

Podemos e devemos refatorar quando:

Estamos implementando algo pela primeira vez.

Vamos fazer algo que já foi feito antes. Refazer de forma não repetível.

Tínhamos que fazer algo novo, mesmo enquanto fazíamos uma revisão.

Como realizar a refatoração?

Para começar a refatorar o código, devemos sempre ter em mente:

Se possível, devemos realizar uma série de mudanças atômicas em pequena escala. Isso tornará o código existente cada vez melhor ao longo do tempo e de todo o programa.

Abaixo, um checklist para o processo de refatoração:

O código deve estar em conformidade com as práticas do Código Limpo.

Nenhum novo recurso é desenvolvido.

Todos os testes foram aprovados após a refatoração.

Para isso, podemos usar algumas técnicas para refatorar nosso código.

Tecnologia de refatoração

Método de extração.

Problema: você tem um snippet de código que pode ser empacotado.

Solução: Mova este código para um novo método (ou função) separado e substitua o código antigo por chamadas de método.

Método em linha.

Problema: Use esta técnica quando o corpo do método for mais óbvio que o próprio método.

Solução alternativa: substitua a invocação do método pelo conteúdo do método, excluindo o próprio método durante a refatoração.

Extrair variável.

Problema: Você tem uma expressão incompreensível.

Solução: Coloque o resultado da expressão ou parte dela em uma variável separada autoexplicativa.

Dividir variável temporária.

Problema: Você tem uma variável local que armazena vários valores intermediários dentro de um método (exceto variáveis ​​de loop).

Solução: Use variáveis ​​diferentes para valores diferentes. Cada variável deve ser responsável apenas por uma coisa específica.

Remover atribuições a parâmetros.

Problema: Alguns valores são atribuídos a parâmetros no corpo do método.

Solução: Use variáveis ​​locais em vez de parâmetros em refatorações.

tecnologia de substituição

Temperatura em linha

Problema: Você tem uma variável temporária que recebe o resultado de uma expressão simples e nada mais.

Solução: Substitua a referência à variável pela própria expressão na refatoração.

Substituir Tem por consulta.

Problema: você coloca o resultado de uma expressão em uma variável local para uso posterior em seu código.

Solução: Mova a expressão inteira para um método separado e retorne o resultado. Olhe para métodos em vez de usar variáveis. Se necessário, incorpore novos métodos em outros métodos.

Substituir método por objeto de método.

Problema: Você tem um método longo com variáveis ​​locais tão entrelaçadas que não pode aplicar o método de extração.

Solução: Converta o método para uma classe separada, tornando os campos de variáveis ​​locais da classe. Então você pode dividir os métodos dentro da mesma classe.

Algoritmo substituto.

Problema: Substitua um algoritmo existente por um novo algoritmo.

Solução: Substitua o corpo do método que implementa o algoritmo pelo novo algoritmo.

Um pequeno exemplo…

Vamos realizar uma pequena refatoração para extrair método do código Java abaixo:

public class Produto {

private String nome;

private String categoria;

private String descricao;

private Integer codigo;

private ProdutoRepositorio produtoRepositorio;

// construtor

// getters e setters

if (this.getName() == null) {

throw new Exception(“É necessário definir um nome para o produto!”);

}

if (this.getCategoria() == null) {

throw new Exception(“É necessário definir uma categoria para o produto!”);

}

if (this.getDescricao() == null) {

throw new Exception(“É necessário definir uma descricao para o produto!”);

}

if (this.getCodigo() == null) {

throw new Exception(“É necessário definir um codigo para o produto!”);

}

public void salvarBancoDeDados() {

this.produtoRepositorio.save(this);

}

}

Refatorando…

public class Produto {

private String nome;

private String categoria;

private String descricao;

private Integer codigo;

private ProdutoRepositorio produtoRepositorio;

// construtor

// getters e setters

private void propriedadesCheker() {

if (this.getName() == null) {

throw new Exception(“É necessário definir um nome para o produto!”);

} else if (this.getCategoria() == null) {

throw new Exception(“É necessário definir uma categoria para o produto!”);

} else if (this.getDescricao() == null)  {

throw new Exception(“É necessário definir uma descricao para o produto!”);

} else if (this.getCodigo() == null) {

throw new Exception(“É necessário definir um codigo para o produto!”);

}

}

public void salvarBancoDeDados() {

this.propriedadesCheker();

this.produtoRepositorio.save(this);

}

}

Poderíamos mostrar alguns exemplos para cada técnica de refatoração, mas este post será longo e chato.

O ideal é assimilar conceitos e técnicas aos poucos, demora um pouco, mas sempre acabamos dominando todo o escopo da refatoração. Isso é apenas prática!