Vous êtes sur la page 1sur 106

Catlogo de Refatoraes

Prof. Alberto Costa Neto DComp/UFS alberto@ufs.br

Catlogo de Refatoraes
Nome Resumo Motivao Mecnica Exemplos

Classificao das Refatoraes


Adio de
Variveis de instncia, variveis de classe, classe, mtodo.

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

Classificao das Refatoraes (2)


Mover
Push Up/Down
Varivel de Instncia, Varivel de Classe, Mtodo.

Mover para um Componente


Mtodo, Varivel de Instncia.

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); }

Mecnica para Extrair Mtodo


Crie um novo mtodo e nomeie-o com a inteno do cdigo extrado Copie o cdigo extrado da fonte para o novo mtodo Busque no cdigo extrado referncias a variveis locais do cdigo de origem. Se h variveis locais usadas apenas dentro do cdigo extrado, declare-as dentro do mtodo novo Passe como parmetro para o novo mtodo as variveis locais que sejam (somente) lidas pelo cdigo extrado

Mecnica para Extrair Mtodo (2)


Se alguma varivel local for modificada
Verifique se pode extrair o cdigo extrado como consulta Se isto for difcil, no poder aplicar Extrair Mtodo. Use Dividir Varivel Temporria ou Substituir Varivel por Consulta e tente de novo

Substitua o cdigo extrado na origem por uma chamada ao novo mtodo Compile e Teste
9

Internalizar (Inline) Mtodo


int getRating() { return (moreThanFiveLateDeliveries()) ? 2 : 1; } boolean moreThanFiveLateDeliveries() { return _numberOfLatgeDeliveries > 5; }

int getRating() { return (_numberOfLatgeDeliveries > 5) ? 2 : 1; }


10

Mecnica para Internalizar Mtodo


Certifique-se de que o mtodo no polimrfico
No internalize se as subclasses sobrecarregarem o mtodo

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)

return (anOrder.basePrice() > 1000)

12

Mecnica para Internalizar Temporrio


Declare a varivel temporria como final
Isto assegura que ela realmente atribuda uma nica vez

Encontre todas as referncias varivel e substitua com o lado direito da atribuio


Compile e teste aps cada mudana

Apague a declarao e a atribuio Compile e teste


13

Substituir Temporrio por Consulta


double basePrice = _quantity * _itemPrice; if (basePrice > 1000) return basePrice * 0.95; else return basePrice * 0.98;

if (basePrice() > 1000) return basePrice() * 0.95; else return basePrice() * 0.98; double basePrice() { return _quantity * _itemPrice;}

14

Mecnica para Substituir Temporrio por Consulta


Procure por uma varivel que receba uma atribuio apenas uma vez
Se mais de uma vez, considere Dividir Temporria

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

Introduzir Varivel Explicativa


