1) O documento discute o conceito de refactoring e como ele pode melhorar a manutenção de software removendo complexidade e deterioração do código.
2) Refactoring envolve transformações no código que melhoram a manutenibilidade sem alterar o funcionamento externo do sistema. Isso inclui extração de métodos, movimentação de métodos e extração de classes.
3) Code smells como código duplicado e variáveis globais são bons indicadores de código que pode ser melhorado com refactoring.
TRABALHO INSTALACAO ELETRICA EM EDIFICIO FINAL.docx
ESP204 - Cap. 9 - Refactoring.pdf
1. 1
Engenharia de Software e Sistemas
Cap. 9 - Refactoring
Prof. Dr. Thiago Mendes e Prof. Dr. Cleber Lira
thiagosouto@ifba.edu.br, cleberlira@ifba.edu.br
1
Licença CC-BY; créditos para Marco Tulio Valente. Engenharia de Software Moderna: Princípios e Práticas para Desenvolvimento de Software com
Produtividade, 2020 https://engsoftmoderna.info, @engsoftmoderna.
3. Manutenção de Software
● Preventiva: bugs "latentes"
● Corretiva: bugs reportados por usuários
● Adaptativa: customizações, novas versões de LP/SO
● Evolutiva: novas funcionalidades
● Refactoring: melhorias no código ou design
3
5. Leis de Lehman
● Leis empíricas sobre evolução de software
● Propostas por Meir Lehman, nas décadas 70-80
5
6. Resumo das Leis de Lehman
● 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
6
Modernamente, este trabalho ganhou
o nome de refactoring
7. Refactoring
● Transformações de código que melhoram a
manutenibilidade de um sistema mas sem afetar o seu
funcionamento externo
7
32. Refactorings dependem de testes
Desenvolvedores evitam refatorações em sistemas
sem testes. Em vez disso, eles reduzem as modificações
àquelas necessárias para implementar novas
funcionalidades ou corrigir bugs. Assim, a complexidade
vai se acumulando e erros de projeto não são corrigidos
-- John Ousterhout
32
34. Refactorings Oportunistas
● Realizados no meio de uma outra tarefa de programação
● Tipo de refactoring mais comum
● Para cada mudança que tiver que realizar em um
sistema, primeiro torne-a fácil (aviso: isso pode ser difícil),
então realize a mudança facilmente -- Kent Beck
34
39. 39
Danilo Silva, Nikolaos Tsantalis, Marco Tulio Valente. Why We Refactor?
Confessions of GitHub Contributors. FSE 2016.
Observação: O único rename
analisado foi de pacote
53. 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
53
56. Variáveis Globais
● Acoplamento ruim
● Dificulta o entendimento de um método
56
Para entender o que f retorna, precisamos conhecer o valor de g
Esse valor pode variar entre chamadas de f, etc
58. Obsessão por Tipos Primitivos
● CEP, Moeda, Data, Hora, Cor, Email, etc não devem ser
de tipos primitivos
● Mas sim de um tipo próprio, com alguns métodos
● Por exemplo, métodos para validação de valores
58
62. Por que objetos imutáveis são "bons"?
● Dão "segurança" a quem criou o objeto
● Pode-se passar o objeto para outros métodos e ter
certeza de que eles não vão alterar o seu estado
62
63. Como interpretar esse code smell
● Sempre que possível, implemente objetos imutáveis
● Principalmente, objetos mais simples (CEP, Data, Hora, etc)
● Mas, por outro lado, em linguagens imperativas é natural
ter um bom número de objetos mutáveis.
63
68. Comentários "Ruído" (nada acrescentam …)
68
// this function sends an email
void sendEmail() {
...
}
// this class holds data for an employee
public class Employee {
...
}
69. Mais um exemplo de comentários "ruído"
69
Comentários apenas repetem o
que já está bem claro no código
Fonte: A Philosophy of Software Design (capítulo 13)
71. Quando é útil comentar?
● Código complexo por natureza
71
// format matched kk:mm:ss EEE, MMM dd, yyy
Pattern timePattern = Pattern.compile("d*:d*:d* w*, w*, d*, d*");
72. Quando é útil comentar?
72
● Documentação de APIs
/**
* Registers the text to display in a tool tip. The text
* displays when the cursor lingers over the component.
*
* @param text the string to display. If the text is null,
* the tool tip is turned off for this component.
*/
public void setToolTipText(String text) {
74. Débito Técnico
● Metáfora para explicar a importância de boas práticas e
princípios de Engenharia de Software
● Proposto por Ward Cunningham (1992)
● Soluções não-ótimas de design que dificultam a
manutenção e evolução de um sistema
74