Padrões de Refatoração Universidade Federal do Ceará - 2014.2 
Engenharia de Software - Projeto Detalhado de Software
“Uma alteração feita na estrutura interna do 
software para torná-lo mais fácil de ser 
entendido e menos custoso de ser modificado 
sem alterar seu comportamento observável” 
– Martin Fowler 
“Transformação que preserva comportamento” 
– Joshua Kerievsky
Por que devo refatorar? 
• Refatorar melhora o projeto de 
software 
• Refatorar torna o software mais 
fácil de entender 
• Refatorar ajuda a encontrar falhas 
• Refatorar ajuda a programar mais 
rapidamente
Quando devemos refatorar? 
• Quando for necessário acrescentar funções. 
• Quando for preciso consertar uma falha. 
• Enquanto revisamos o código.
Quando não devemos refatorar? 
• Quando o código não funciona. 
• Quando o código está muito confuso. 
• Quando estiver próximo do prazo final de entrega.
Problemas com a 
refatoração 
• Interfaces 
• Banco de Dados
Padrões de Refatoração
Extrair Método (Extract Method) 
void 
imprimirDivida(double 
quantia){ 
imprimirCabeçalho(); 
// 
imprime 
os 
detalhes 
System.out.println("nome:" 
+ 
_nome); 
System.out.println("quantia:" 
+ 
_quantia); 
} 
void 
imprimirDivida(double 
quantia){ 
imprimirCabeçalho(); 
imprimirDetalhes(quantia); 
} 
private 
void 
imprimirDetalhes(double 
quantia){ 
// 
imprime 
os 
detalhes 
System.out.println("nome:" 
+ 
_nome); 
System.out.println("quantia:" 
+ 
_quantia); 
}
Extrair Classe (Extract Class) 
Pessoa 
nome 
codigoAreaEscritorio 
numeroEscritorio 
lerNumeroTelefone() 
Pessoa 
nome 
lerNumeroTelefone() 
telefone 
do escritório 
Número do Telefone 
codigoArea 
numero 
lerNumeroTelefone()
Extrair Subclasse (Extract Subclass) 
Item Serviço 
lerPreçoTotal() 
lerPreçoUnitario() 
lerEmpregado() 
Item Serviço 
lerPreçoTotal() 
lerPreçoUnitario() 
Item MaoDeObra 
lerPreçoUnitario() 
lerEmpregado()
Renomear Método (Rename Method) 
public 
String 
lerNumeroDoTelefone(){ 
return 
("(" 
+ 
_codigoDeAreaDoEScritorio 
+") 
" 
+ 
_numeroDoEscritorio); 
} 
class 
Pessoa{ 
[...] 
public 
String 
lerNumeroDoTelefone(){ 
return 
lerNumeroDoTelefoneDoEscritorio(); 
} 
public 
String 
lerNumeroDoTelefoneDoEscritorio(){ 
return 
("(" 
+ 
_codigoDeAreaDoEscritorio 
+ 
")" 
+ 
_numeroDoEscritorio); 
} 
}
Lista de Refatorações 
• Acrescentar Parâmetro 
• Auto-Encapsular Campo 
• Condensar Hierarquia 
• Consolidar Expressão 
Condicional 
• Consolidar Fragmentos 
Condicionais Duplicados 
• Converter Projeto Procedural em 
Objetos 
• Criar um Método Padrão 
• Decompor Condicional 
• Descer Campo na Hierarquia 
• Descer Método na Hierarquia 
• Desembaraçar Herança 
• Dividir Variável Temporária 
• Duplicar Dados Observados 
• Encapsular Campo 
• Encapsular Coleção 
• Encapsular Downcast 
• Extrair Classe 
• Extrair Hierarquia 
• Extrair Interface 
• Extrair Método 
• Extrair Subclasse 
• Extrair Superclasse 
• Internalizar Classe 
• Internalizar Método 
• Internalizar Variável Temporária 
• Introduzir Asserção 
• Introduzir Extensão Local 
• Introduzir Método Externo 
• Introduzir Objeto Nulo 
• Introduzir Objeto Parâmetro 
• Introduzir Variável Explicativa 
• Mover Campo 
• Mover Método 
• Mudar de Referência para Valor 
• Mudar de Valor para Referência 
• Ocultar Delegação 
• Ocultar Método 
• Parametrizar Método 
• Preservar o Objeto Inteiro 
• Remover Atribuições a 
Parâmetros 
• […]
Lista de Refatorações 
• Remover Flag de Controle 
• Remover Intermediário 
• Remover Método de Gravação 
• Remover Parâmetro 
• Renomear Método 
• Separar a Consulta do 
Modificador 
• Separar o Domínio da 
Apresentação 
• Subir Campo na Hierarquia 
• Subir Método na Hierarquia 
• Subir o Corpo do Construtor na 
Hierarquia 
• Substituir Atributo por Objeto 
• Substituir Código de Erro por 
Exceção 
• Substituir Comando 
Condicional por Polimorfismo 
• Substituir Condição Aninhada 
por Cláusulas Guarda 
• Substituir Delegação por 
Herança 
• Substituir Enumeração pelo 
padrão State/Strategy 
• Substituir Enumeração por 
Classe 
• Substituir Enumeração por 
Subclasses 
• Substituir Exceção por Teste 
• Substituir Herança por 
Delegação 
• Substituir Método por Objeto 
Método 
• Substituir Numeros Mágicos por 
Constantes Simbólicas 
• Substituir o Algoritmo 
• Substituir o Construtor por um 
Método Fabrica 
• Substituir Parâmetro por Método 
• Substituir Parâmetro por Métodos 
Explícitos 
• Substituir Registro por Classe de 
Dados 
• Substituir Subclasse por Campos 
• Substituir Variável Temporária por 
Consulta 
• Substituir Vetor por Objeto 
• Transformar Associação 
Bidirecional em Unidirecional 
• Transformar Associação 
Unidirecional em Bidirecional
Referências bibliográficas 
Referências: 
• FOWLER, Martin. Refatoração: 
aperfeiçoando o projeto de código 
existente. 
Porto Alegre, RS: Bookman, 2008. xiv, 
365 p. ISBN 8536303956 (broch.). 
• KERIEVSKY, Joshua. Refatoração para 
padrões. 
Porto Alegre, RS: Bookman, 2008. xviii, 
400 p. ISBN 9788577802449 (broch.). 
• Resumo desta apresentação: 
https://docs.google.com/document/d/ 
1TKS_jr5sArNNy8mp2pxITDmdKcWdI 
ncC2x_yt8ElXLs/edit?usp=sharing 
Professor: 
• Camilo Camilo Almendra 
camilo@es.ufc.br 
Alunos: 
• Gabriel Oliveira Mendanha 
gabrielmendanha@hotmail.com 
• Thiago Pereira Rosa 
thiagor@engineer.com

