Aula 7 - Boas práticas de Programação - Refatoração.pptx

robertarampani 18 views 74 slides Sep 18, 2025
Slide 1
Slide 1 of 74
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44
Slide 45
45
Slide 46
46
Slide 47
47
Slide 48
48
Slide 49
49
Slide 50
50
Slide 51
51
Slide 52
52
Slide 53
53
Slide 54
54
Slide 55
55
Slide 56
56
Slide 57
57
Slide 58
58
Slide 59
59
Slide 60
60
Slide 61
61
Slide 62
62
Slide 63
63
Slide 64
64
Slide 65
65
Slide 66
66
Slide 67
67
Slide 68
68
Slide 69
69
Slide 70
70
Slide 71
71
Slide 72
72
Slide 73
73
Slide 74
74

About This Presentation

Aula de Boas Práticas - Refatoração


Slide Content

Boas Práticas de Programação - Refatoração Conteúdo enriquecido com material gentilmente cedido pelo Prof. Marco Tulio Valente

Agenda Leis de Lehman; Refatoração; Definição; Catálogo de refatorações. Refatoração automatizada; Code (bad) smells; Débito técnico. 2

Leis de Lehman Leis empíricas sobre evolução de software; Propostas por Meir Lehman, IBM. O crescimento e a evolução de vários sistemas de grande porte foram examinados Objetivo : Definir uma teoria unificada para evolução de software; Resultados : Um conjunto de oito leis que “governam” a evolução de sistemas. 3

1 - Mudança Contínua Sistemas devem ser continuamente adaptados ou eles se tornam progressivamente menos satisfatórios; O ambiente muda, novos requisitos surgem e o sistema deve ser modificado; Após o sistema modificado ser reimplantado, ele muda o ambiente. 4

2 - Complexidade Crescente A medida que um sistema evolui, sua complexidade aumenta , a menos que seja realizado esforço para mantê-la ou diminuí-la; Manutenções preventivas são necessárias; 5

3 - Auto-Regulação A evolução de software é um processo auto-regulável ; Uma grande alteração inibe futuras grandes alterações; 6

4 - Estabilidade Organizacional Durante o ciclo de vida de um programa, sua taxa de desenvolvimento é quase constante; Independe de recursos dedicados ao desenvolvimento do sistema; Alocação de grandes equipes é improdutivo, pois o overhead de comunicação predomina. 7

5 - Conservação de Familiaridade A taxa de evolução de um software está intimamente ligado ao grau de familiaridade dentre os profissionais que o mantém; Um grande incremento em uma release leva a muitos defeitos novos ; A release posterior será dedicada quase exclusivamente para corrigir os defeitos. 8

6 - Crescimento Contínuo O conteúdo funcional de sistemas devem ser continuamente aumentado para manter a satisfação do usuário; A cada dia, o usuário fica mais descontente com o sistema; Novas funcionalidades são necessárias para manter a satisfação do usuário. 9

7 - Qualidade Declinante A qualidade de sistemas parecerá estar declinando a menos que eles sejam mantidos e adaptados às modificações do ambiente; 10

8 - Sistemas de Feedback Os processos de evolução incorporam sistemas de feedbacks ; Estes feedbacks devem ser considerados para conseguir melhorias significativas do produto. 11

Resumindo… Sistemas devem ser sempre mantidos para serem úteis; Mas manutenções aumentam a complexidade e deterioram a qualidade do código; A não ser que um trabalho seja realizado para evitar isso. 12

Resumindo… Sistemas devem ser sempre mantidos para serem úteis; Mas manutenções aumentam a complexidade e deterioram a qualidade do código; A não ser que um trabalho seja realizado para evitar isso. 13 Modernamente, este trabalho ganhou o nome de refatoração (refactoring) .

Refatoração Transformações de código que melhoram a manutenibilidade de um sistema mas sem afetar o seu funcionamento externo. 14

Refatoração Transformações de código que melhoram a manutenibilidade de um sistema mas sem afetar o seu funcionamento externo. 15 Dividir uma função em duas, renomear variável, mover função, extrair classe, etc.

Refatoração Transformações de código que melhoram a manutenibilidade de um sistema mas sem afetar o seu funcionamento externo. 16 Melhorar modularidade, projeto/arquitetura, testabilidade, código mais legível, etc.

Refatoração Transformações de código que melhoram a manutenibilidade de um sistema mas sem afetar o seu funcionamento externo . 17 Refatorações devem entregar o sistema funcionando exatamente como antes das transformações.

