Slide 1

Slide 1 text

Minha aplicação virou um monstrinho e agora? Kamila Santos CONHEÇA AS TÉCNICAS DE REFATORAÇÃO MAIS COMUNS E QUAIS PROBLEMAS ELAS RESOLVEM

Slide 2

Slide 2 text

Kamila santos BACKEND DEVELOPER SPECIALIST @ZUPINNOVATION MICROSOFT MVP BOOK CO-AUTHOR, INSTRUCTOR CONTENT CREATOR @KAMILA_CODE CO-ORGANIZER @WOMAKERSCODE, @PERIFACODE AND @DEVSJAVAGIRL INSTRUCTOR @LINUXTIPS

Slide 3

Slide 3 text

Agenda como assim um monstrinho ? princípios da refatoração quando devemos refatorar ? code smells técnicas de refatoração

Slide 4

Slide 4 text

Como assim um monstrinho ?

Slide 5

Slide 5 text

O que é refatoração ? Podemos definir refatoração como uma modificação feita na estrutura interna de um software para deixá-lo mais simples de compreender e menos custoso para alterar, sem que seu comportamento seja modificado.

Slide 6

Slide 6 text

Porque devemos refatorar ? Refatoração melhora o design do software Refatoração deixa o software mais simples de entender Refatoração ajuda na localização de bugs Refatoração nos ajuda a desenvolver mais rapidamente

Slide 7

Slide 7 text

Refatoração preparatória

Slide 8

Slide 8 text

Refatoração para compreensão

Slide 9

Slide 9 text

Refatoração para coleta de lixo

Slide 10

Slide 10 text

Refatoração de longa duração

Slide 11

Slide 11 text

Refatoração no Code rewiew

Slide 12

Slide 12 text

Quais são as desvantagens de refatorar ? Maior tempo para entregar features Aumenta a chance de grandes conflitos de merge Grande parte dos testes precisam ser reescritos

Slide 13

Slide 13 text

Code smells são indicações de problemas ou deficiências no código- fonte de um programa de computador. Esses cheiros podem ser sinais de más práticas de programação, design inadequado ou possíveis bugs.

Slide 14

Slide 14 text

Code smells Quando identificados, os code smells podem ser considerados como um convite para investigar mais a fundo o código e fazer melhorias.

Slide 15

Slide 15 text

Duplicação de código

Slide 16

Slide 16 text

Métodos muito longos

Slide 17

Slide 17 text

Classe com muitas responsabilidades

Slide 18

Slide 18 text

Nomes de variáveis confusos e genéricos

Slide 19

Slide 19 text

Comentários irrelevantes ou desatualizados

Slide 20

Slide 20 text

Técnicas de refatoração

Slide 21

Slide 21 text

Extrair função é usada quando um trecho de código em um método ou função pode ser agrupado em uma função separada. Isso é feito para melhorar a legibilidade, reutilização e manutenção do código.

Slide 22

Slide 22 text

Extract Function Essa função encapsula a lógica contida no trecho de código original e pode ser chamada em outros lugares, evitando a duplicação de código.

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

Extrair variável é usada quando você tem uma expressão complexa em um trecho de código que pode ser extraída para uma variável com um nome descritivo. Essa técnica ajuda a melhorar a legibilidade, compreensão e manutenção do código.

Slide 26

Slide 26 text

Extract Variable você identifica uma expressão que seja difícil de entender ou que seja usada várias vezes no código. Em seguida, você a extrai para uma variável separada e atribui um nome significativo a essa variável.

Slide 27

Slide 27 text

Extract Variable

Slide 28

Slide 28 text

Extract Variable

Slide 29

Slide 29 text

Encapsulate Variable é usada para promover o encapsulamento de uma variável, tornando-a privada e fornecendo métodos de acesso (getters e setters) para manipulá-la. Essa técnica ajuda a melhorar a encapsulação, controle e consistência do acesso aos dados.

Slide 30

Slide 30 text

Encapsulate Variable você identifica uma variável que está sendo acessada diretamente de fora da classe e a torna privada. Em seguida, você cria métodos de acesso (getters) e possivelmente métodos de modificação (setters) para interagir com essa variável.

Slide 31

Slide 31 text

No content

Slide 32

Slide 32 text

Introduce Parameter Object é usada quando um conjunto de parâmetros relacionados está sendo passado repetidamente para um método ou função. Essa técnica envolve a criação de um novo objeto que encapsula esses parâmetros relacionados, simplificando a chamada do método e melhorando a legibilidade do código.