Padrões de refatoração

  • 1.
    Padrões de RefatoraçãoUniversidade Federal do Ceará - 2014.2 Engenharia de Software - Projeto Detalhado de Software
  • 2.
    “Uma alteração feitana estrutura interna do software para torná-lo mais fácil de ser entendido e menos custoso de ser modificado sem alterar seu comportamento observável” – Martin Fowler “Transformação que preserva comportamento” – Joshua Kerievsky
  • 3.
    Por que devorefatorar? • Refatorar melhora o projeto de software • Refatorar torna o software mais fácil de entender • Refatorar ajuda a encontrar falhas • Refatorar ajuda a programar mais rapidamente
  • 4.
    Quando devemos refatorar? • Quando for necessário acrescentar funções. • Quando for preciso consertar uma falha. • Enquanto revisamos o código.
  • 5.
    Quando não devemosrefatorar? • Quando o código não funciona. • Quando o código está muito confuso. • Quando estiver próximo do prazo final de entrega.
  • 6.
    Problemas com a refatoração • Interfaces • Banco de Dados
  • 7.
  • 8.
    Extrair Método (ExtractMethod) void imprimirDivida(double quantia){ imprimirCabeçalho(); // imprime os detalhes System.out.println("nome:" + _nome); System.out.println("quantia:" + _quantia); } void imprimirDivida(double quantia){ imprimirCabeçalho(); imprimirDetalhes(quantia); } private void imprimirDetalhes(double quantia){ // imprime os detalhes System.out.println("nome:" + _nome); System.out.println("quantia:" + _quantia); }
  • 9.
    Extrair Classe (ExtractClass) Pessoa nome codigoAreaEscritorio numeroEscritorio lerNumeroTelefone() Pessoa nome lerNumeroTelefone() telefone do escritório Número do Telefone codigoArea numero lerNumeroTelefone()
  • 10.
    Extrair Subclasse (ExtractSubclass) Item Serviço lerPreçoTotal() lerPreçoUnitario() lerEmpregado() Item Serviço lerPreçoTotal() lerPreçoUnitario() Item MaoDeObra lerPreçoUnitario() lerEmpregado()
  • 11.
    Renomear Método (RenameMethod) public String lerNumeroDoTelefone(){ return ("(" + _codigoDeAreaDoEScritorio +") " + _numeroDoEscritorio); } class Pessoa{ [...] public String lerNumeroDoTelefone(){ return lerNumeroDoTelefoneDoEscritorio(); } public String lerNumeroDoTelefoneDoEscritorio(){ return ("(" + _codigoDeAreaDoEscritorio + ")" + _numeroDoEscritorio); } }
  • 12.
    Lista de Refatorações • Acrescentar Parâmetro • Auto-Encapsular Campo • Condensar Hierarquia • Consolidar Expressão Condicional • Consolidar Fragmentos Condicionais Duplicados • Converter Projeto Procedural em Objetos • Criar um Método Padrão • Decompor Condicional • Descer Campo na Hierarquia • Descer Método na Hierarquia • Desembaraçar Herança • Dividir Variável Temporária • Duplicar Dados Observados • Encapsular Campo • Encapsular Coleção • Encapsular Downcast • Extrair Classe • Extrair Hierarquia • Extrair Interface • Extrair Método • Extrair Subclasse • Extrair Superclasse • Internalizar Classe • Internalizar Método • Internalizar Variável Temporária • Introduzir Asserção • Introduzir Extensão Local • Introduzir Método Externo • Introduzir Objeto Nulo • Introduzir Objeto Parâmetro • Introduzir Variável Explicativa • Mover Campo • Mover Método • Mudar de Referência para Valor • Mudar de Valor para Referência • Ocultar Delegação • Ocultar Método • Parametrizar Método • Preservar o Objeto Inteiro • Remover Atribuições a Parâmetros • […]
  • 13.
    Lista de Refatorações • Remover Flag de Controle • Remover Intermediário • Remover Método de Gravação • Remover Parâmetro • Renomear Método • Separar a Consulta do Modificador • Separar o Domínio da Apresentação • Subir Campo na Hierarquia • Subir Método na Hierarquia • Subir o Corpo do Construtor na Hierarquia • Substituir Atributo por Objeto • Substituir Código de Erro por Exceção • Substituir Comando Condicional por Polimorfismo • Substituir Condição Aninhada por Cláusulas Guarda • Substituir Delegação por Herança • Substituir Enumeração pelo padrão State/Strategy • Substituir Enumeração por Classe • Substituir Enumeração por Subclasses • Substituir Exceção por Teste • Substituir Herança por Delegação • Substituir Método por Objeto Método • Substituir Numeros Mágicos por Constantes Simbólicas • Substituir o Algoritmo • Substituir o Construtor por um Método Fabrica • Substituir Parâmetro por Método • Substituir Parâmetro por Métodos Explícitos • Substituir Registro por Classe de Dados • Substituir Subclasse por Campos • Substituir Variável Temporária por Consulta • Substituir Vetor por Objeto • Transformar Associação Bidirecional em Unidirecional • Transformar Associação Unidirecional em Bidirecional
  • 14.
    Referências bibliográficas Referências: • FOWLER, Martin. Refatoração: aperfeiçoando o projeto de código existente. Porto Alegre, RS: Bookman, 2008. xiv, 365 p. ISBN 8536303956 (broch.). • KERIEVSKY, Joshua. Refatoração para padrões. Porto Alegre, RS: Bookman, 2008. xviii, 400 p. ISBN 9788577802449 (broch.). • Resumo desta apresentação: https://docs.google.com/document/d/ 1TKS_jr5sArNNy8mp2pxITDmdKcWdI ncC2x_yt8ElXLs/edit?usp=sharing Professor: • Camilo Camilo Almendra camilo@es.ufc.br Alunos: • Gabriel Oliveira Mendanha gabrielmendanha@hotmail.com • Thiago Pereira Rosa thiagor@engineer.com