Beruflich Dokumente
Kultur Dokumente
Catlogo de Refatoraes
Nome Resumo Motivao Mecnica Exemplos
Apagar
Variveis de instncia, variveis de classe, classe, mtodo
Renomear
Variveis de instncia, variveis de classe, classe, mtodo*, variveis temporrias
Renomear mtodo
Renome simples, permute argumentos, adicione argumentos, apague argumentos
3
Mude Superclasse
Sub-mtodos
Extrair e Internalizar (Inline)
Mtodo, Varivel Temporria
4
Compondo Mtodos
Compondo Mtodos
Extrair Mtodo, Internalizar (Inline) Mtodo, Inline Temporrio, Substituir Temporrio por Consulta, Introduzir Varivel Explicativa, Dividir Varivel Temporria, Remover atribuio a parmetros, Substituir Mtodo por Objeto Mtodo, Substituir Algoritmo
6
Extrair Mtodo
void imprimirDvida(double quantia) { imprimirCabealho(); //imprime os detalhes System.out.println(nome: + _nome); System.out.println(quantia: + quantia); } void imprimirDvida (double quantia) { imprimirCabealho(); imprimirDetalhes(quantia); } void imrpimirDetalhes (double quantia) { System.out.println(nome: + _nome); System.out.println(quantia: + quantia); }
Substitua o cdigo extrado na origem por uma chamada ao novo mtodo Compile e Teste
9
Procure todas as chamadas ao mtodo Substitua cada chamada com o corpo do mtodo Compile e teste Apague a definio do mtodo Compile e teste.
11
Internalizar Temporrio
double basePrice = anOrder.basePrice(); return (basePrice > 1000)
12
if (basePrice() > 1000) return basePrice() * 0.95; else return basePrice() * 0.98; double basePrice() { return _quantity * _itemPrice;}
14
Declare a varivel como final Compile Extraia o lado direito da atribuio para um mtodo
Garanta que o mtodo livre de efeitos colaterais, seno use Separar Consulta do Modificador
Compile e teste
15
final boolean isMacOs = platform.toUpperCase().indexOf("MAC") > -1; final boolean isIEBrowser = browser.toUpperCase().indexOf("IE") > -1; final boolean wasResized = resize > 0; if (isMacOs && isIEBrowser && wasInitialized() && wasResized) { // do something }
16
final double perimeter = 2 * (_height * _width); System.out.println (perimeter) final double area = _height * _width; System.out.println (area)
18
int discount (int inputVal, int quantity, int yearToDate) { int result = inputVal; if (inputVal > 50) result -= 2;
20
21
22
Pedido preo()
23
26
Mover Mtodo
Classe 1 umMtodo() Classe 1
Classe 2
Classe 2 umMtodo()
27
Transforme o mtodo fonte em um mtodo de delegao Compile e teste Decida se ir remover o mtodo de origem
Se decidir que sim, substitua todas as referncias a esse mtodo por referncias ao mtodo destino
Compile e Teste
29
Mover Campo
Classe 1 umCampo Classe 1
Classe 2
Classe 2 umCampo
30
Extrair Classe
Pessoa nome cdigoreaEscritrio nmeroEscritrio lerNmeroTelefone() Pessoa nome lerNmeroTelefone() telefone do escritrio NmeroDoTelefone cdigoArea nmero lerNmeroTelefone
32
33
34
Compile e Teste Use Mover Mtodo e Mover Campo da classe candidata para a que a absorve Apague a classe candidata
35
Organizando Dados
Organizando Dados
Auto-Encapsular Campo, Substituir Atributo por Objeto, Mudar de Valor para Referncia, Mudar de Referncia para Valor, Substituir Vetor por Objeto, Duplicar Dados Observados, Transformar associao Unidirecional em Bidirecional, Transformar associao Bidirecional em Unidirecional, Substituir Nmero Mgicos, Encapsular Campo/Coleo, Substituir Registro por Classe de Dados, ..
37
Auto-Encapsular Campo
private int _low, _high; boolean includes (int arg) { return arg >= _low && arg <= _high; }
private int _low, _high; boolean includes (int arg) { return arg >= getLow() && arg <= getHigh(); } int getLow() {return _low;); int getHigh() {return _high;);
38
Mecnica
Crie mtodos get e set para o campo Encontre referncias ao campo e substitua por chamadas get e set Torne o campo privado Compile e Teste
39
Pedido
Cliente nome:String
40
Mecnica
Cria a classe para o atributo e dentro dela crie um campo final para o atributo da classe original Compile Mude o tipo do campo na classe de origem para a nova classe Mude o mtodo get na classe de origem para que chame o get da nova classe Se o campo mencionado no construtor, atribua o campo usando o construtor da nova classe Troque o mtodo de leitura para criar uma nova instncia da nova classe Compile e Teste
41
* Pedido
1 Cliente nome:String
42
Mecnica
Use Substituir o Construtor por um Mtodo Fbrica Compile e Teste Decida que objeto responsvel pelo fornecimento de acesso aos objetos Determine se os objetos sero pr-criados ou criados dinamicamente Altere o mtodo fbrica para retornar o objeto por referncia Compile e Teste
43
1 Companhia
MoedaCorrente cdigo:String
44
Mecnica
Verifique se o candidato imutvel ou pode se tornar imutvel Crie um mtodo equals e um mtodo hash Compile e Teste Considere remover qualquer mtodo fbrica e criar um construtor pblico
45
46
Mecnica
Crie uma nova classe para representar a informao no vetor. D a ela um campo pblico para o vetor Altere todos os usurios do vetor para usarem a nova classe Compile e Teste Um a um, acrescente mtodos set e get para cada elemento do vetor Crie um campo para cada elemento do vetor e mude os gets e sets para usarem o campo Compile e Teste Apague o vetor Compile e Teste
47
Encapsular Campo
public String _name;
private String _name; public String getName() {return _name;}; public void setName(String arg) {_name = arg;);
48
Mecnica
Crie mtodos de gravao e leitura para o campo Encontre todos os clientes fora da classe que referenciam o campo. Substitua as referncias por chamadas a get e set Compile e Teste Declare o campo privado Compile e Teste
49
Encapsular Coleo
Pessoa lerCursos():Set gravarCursos():Set
Mecnica
Acrescente mtodos de adio e remoo para a coleo Inicialize o campo para uma coleo vazia Compile Descubra chamadas ao mtodo de gravao. Modifique para usar operaes de adio e remoo ou faa os clientes chamarem essas operaes Compile e Teste Descubra todos os usurios do mtodo de leitura que modifiquem a coleo. Altere-os para usarem os mtodos de adio e remoo Compile e Teste
51
Mecnica (2)
Modifique o mtodo de leitura para retornar uma viso apenas de leitura da coleo Compile e Teste Encontre os usurios do mtodo de leitura. Procure por cdigo que poderia estar no objeto que hospeda a coleo. Use Extrair Mtodo e Mover Mtodo para esse objeto
52
Engenheiro
Vendedor
53
Mecnica
Auto-encapsule o campo enumerado Crie uma nova classe para o objeto estado. D um nome adequado Acrescente subclasses do objeto estado para cada valor possvel do enumerado Crie uma pesquisa abstrata no objeto estado para retornar o valor da enumerao Compile
54
Mecnica (2)
Crie um campo na classe antiga para o novo objeto de estado Ajuste a pesquisa do valor do campo enumerado na classe original para delegar ao objeto estado Ajuste os mtodos set do campo enumerado na classe original para atribuir uma instncia da subclasse apropriada do objeto estado Compile e Teste
55
Simplificando Condicionais
Simplificando Condicionais
Decompor Condicional, Consolidar Expresso Condicional, Consolidar Fragmentos Condicionais Duplicados, Remover Flag de Controle, Substituir Condio Aninhada por Clusulas Guarda, Substituir Comando Condicional por Polimorfismo, Introduzir Objeto Nulo, Introduzir Assero
57
Decompor Condicional
if (date.before (SUMMER_START) || date.after (SUMMER_END)) charge = quantity * _winterRate + _winterServiceCharge; else charge = quantity * _summerRate;
58
Mecnica
Extraia o teste da condio para seu prprio mtodo Extraia a parte do then a do else para seus prprios mtodos
59
Mecnica
Verifique se nenhuma das condies tem efeito colateral Substitua a cadeia de condicionais por uma nica declarao condicional usando operadores lgicos Compile e Teste Considere usar Extrair Mtodo sobre a condio
61
62
Mecnica
Identifique o cdigo comum, independente da condio Se estiver no incio (fim), mova-o para antes (depois) da expresso condicional Se o cdigo comum estiver no meio, verifique se o cdigo anterior ou posterior a ele altera algo Se o cdigo comum acontecer mais de uma vez, extraia um mtodo
63
64
double getPayAmount() { if (_isDead) return deadAmount(); if (_isSeparated) return separatedAmount(); if (_isRetired) return retiredAmount(); return normalAmount;}}}
65
Mecnica
Para cada verificao introduza a clusula-guarda Compile e Teste aps cada substituio Considere usar Consolidar Expresses Condicionais se as clusulas-guarda produzirem o mesmo resultado
66
67
Pssaro getVelocidade()
Europeu getVelocidade()
Africano getVelocidade()
68
69
Mecnica
Se no tiver a a estrutura de herana necessria, crie-a.
Use Substituir Enumerao por Subclasse ou Substituir Enumerao pelo Padro State/Strategy
Se a declarao condicional for parte de um mtodo maior, separe-a com Extrair Mtodo Se necessrio, use Mover Mtodo para colocar a expresso condicional no topo da hierarquia Selecione uma das subclasses. Sobrescreva o mtodo da declarao condicional. Copie o corpo e ajuste Compile e Teste
70
Mecnica (2)
Remova a ramificao copiada da declarao condicional Compile e Teste Repita com cada ramificao Transforme o mtodo da superclasse em abstrato
71
Cliente getPlano
ClienteNulo getPlano
72
Mecnica
Crie uma subclasse da classe original para atuar com uma verso nula
Crie a operao Nulo() na classe original e na nula
Compile Descubra todos os lugares que podem retornar um nulo. Substitua para retornarem um objeto nulo Encontre todos os lugares que comparam por null e substitua por uma chamada a Nulo() Compile e Teste
73
Mecnica
Procure cdigo nos quais os clientes invocam uma operao no caso not null e outro comportamento no caso contrrio
Sobrescreva a operao na classe nula com o comportamento Remova o condicional com uma chamada polimrfica operao
Compile e Teste
74
Renomear Mtodo
Cliente getlimdcrat()
Cliente getLimiteDeCrditoFaturvel()
77
Mecnica
Verifique se o mtodo implementado por uma superclasse ou subclasse
Se for execute estes passos para cada implementao
Declare um novo mtodo com o nome novo. Copie o corpo e ajuste Compile Altere para que o antigo chame o novo Compile e Teste Encontre referncias ao mtodo antigo e atualize para o novo. Compile e Teste. Remova o mtodo antigo
Pode querer manter o mtodo antigo
Compile e Teste
78
Acrescentar Parmetro
Cliente getContato()
Cliente getContato(:Date)
79
Mecnica
Similar ao de Renomear Mtodo
80
Remover Parmetro
Cliente getContato(:Date)
Cliente getContato()
81
Mecnica
Similar a Renomear Mtodo
82
Descer na Hierarquia
Campo, Mtodo
Extrair
Subclasse, Superclasse, Interface
Condensar Hierarquia Criar um Mtodo Padro (Template Method) Substituir Herana por Delegao Substituir Delegao por Herana
85
Vendedor nome
Engenheiro nome
Vendedor
Engenheiro
86
Vendedor getNome()
Engenheiro getNome()
Vendedor
Engenheiro
87
Mecnica
Certifique-se de que os mtodos sejam idnticos
Altere as assinaturas se for necessrio
Crie um novo mtodo na superclasse, copie o corpo Apague na subclasse um por um, compile e teste
88
Vendedor
Engenheiro
Vendedor quota
Engenheiro
89
90
Extrair Subclasse
Item Servio getPreoTotal() getPreoUnitrio() getEmpregado() Item Servio getPreoTotal() getPreoUnitrio()
Extrair Superclasse
Departamento getCustoAnualTotal() getNome() getNmeroDePessoas() Grupo getCustoAnualTotal() getNome()
Extrair Interface
Empregado getTaxa() getHabilidadeEspecial() getNome getDepartamento <<interface>> Cobrvel getTaxa() temHabilidadeEspecial()
LocalResidencial getValorCobrvel()
LocalPerigoso getValorCobrvel()
double base = _unidade * _valorUnitrio; double imposto = base * Local.TAXA; return base + imposto
94
Mecnica
Decomponha os mtodos de modo que todos os mtodos extrados sejam idnticos ou completamente diferentes Use Subir Mtodo na Hierarquia para subir os mtodos idnticos Para os mtodos diferentes, use Renomear Mtodo de modo que as assinaturas para todos os mtodos sejam as mesmas Compile e Teste aps cada alterao
96
Mecnica (2)
Use Subir Mtodo na Hierarquia em um dos mtodos originais. Defina as assinaturas dos mtodos diferentes na superclasse como mtodos abstratos Compile e Teste Remova os outros mtodos, compile e teste aps cada remoo
97
Resumo
Temos visto a mecnica de vrias refatoraes Quando voc detecta um mau cheiro, voc frequentemente aplica refatorao para limpar o cdigo Refatoraes frequentemente levam a Padres de Projeto
98
Refatoraes Automticas
Refatorao mo consome tempo Com ferramentas, refatorao se torna cada vez menos uma atividade separada da programao Erros de projeto se tornam menos caros Muito menos testes Porm, sempre haver refatoraes que no podem ser automatizadas
101
Refatoraes Grandes
Acmulo de vrios problemas sobre o tempo pode corromper o projeto original Voc no entende mais o sistema Acmulo de decises de projeto entendidas pela metade estrangula o programa
102
103
Resumo
Tipicamente, Refatorao feito em pequenos passos Depois de cada passo, voc est com um sistema que preserva o comportamento original
Porm, tipicamente se mistura Refatorao com fixar bugs
Exerccio 2
Usar o Eclipse para implementar as refatoraes vistas no exemplo da Conta dos filmes alugados
105
Exerccio 3
Refatorar o programa para facilitar alteraes na classificao dos filmes
106