Slide 33

Slide 33 text

Introduce Parameter Object você identifica um conjunto de parâmetros que são frequentemente passados juntos e os agrupa em um objeto. Esse novo objeto é então passado como um único parâmetro para o método ou função relevante.

Slide 34

Slide 34 text

No content

Slide 35

Slide 35 text

Split Phase é usada quando um método ou função executa duas ou mais fases distintas ou diferentes tipos de tarefas. Essa técnica envolve a separação dessas fases em métodos ou funções separados, para melhorar a legibilidade, modularidade e facilidade de manutenção do código.

Slide 36

Slide 36 text

Split Phase você identifica as diferentes fases ou tipos de tarefas que estão sendo executadas em um único método ou função. Em seguida, você extrai cada fase para um método ou função separados, permitindo que cada um seja mais focado e específico em sua responsabilidade.

Slide 37

Slide 37 text

No content

Slide 38

Slide 38 text

Extract class é usada quando uma classe contém responsabilidades ou funcionalidades que podem ser melhor organizadas em uma nova classe separada. Essa técnica envolve a criação de uma nova classe e a transferência de atributos e métodos relacionados para essa nova classe.

Slide 39

Slide 39 text

Extract class você identifica um conjunto de atributos e métodos dentro de uma classe existente que estão relacionados a uma responsabilidade ou funcionalidade específica. Em seguida, você extrai esses atributos e métodos para uma nova classe, tornando-os mais coesos e facilitando a manutenção do código.

Slide 40

Slide 40 text

Remove Middle Man é usada quando uma classe atua como um intermediário desnecessário entre outras classes. Essa técnica envolve a eliminação do intermediário, permitindo que as chamadas de método sejam feitas diretamente entre as classes relevantes.

Slide 41

Slide 41 text

Remove Middle Man você identifica uma classe que está atuando como um intermediário, simplesmente repassando chamadas de método para outra classe sem adicionar qualquer valor ou lógica significativa. Em seguida, você direciona as chamadas de método diretamente para a classe que estava sendo intermediada.

Slide 42

Slide 42 text

No content

Slide 43

Slide 43 text

Hide delegate é usada quando uma classe está fornecendo acesso direto a um objeto delegado e esse acesso direto está sendo utilizado em excesso ou violando o princípio de encapsulamento. Essa técnica envolve ocultar o objeto delegado por trás de métodos da classe que o encapsulam, limitando o acesso direto ao delegado.

Slide 44

Slide 44 text

Hide delegate você identifica os pontos em que a classe está expondo o objeto delegado e fornecendo acesso direto a ele. Em seguida, você oculta o delegado por trás de métodos da classe que agem como intermediários, permitindo que a classe controle como o delegado é acessado e evitando o acesso direto descontrolado.

Slide 45

Slide 45 text

Move function é usada quando uma função ou método está localizado em uma classe que não é a mais apropriada para abrigá-lo. Essa técnica envolve mover a função para outra classe que possui uma responsabilidade mais adequada ou onde a função possa ser mais facilmente reutilizada.

Slide 46

Slide 46 text

Move function você identifica uma função ou método que está em uma classe onde não se encaixa bem em termos de responsabilidade ou coesão. Em seguida, você move essa função para uma classe mais apropriada, garantindo que a funcionalidade seja colocada no contexto correto.

Slide 47

Slide 47 text

Move function

Slide 48

Slide 48 text

Move function

Slide 49

Slide 49 text

Remove Dead Code é usada quando há trechos de código que não são mais utilizados e não têm impacto no funcionamento do programa. Essa técnica envolve a remoção desses trechos de código desnecessários, simplificando e tornando o código mais limpo e legível.

Slide 50

Slide 50 text

Remove Dead Code você identifica partes do código que não são mais acessadas ou executadas devido a alterações em requisitos, lógica ou fluxo de execução. Essas partes podem incluir variáveis não utilizadas, métodos ou funções não chamados, blocos condicionais que nunca são verdadeiros ou falsos, entre outros.

Slide 51

Slide 51 text

Change Value to Reference é usada quando você tem um objeto que é usado como um valor, mas você percebe que é necessário tratá-lo como um objeto com identidade própria. Essa técnica envolve substituir a representação de valor por uma representação de referência, permitindo que múltiplos objetos se refiram à mesma instância.

Slide 52

Slide 52 text