Refatoração 18

Refatoração 19 2018 2000 1999

Catálogo de Refatorações Extrações de métodos; Inline de métodos; Movimentação de métodos; Pull up method; Push down method. Extração de Classes; Renomeação. 20

Catálogo de Refatorações Extrações de métodos; Inline de métodos; Movimentação de métodos; Pull up method; Push down method. Extração de Classes; Renomeação. 21

Extração de Métodos Objetivo: extrair um trecho de código de um método f ( ) e levá-lo para um novo método g ( ) 22 Funcionalidade “B” é utilizada em diversos métodos diferentes = duplicação de código .

Extração de Métodos 23

Extração de Métodos 24 Antes

Extração de Métodos 25 Depois

Extração de Métodos 26 Danilo Silva, Nikolaos Tsantalis, Marco Tulio Valente. Why We Refactor? Confessions of GitHub Contributors. FSE 2016. https://dl.acm.org/doi/10.1145/2950290.2950305

Catálogo de Refatorações Extrações de métodos; Inline de métodos; Movimentação de métodos; Pull up method; Push down method. Extração de Classes; Renomeação. 27

Inline de métodos O contrário de extração; Para métodos muito pequenos que sejam chamados poucas vezes . Operação mais rara e menos importante do que a extração. 28

Inline de métodos 29 Antes

Inline de métodos 30 Antes Depois

Catálogo de Refatorações Extrações de métodos; Inline de métodos; Movimentação de métodos; Pull up method; Push down method. Extração de Classes; Renomeação. 31

Manutenção de métodos Não é raro encontrar um método implementado na classe errada; Apesar de implementado em uma classe A. um método f ( ) pode usar mais serviços de uma classe B. Deve-se, então, avaliar a possibilidade de mover f ( ) para a classe B. 32

Manutenção de métodos 33 Antes

Manutenção de métodos 34 Depois

Manutenção de métodos Quando isso ocorre em uma mesma hierarquia de classes, ganha nomes especiais. Pull up method -> mover um método de subclasses para uma superclasse; Push down method -> mover um método de uma superclasse para uma subclasse. 35

Pull up method 36

Push down method 37

Catálogo de Refatorações Extrações de métodos; Inline de métodos; Movimentação de métodos; Pull up method; Push down method. Extração de Classes; Renomeação. 38

Extração de Classes Recomendado quando um sistema possui uma classe A com muitas responsabilidades e atributos . Alguns desses atributos são relacionados e poderiam ter vida própria . Logo, podem ser extraídos para uma nova classe B. 39

Extração de Classes 40

Extração de Classes 41

Catálogo de Refatorações Extrações de métodos; Inline de métodos; Movimentação de métodos; Pull up method; Push down method. Extração de Classes; Renomeação. 42

Renomeação Renomear método, parâmetro, atributo, classe, etc. Nome dado ao elemento não foi uma boa escolha ; Responsabilidade do elemento mudou e o nome ficou desatualizado . 43

Renomeação Parte complexa não é renomear o elemento; Mas sim, atualizar os pontos de código em que ele é referenciado. 44

Renomeação Por exemplo, se um método f ( ) é renomeado para g ( ) , todas as chamadas de f ( ) devem ser atualizadas. Se f ( ) for muito usado, pode ser interessante extraí-lo para um novo método, com o novo nome, e manter o nome antigo, mas depreciado . 45

Renomeação 46

Renomeação Depreciação Mecanismo oferecidos por linguagens de programação para indicar um elemento de código desatualizado; Emite um warning e permite que a renomeação ocorra a baby steps ; 47

Refatoração automatizada 48

Refatoração automatizada 49

Refatoração automatizada 50 Danilo Silva, Nikolaos Tsantalis, Marco Tulio Valente. Why We Refactor? Confessions of GitHub Contributors. FSE 2016. https://dl.acm.org/doi/10.1145/2950290.2950305 Observação: O único rename analisado foi de pacote

Refatoração automatizada 51 Danilo Silva, Nikolaos Tsantalis, Marco Tulio Valente. Why We Refactor? Confessions of GitHub Contributors. FSE 2016. https://dl.acm.org/doi/10.1145/2950290.2950305

Code (ou Bad) Smells Indicadores de código de baixa qualidade; Difícil de manter, entender, modificar ou testar; Portanto, candidato a refatoração . 52

