TOP
O que é refatoração?
Descrição
Reestruturação (Refactoring) – alterações feitas na estrutura interna do software (software) para torná-lo mais fácil de entender e mais rápido de modificar sem alterar o comportamento externo. Além disso, é uma reestruturação do software através da aplicação de uma sequência de refatorações sem alterar o comportamento externo do software.
Vantagens da refatoração:
- A refatoração melhora o design do software. Com o tempo, muitas alterações adicionais são feitas no código e o software perde sua estrutura com o tempo. A perda de estrutura tem efeito cumulativo. Quanto mais difícil é ver o design no código, mais difícil é mantê-lo e mais rápido ele desmorona. Além disso, tais alterações causam redundância e duplicação de código, tornando o sistema mais difícil de compreender e modificar.
- A refatoração torna o código do software mais compreensível.
Quando você precisa refatorar:
- Quando um novo recurso é adicionado;
- Quando um erro é corrigido (consertado);
- Durante a revisão do código.
Maus cheiros no código (Smells Catalog) :
- Duplicação de código
- Método longo
- Grande aula
- Uma longa lista de parâmetros
- Modificações divergentes
- Tiro de tiro
- Recursos invejosos
- Blocos de dados
- Obsessão por tipos elementares
- Switch operadores
- Hierarquias paralelas de imitação
- Aula preguiçosa
- Comunidade especulativa (teórica)
- Campo temporário
- Tópicos de mensagens
- Agente
- Proximidade inadequada
- Classes alternativas com interfaces diferentes
- Classe de biblioteca incompleta
- Classes de dados
- Comentários
Possíveis opções de refatoração
-
Moving Features Between Objects (Transferência de código completo entre objetos):
- Move Method (Desprendimento de método) – isole um método separado se o método for muito longo ou contenha código que exija comentários.
- Move Field (Campo móvel) – realizado quando o campo é usado por outra classe com mais frequência do que onde está definido.
-
Organizing Data (Disposição dos dados):
- Encapsulate Field (Encapsulamento de Campo) - hum, dois princípios básicos da OOP são o encapsulamento ou ocultação de dados. Ao tornar os dados públicos, os objetos podem ler e alterar seus valores sem as noções do proprietário dos dados. Portanto, fechamos este campo e fornecemos métodos de acesso.
- Encapsulate Collection (Encapsulamento de Coleção) - muitas vezes uma sala de aula contém uma coleção de exemplares. Esta coleção pode ser uma matriz, lista, conjunto ou vetor. O método getter não precisa retornar o objeto da coleção, pois isso permitiria aos clientes modificar o conteúdo da coleção, bem como o conhecimento da classe que possuem. Portanto, você precisa retornar o valor retornado pelo método somente leitura e criar métodos para adicionar/remover elementos.
-
Composing Methods (Extraindo e combinando código):
- Extract Method (Desprendimento de método) – se você tiver um trecho de código que possa ser agrupado, coloque esse trecho em um método separado com um nome que explique sua finalidade. Assim, o nome do método substituirá os comentários.
- Inline Method (Incorporação de método) – às vezes é útil mover o corpo de um método para o código que o chama. Às vezes, os corpos dos métodos são tão autoexplicativos quanto o nome próprio do método. Além disso, podem existir situações em que existem muitos métodos diferentes, cuja estrutura não é bem-sucedida e, portanto, é melhor colocar todos eles em um método geral e depois separar os métodos de outra forma.
- Inline Temp (Inserção de uma variável temporária) – a substituição de uma variável temporária à qual uma expressão simples é atribuída apenas uma vez. Às vezes, essa variável interfere em outras refatorações.
- Replace Temp with Query (Substituindo uma variável temporária por uma chamada de método) – é usado quando uma variável temporária é usada para armazenar o valor de uma expressão. Neste caso, substitua a expressão por um método e substitua todas as referências no código a esta variável pelo novo método.
- Split Temporary Variable (Dividir uma variável temporária) – uma única variável temporária é aplicada para atribuir vários resultados a resultados diferentes (a menos que seja uma variável usada em um loop dentro de um loop e não seja uma variável para acumular o resultado). Neste caso, criamos uma variável separada para cada atribuição.
-
Simplifying Conditional Expressions (Simplificando expressões com condições):
- Decompose Conditional (Decomposição do operador condicional) – executado quando temos uma cadeia condicional de verificações (if-then-else). Substituímos a condição (if), partes de then e else por métodos separados. Contribuímos para uma melhor compreensão do motivo da ramificação e os nomes dos métodos esclarecem ao final do trecho de código correspondente.
- Consolidate Conditional Expression (Consolidação da expressão condicional) - é realizado que haja uma série de verificações de condição que forneçam o mesmo resultado. Você precisa combinar todas as verificações em uma expressão única ou método condicional.
- Consolidate Duplicate Conditional Fragments (Consolidação de fragmentos condicionais duplicados) – o mesmo fragmento está presente em todos os ramos da expressão condicional. Você precisa mover este trecho de código para esta expressão.
- Remove Control Flag (Removendo o sinal de controle) – existe uma variável que atua como sinal de controle para uma série de expressões lógicas. Usamos BREAK ou RETURN.
- Replace Conditional with Polymorphism (Substituindo o operador condicional por polimorfismo) – é executado quando existe um operador condicional cujo comportamento depende do tipo de objeto. É necessário mover cada ramo do operador condicional para um método sobrecarregado da subclasse. Torne o código-fonte abstrato.