Change Value to Reference você identifica um objeto que deve ser tratado como uma entidade única e não como um valor. Em seguida, você cria uma nova classe para representar esse objeto, onde a igualdade é baseada na identidade em vez do conteúdo do objeto. Em seguida, substitui as ocorrências do objeto valor por referências à nova classe.

Slide 53

Slide 53 text

No content

Slide 54

Slide 54 text

No content

Slide 55

Slide 55 text

Decompose Conditional é usada quando você tem uma condição complexa com várias ramificações e a lógica se torna difícil de entender e manter. Essa técnica envolve decompor a condição em partes menores e mais claras, facilitando a compreensão e a manutenção do código.

Slide 56

Slide 56 text

Decompose Conditional você identifica uma condição complexa com várias cláusulas e extrai cada cláusula em um método ou função separada, com um nome descritivo. Em seguida, você substitui a condição original pela chamada desses métodos ou funções, tornando a lógica mais expressiva e legível.

Slide 57

Slide 57 text

Introduce Assertions usada para adicionar verificações assertivas no código, a fim de detectar e capturar erros ou estados inválidos durante o desenvolvimento e depuração. Essa técnica envolve a inserção de afirmações (assertions) para validar condições que devem ser verdadeiras em determinados pontos do código.

Slide 58

Slide 58 text

Introduce Assertions você identifica um ponto no código onde é necessário garantir uma condição específica. Em seguida, você adiciona uma asserção que verifica essa condição e, se a condição não for verdadeira, um erro ou exceção é lançado.

Slide 59

Slide 59 text

Replace Constructor with Factory Method é usada quando você tem uma classe com um ou mais construtores que podem ser substituídos por uma função de fábrica. Essa técnica envolve a criação de uma função estática que encapsula a criação do objeto, fornecendo uma interface mais expressiva e flexível para criar instâncias da classe.

Slide 60

Slide 60 text

Replace Constructor with Factory Method você identifica um ou mais construtores em uma classe que podem ser substituídos por uma função de fábrica. Em seguida, você cria uma função estática na classe que encapsula a lógica de criação do objeto, fornecendo uma forma mais descritiva ou personalizada de criar instâncias.

Slide 61

Slide 61 text

No content

Slide 62

Slide 62 text

No content

Slide 63

Slide 63 text

Pull up method é usada quando você tem métodos semelhantes em subclasses e deseja movê-los para a classe pai, a fim de evitar duplicação de código e promover a reutilização. Essa técnica envolve mover um método de uma ou mais subclasses para a classe pai, tornando-o um método comum que pode ser compartilhado por todas as subclasses.

Slide 64

Slide 64 text

Pull up method você identifica um método em uma ou mais subclasses que tem uma implementação semelhante e pode ser movido para a classe pai. Em seguida, você move esse método para a classe pai e ajusta as chamadas correspondentes nas subclasses para chamar o método na classe pai.

Slide 65

Slide 65 text

No content

Slide 66

Slide 66 text

No content

Slide 67

Slide 67 text

Extract Subclass é usada quando você tem uma classe que está realizando funcionalidades que são específicas de um subconjunto de objetos dessa classe. Essa técnica envolve a criação de uma nova subclasse que representa esse subconjunto específico de objetos e move as funcionalidades relevantes para essa nova subclasse.

Slide 68

Slide 68 text

Extract Subclass você identifica um grupo de objetos dentro de uma classe existente que possui comportamentos e características distintas dos demais objetos. Em seguida, você cria uma nova subclasse que representa esse grupo específico de objetos e move os métodos e atributos relevantes para essa subclasse. A subclasse herda da classe original e, assim, compartilha o comportamento comum com os outros objetos da classe pai.

Slide 69

Slide 69 text

Collapse Hierarchy é usada quando você tem uma hierarquia de classes onde a diferenciação entre as subclasses se torna desnecessária ou irrelevante. Essa técnica envolve a remoção de uma ou mais subclasses intermediárias, movendo seus atributos e comportamentos diretamente para a classe pai.

Slide 70

Slide 70 text

Collapse Hierarchy você identifica que a diferenciação entre as subclasses não é mais necessária ou relevante. Em seguida, você remove as subclasses intermediárias e move seus atributos e comportamentos diretamente para a classe pai. Isso simplifica a hierarquia, reduz a complexidade e melhora a legibilidade do código.

Slide 71

Slide 71 text

No content

Slide 72

Slide 72 text

No content

Slide 73

Slide 73 text

Conclusion Cada técnica de refatoração visa resolver um problema específico e muitas vezes elas devem ser aplicadas em conjunto.

Slide 74

Slide 74 text

Obrigada :)