if ( (platform.toUpperCase().indexOf("MAC") > -1) && (browser.toUpperCase().indexOf("IE") > -1) && wasInitialized() && resize > 0 ) { // do something }

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

Mecnica para Introduzir Varivel Explicativa


Declare uma varivel temporria do tipo final e atribua a ela uma parte de uma expresso complexa Substitua a parte da expresso pela varivel
Se a parte da expresso se repete, substitua todas as repeties, uma por vez

Compile e teste Repita para outras partes da expresso


17

Dividir Varivel Temporria


double temp = 2 * (_height * _width); System.out.println (temp) temp = _height * _width; System.out.println (temp)

final double perimeter = 2 * (_height * _width); System.out.println (perimeter) final double area = _height * _width; System.out.println (area)
18

Mecnica para Dividir Varivel Temporria


Troque o nome da temporria na sua declarao e na sua primeira atribuio Declare a nova temporria como final Altere as referncias temporria at a sua segunda atribuio Declare a temporria na sua segunda atribuio Compile e teste Repita os passos anteriores
19

Remover Atribuies a Parmetros


int discount (int inputVal, int quantity, int yearToDate) { if (inputVal > 50) inputVal -= 2;

int discount (int inputVal, int quantity, int yearToDate) { int result = inputVal; if (inputVal > 50) result -= 2;

20

Mecnica para Remover Atribuies a Parmetros


Crie uma varivel temporria para o parmetro Substitua todas as referncias ao parmetro feitas aps a atribuio varivel Substitua a atribuio para atribuir nova varivel Compile e teste Mecnica para Java (passagem por valor)

21

Substituir Mtodo por Objeto Mtodo


class Pedido double preo() { double preoBasePrimrio; double preoBaseSecundrio; double preoBaseTercirio; // computao longa }

22

Substituir Mtodo por Objeto Mtodo(2)


CalculadorPreo preoBasePrimrio preoBaseSecundrio preoBaseTercirio computar()

Pedido preo()

return new CalculadorPreo(this).computar()

23

Mecnica para Substituir Mtodo por Objeto Mtodo


Crie uma nova classe dando a ela o nome do mtodo Adicione nova classe um campo final para o objeto que hospedava o mtodo original e um campo para cada v. temporria e cada parmetro do mtodo Adicione nova classe um construtor que receba o objeto fonte e cada parmetro Adicione nova classe um mtodo chamado computar Copie o corpo do mtodo original para computar Compile Substitua o mtodo velho pelo que cria o novo objeto e chama computar Compile e teste
24

Movendo Recursos entre Objetos

Movendo Recursos entre Objetos


Mover Mtodo, Mover Campo, Extrair Classe, Internalizar Classe, Ocultar Delegao, Remover Intermedirio, Introduzir Mtodo Externo, Introduzir Extenso Local

26

Mover Mtodo
Classe 1 umMtodo() Classe 1

Classe 2

Classe 2 umMtodo()

27

Mecnica para Mover Mtodo


Examine todos os recursos usados pelo mtodo fonte que estejam definidos na classe de origem. Considere se eles tambm devem ser movidos. Verifique nas sub e superclasses por outras definies do mtodo
Se houver, talvez no possa mover a no ser que o polimorfismo seja expresso no destino

Declare o mtodo na classe de destino


Mude o nome se for preciso

Copie o cdigo da fonte para o destino e ajuste-o para funcionar


Se usa a classe de origem, passe a referncia ao objeto de origem como um parmetro novo

Compile a classe de destino.


28

Mecnica para Mover Mtodo (2)


Determine como referenciar o objeto destino correto a partir da classe de origem
Pode haver um campo, um parmetro ou um mtodo que lhe dar a referencia ao objeto destino Seno, veja se pode criar facilmente um mtodo que faa isto Seno, precisa criar um novo campo na classe de origem que armazene esta referncia

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

Mecnica para Mover Campo


Se o campo for pblico, use Encapsular Campo Crie um campo na classe destino com mtodos get e set Compile a classe destino Determine como referenciar o objeto destino desde a fonte Apague o campo na fonte Substitua todas as referncias ao campo na fonte com as referncias ao mtodo apropriado no destino
31

Extrair Classe
Pessoa nome cdigoreaEscritrio nmeroEscritrio lerNmeroTelefone() Pessoa nome lerNmeroTelefone() telefone do escritrio NmeroDoTelefone cdigoArea nmero lerNmeroTelefone

32

Mecnica para Extrair Classe


Decida como dividir as responsabilidades da classe Crie uma nova classe para dividir responsabilidades. Renomeie a classe antiga se for preciso Crie um relacionamento entre a classe nova e a antiga Use Mover Campo em cada campo que quiser mover Compile e Teste Use Mover Mtodo em cada mtodo desejado Compile e Teste Analise e reduza as interfaces de cada classe

33

Internalizar (Inline) Classe


Pessoa nome getNumeroTelefone() telefone do escritrio 1 NumeroTelefone cdigoArea nmero getNumeroTelefone()

Pessoa nome cdigorea nmero getNmeroTelefone()

34

Mecnica para Internalizar Classe


Declare o protocolo pblico da classe candidata na classe que vai absorv-la
Delegue todos os mtodos desse protocolo classe candidata

Troque todas as referncias classe candidata para a classe que a absorver


Troque o nome da classe candidata para que o compilador pegue as referncias

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

Substituir Atributo por Objeto


Pedido cliente:String

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

Mudar Valor para Referncia


Pedido 1 Cliente nome:String

* 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

Mudar de Referncia para Valor


Companhia * 1 ModedaCorrente cdigo:String

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

Substituir Vetor por Objeto


String[] row = new String[3]; row[0] = Liverpool; row[1] = 15;

Performance row = new Performance(); row.setName(Liverpool); row.setWins(15);

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

Pessoa lerCursos():Unmodifiable Set adicionarCurso(:Curso) removerCurso(:Curso)


50

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

Substituir Enumerao pelo Padro State/Strategy


Empregado Empregado ENGENHEIRO:int VENDEDOR:int Tipo:int 1 TipoDeEmpregado

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;

if (notSummer(date)) charge = winterCharge(quantity) else charge = summerCharge(quantity);

58

Mecnica
Extraia o teste da condio para seu prprio mtodo Extraia a parte do then a do else para seus prprios mtodos

59

Consolidar Expresso Condicional


double disabilityAmount() { if (_seniority < 2) return 0; if (_monthsDisabled > 12) return 0; if (_isPartTime) return 0; //compute the disability amount

double disabilityAmount() { if (isNotEligableForDisability()) return 0; //compute the disability amount


60

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

Consolidar Fragmentos Condicionais Duplicados


if (isSpecialDeal()) { total = price * 0.95; send(); } else { total = price * 0.98; send(); } if (isSpecialDeal()) total = price * 0.95; else total = price * 0.98; send();

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

Substituir Condio Aninhada por Clusulas-Guarda


double getPayAmount() { double result; if (_isDead) result = deadAmount(); else { if (_isSeparated) result = separatedAmount(); else { if (_isRetired) result = retiredAmount(); else result = normalAmount;}} return result; }

64

Substituir Condio Aninhada por Clusulas-Guarda (2)

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

Substituir Comando Condicional por Polimorfismo


double getVelocidade() { switch (_tipo) { case EUROPEU: return getVeolcidadeBsica(); case AFRICANO: return getVelocidadeBsica() getFatorDeCarga() * _numeroDeCocos; case NORUEGUS_AZUL: return: (_estaPregada) ? 0 : gerVelocidadeBsica(_voltagem) }

67

Substituir Comando Condicional por Polimorfismo (2)

Pssaro getVelocidade()

Europeu getVelocidade()

Africano getVelocidade()

Noruegus Azul getVelocidade()

68

Substituir Comando Condicional por Polimorfismo


Voc tem um comando condicional que seleciona diferentes comportamentos de acordo com o tipo de um objeto Mova cada ramificao do comando condicional para um mtodo sobreposto em uma subclasse Torne abstrato o mtodo original

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

Introduzir Objeto Nulo


if (cliente == null) plano = PlanoDeCobrana.bsico(); else plano = cliente.getPlano();

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

Tornando as Chamadas de Mtodos Mais Simples

Tornando as Chamadas de Mtodos Mais Simples


Renomear Mtodo, Remover/Acrescentar Parmetro, Separar a Pesquisa do Modificador, Parametrizar Mtodo, Substituir Parmetro por Mtodos Explcitos, Preservar o Objeto Inteiro, Substituir Parmetro por Mtodo, Introduzir Objeto Parmetro, Remover Mtodo de Gravao (Setter), Ocultar Mtodo, Substituir Construtor por um Mtodo Fbrica Encapsular Downcast, Substituir Cdigo de Erro por Exceo, Substituir Exceo por Teste
76

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

Separar Consulta do Modificador


Cliente getTotalPendenteEpreparaParaResumos()

Cliente getTotalPendente() preparaParaResumos()


83

Lidando Com Generalizao

Lidando Com Generalizao


Subir na Hierarquia
Campo, Mtodo, Corpo de Construtor

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

Subir Campo na Hierarquia


Duas Subclasse tm o mesmo campo Mova o campo para a superclasse !
Empregado Empregado nome

Vendedor nome

Engenheiro nome

Vendedor

Engenheiro

86

Subir Mtodo na Hierarquia


Duas subclasses tem mtodos que produzem resultados idnticos Mova-os para a superclasse
Empregado Empregado getNome()

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

Descer Campo na Hierarquia


Empregado quota Empregado

Vendedor

Engenheiro

Vendedor quota

Engenheiro

89

Descer Mtodo na Hierarquia


Empregado lerQuota() Vendedor Vendedor Engenheiro lerQuota() Engenheiro Empregado

90

Extrair Subclasse
Item Servio getPreoTotal() getPreoUnitrio() getEmpregado() Item Servio getPreoTotal() getPreoUnitrio()

Item MoDeObra getPreoUnitrio() getEmpregado()


91

Extrair Superclasse
Departamento getCustoAnualTotal() getNome() getNmeroDePessoas() Grupo getCustoAnualTotal() getNome()

Empregado getCustoAnual() getNome() getId()

Empregado getCustoAnual() getId() Departamento getCustoAnual() getNmeroDePessoas() 92

Extrair Interface
Empregado getTaxa() getHabilidadeEspecial() getNome getDepartamento <<interface>> Cobrvel getTaxa() temHabilidadeEspecial()

Empregado getTaxa() getHabilidadeEspecial() getNome getDepartamento


93

Criar um Mtodo Padro (Template Method)


Local double base = _unidade * _valorUnitrio * 0.5; double imposto = base * Local.TAXA * 0.2; return base + imposto

LocalResidencial getValorCobrvel()

LocalPerigoso getValorCobrvel()

double base = _unidade * _valorUnitrio; double imposto = base * Local.TAXA; return base + imposto
94

Criar um Mtodo Padro (2)


Local getValorCobrvel() getValorBase() getValorImposto() return getValorBase() + getValorImposto();

LocalResidencial getValorBase() getValorImposto()

LocalPerigoso getValorBase() getValorImposto()


95

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

Refatorao com Eclipse

Refatorao com Eclipse


Prov Refatoraes primitivas automticas poderosas que so a base para grandes Refatoraes Move, Extract, Change Method Signature, Convert Anonymous Class to Nested, Convert Nested Type, Convert Local Variable to Field, Encapsulate Field, Decompose Conditional, Push Up, Pull Down, Rename e outros... Oferece Undo
100

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

Quatro Refatoraes Grandes


Desembaraar Herana Converter Projeto Procedural em Objetos Separar o Domnio da Apresentao Extrair Hierarquia

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

Refatorao pode ser usada para


entender o cdigo limpar o cdigo preparar o cdigo para extenses
104

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

Vous aimerez peut-être aussi