Code (ou Bad) Smells Exemplos Código duplicado; Feature Envy; Variáveis globais; Obsessão por tipos primitivos; 53

Code (ou Bad) Smells 54 Aiko Yamashita, Leon Moonen. Do developers care about code smells? An exploratory survey. WCRE 2013. https://ieeexplore.ieee.org/document/6671299

Código duplicado = clones 55 Código Original

Clone Tipo 1: Comentários e espaços 56 Código Original

Clone Tipo 2: Nomes diferentes 57 Código Original

Clone Tipo 3: Mudanças simples de comandos 58 Código Original

Clone Tipo 4: Algoritmo equivalente 59 Código Original

Feature Envy Método que “inveja” dados e métodos de outra classe; Usa mais métodos e dados dessa outra classe; Logo, é um candidato a ser movido para ela. 60

Feature Envy 61

Variáveis globais Acoplamento ruim; Dificulta o entendimento de um método; 62 Para entender o que f retorna, precisamos conhecer o valor de g

Obsessão por tipos primitivos CEP, data, hora, email, etc, não devem ser de tipos primitivos; Mas assim de um tipo próprio, com alguns métodos de validação de dados, por exemplo. Devemos analisar a possibilidade de criar classes que encapsulam valores e ofereçam operações para manipulá-los. 63

Antes de terminar… Débito Técnico Metáfora para explicar a importância de boas práticas e princípios de Engenharia de Software; Soluções não-ótimas de design que dificultam a manutenção e evolução de um sistema 64

Antes de terminar… Débito Técnico 65

Antes de terminar… Débito Técnico 66 Projeto no qual TD não foi pago Projeto no qual TD foi sendo pago Speed = velocidade de implementação de novas funcionalidades

Antes de terminar… Débito Técnico Ausência de testes; Problemas arquiteturais; Alto acoplamento; Code smells; Ausência completa de documentação; Código que não segue layout pré-definido. 67

Dúvidas? 68

Exercícios de fixação Marque V ou F: ( ) As Leis de Lehman são leis empíricas sobre manutenção e evolução de software. Uma delas afirma que manutenções tornam a estrutura interna de um sistema mais complexa e difícil de manter no futuro. ( ) Extração de métodos é um dos refactorings mais poderosos e com maior número de motivações. ( ) Inline de métodos é uma operação mais frequente do que sua operação oposta (extração de métodos). ( ) Pull Up Method e Push Down Method são casos particulares de movimentação de métodos, que ocorrem ao longo de uma hierarquia de herança. ( ) São exemplos de refactorings: extração de métodos, inline de métodos e melhoria do desempenho de um método. ( ) Débito técnico designa o possível déficit de conhecimento técnica de alguns membros de um time de desenvolvimento. 69

Exercícios de fixação Marque V ou F: ( V ) As Leis de Lehman são leis empíricas sobre manutenção e evolução de software. Uma delas afirma que manutenções tornam a estrutura interna de um sistema mais complexa e difícil de manter no futuro. ( V ) Extração de métodos é um dos refactorings mais poderosos e com maior número de motivações. ( F ) Inline de métodos é uma operação mais frequente do que sua operação oposta (extração de métodos). ( V ) Pull Up Method e Push Down Method são casos particulares de movimentação de métodos, que ocorrem ao longo de uma hierarquia de herança. ( F ) São exemplos de refactorings: extração de métodos, inline de métodos e melhoria do desempenho de um método . ( F ) Débito técnico designa o possível déficit de conhecimento técnico de alguns membros de um time de desenvolvimento. 70

Extraia o método g ( ) para a(s) linha(s) comentada(s) class A { void f() { int x = 10 ; x ++ ; print x; // extrair } } 71

Extraia o método g ( ) para a(s) linha(s) comentada(s) class A { void f() { int x = 10 ; x ++ ; print x; // extrair } } 72 class A { void g( int x) { print x; } void f() { int x = 10 ; x ++ ; g(x); } }

Extraia o método g ( ) para a(s) linha(s) comentada(s) class A { void f() { int x = 10 ; x ++ ; // extrair print x; // extrair int y = x + 1 ; ... } } 73

Extraia o método g ( ) para a(s) linha(s) comentada(s) class A { void f() { int x = 10 ; x ++ ; // extrair print x; // extrair int y = x + 1 ; ... } } 74 class A { int g( int x) { x ++ ; print x; return x; } void f() { int x = 10 ; x = g(x); int y = x + 1 ; ... } }
Tags