Mindmap
Engenharia de Software Cap. 9: Refatoring

Inhalt der Mindmap
Engenharia de Software Cap. 9: Refatoring
Manutenção corretiva
- Quando um bug é detectado
Manutenção evolutiva
- Quando os usuários ou o dono do produto solicitam uma nova funcionalidade
Manutenção adaptativa
- Quando uma regra de negócio ou alguma tecnologia usada pelo sistema muda
Leis de Lehman
- Um sistema de software deve ser continuamente mantido para se adaptar ao seu ambiente.
- Manutenções tornam o código e a estrutura interna de um sistema mais complexos e difíceis de manter no futuro, a não ser que um trabalho seja realizado para estabilizar ou evitar tal fenômeno.
- Refactoring
- São transformações de código que melhoram a manutenibilidade de um sistema, mas sem afetar o seu funcionamento.
- Extração de método
- É a extração de uma linha de código que é levado de um método A para outro B
- Pode ser usada para diminuir a duplicação de código
- Existem 11 motivações distintas porém, a principal motivação é extrair um código para permitir o seu reúso
- Inline de Método
- Diferente da extração, ela irá retirar métodos que possuem reuso e incremento de legibilidade do código com baixo impacto
- Movimentação de Método
- Garante que métodos estejam em classes apropriadas, movendo assim, um método 'a' para uma classe B
- Pull Up Method.
- Ocorre em uma mesma hierarquia de classes, exemplos: move um método de subclasses para uma superclasse
- Push Down Method
- Quando um método é movido para baixo na hierarquia de classes (superclasse para uma subclasse)
- Extração de Classes
- É utilizado quando um sistema possui uma classe A com muitas responsabilidades e atributos
- Renomeação
- Existem apenas duas coisas difíceis em Ciência da Computação: invalidação de cache e dar nomes às coisas.
- Pode ser usado quando o nome de um elemento não tiver sido uma boa escolha, ou até memo pelo nome estar desatualizado
- Depreciação
- Mecanismo oferecido por linguagens de programação para indicar que um elemento de código está desatualizado
- Extração de Variáveis
- Remoção de Flags
- Substituição de Condicional por Polimorfismo
- Remoção de Código Morto
- Refactoring
Prática de Refactoring
- A realização bem sucedida de refactorings depende da existência de bons testes
- Refactorings oportunistas
- São realizados no meio de uma tarefa de programação, quando se descobre que um trecho de código não está bem implementado e que, sendo possível melhorar o mesmo
- Se for descoberto um trecho de código com problemas de implementação, deve ser aplicado a refatoração.
- Refatorando o código dessa forma, a mudança será implementada de maneira menos complexa
- Refactorings planejados
- São mudanças mais profundas, demoradas e complexas, que não valem a pena encaixar no meio de uma outra tarefa de desenvolvimento.
- Deve ser realizados em sessões planejadas e dedicadas
- São episódios raros de se acontecer
Refactorings Automatizados
- IDEs fornecem suporte para automatizar as refactorings
- É feito da seguinte forma: o usuário seleciona o trecho de código que pretende refatorar e a operação de refactoring que deseja realizar
- É escolhido então, as opções de refactor e rename e em seguida o refactoring é automático
- Verificação de Pré-condições de Refactorings
- A IDE verifica as pré condições para o reactoring se ele não vai causar um erro de compilação ou mudar o comportamento do sistema
Code Smells (bad smells)
- São códigos difíceis de manter, entender, modificar ou testar e que talvez seja refatorados
- Código Duplicado
- Aumenta o esforço de manutenção, torna a base de código complexa e tem o maior potencial para prejudicar a evolução do sistema
- Para evitar pode-se usar:
- Extração de Método
- Extração de Classe
- Pull Up Method
- Quando o código duplicado é um método presente em duas ou mais subclasses
- Clones
- Trechos de código que possuem código idêntico
- Tipo 1
- A e B têm o mesmo código
- Tipo 2
- A e B são clones do Tipo 1, porém as variáveis usadas em A e B podem ter nomes diferentes.
- Tipo 3
- A e B são clones do Tipo 2, porém com pequenas mudanças em comandos.
- Tipo 4
- A e B são semanticamente equivalentes, mas suas implementações são baseadas em algoritmos diferentes.
- Métodos Longos
- Tornam o código mais difícil de entender pois métodos devem conter poucas linhas de código
- Não é possível classificar um método longo, dependerá da linguagem de programação, da relevância do método, do domínio do sistema, etc.
- Classes Grandes (Large Class)
- Classes não devem assumir muitas responsabilidades e prover serviços que não são coesos
- Solução: Extração de Classe para extrair uma classe menor A' a partir de uma classe grande A. Em seguida, a classe A passa a ter um atributo do tipo para A'.
- Feature Envy
- Ele acessa mais atributos e métodos de uma classe B do que de sua atual classe A.
- Solução: deve-se analisar a possibilidade de usar Movimentação de Método para migrá-lo para a classe invejada
- Métodos com Muitos Parâmetros
- Além de pequenos, métodos, na medida do possível, devem ter poucos parâmetros
- Soluções:
- Primeiro, deve-se verificar se um dos parâmetros pode ser obtido diretamente pelo método chamado
- pode-se criar um tipo que agrupe alguns dos parâmetros de um método.
- Variáveis Globais
- variáveis globais dificultam o entendimento de um módulo de forma independente dos demais módulos de um sistema
- Obsessão por Tipos Primitivos
- Ocorre quando tipos primitivos (int, float, String, etc.) são usados no lugar de classes.
- Objetos Mutáveis
- É aquele cujo estado pode ser modificado
- Depois de criado não pode ser alterado
- Não é necessário sincronizar o acesso a threads aos métodos
- Classes de Dados
- São classes que possuem possuem apenas atributos e nenhum método
- O importante é criar métodos nessas classes, para realizar operações que já estão sendo realizadas, mas de forma espalhada em outras classes.
Bilder und Dateien der Mindmap
Informationen
- Beschreibung
- Mindmap am Engenharia de Software Cap. 9: Refatoring, erstellt von Edicleiton Alves am 13/08/2021.
- Erstellt von
- Edicleiton Alves
- Aufrufe
- 0
- Bewertung
