Aula 7 - Boas práticas de Programação - Refatoração.pptx
robertarampani
18 views
74 slides
Sep 18, 2025
Slide 1 of 74
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
About This Presentation
Aula de Boas Práticas - Refatoração
Size: 5.08 MB
Language: pt
Added: Sep 18, 2025
Slides: 74 pages
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 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 ; ... } }