aula 10 adeline de sousa [email protected]. tópicos desta aula: problemas da duplicação de...

21
Aula 10 Adeline de Sousa [email protected]

Upload: alicia-campos-da-fonseca

Post on 07-Apr-2016

213 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Aula 10 Adeline de Sousa adss@cin.ufpe.br. Tópicos desta aula:  Problemas da duplicação de código e como eliminá-la  Aliasing  Escopo de variáveis

Aula 10

Adeline de Sousa [email protected]

Page 2: Aula 10 Adeline de Sousa adss@cin.ufpe.br. Tópicos desta aula:  Problemas da duplicação de código e como eliminá-la  Aliasing  Escopo de variáveis

Tópicos desta aula: Problemas da duplicação de código

e como eliminá-la Aliasing Escopo de variáveis Ordem de declarações Revisão de alguns refactorings

Page 3: Aula 10 Adeline de Sousa adss@cin.ufpe.br. Tópicos desta aula:  Problemas da duplicação de código e como eliminá-la  Aliasing  Escopo de variáveis

Duplicação de código

void criarBotaoEntrada(){

botaoEntrada = new Button();

botaoEntrada.setText(“Entrada”);

this.include(botaoEntrada, 250,65);

}

void criarBotaoResultado(){

botaoResultado = new Button();

botaoResultado.setText(“Resultado”);

this.include(botaoResultado , 360,65);

}

Os dois trechos de código são idênticos. Apenas nome de variável e alguns parâmetros são diferentes

E se eu precisar especificar o tamanho do botão ?

Page 4: Aula 10 Adeline de Sousa adss@cin.ufpe.br. Tópicos desta aula:  Problemas da duplicação de código e como eliminá-la  Aliasing  Escopo de variáveis

Problemas da duplicação de código

Código mais difícil de entender e de manter• Se um bug for encontrado, terá de ser

corrigido em todos os outros códigos repetidos• Um programador desavisado pode esquecer

de alterar os outros códigos replicados e o bug irá persistir

• Se uma alteração for requerida, esta também deverá ser propagada por todos os trechos repetidosDuplicação de código == duplicação de esforço!!!

Page 5: Aula 10 Adeline de Sousa adss@cin.ufpe.br. Tópicos desta aula:  Problemas da duplicação de código e como eliminá-la  Aliasing  Escopo de variáveis

Algumas maneiras de remover a duplicação...

Identifique os pontos que são variáveis Se for entre vários métodos similares, escolha

um e generalize-o adicionando parâmetros• Altere as chamadas para que recebam os novos

parâmetros• Use um nome mais adequado para o nome do

método • Eventualmente, é necessário também alterar seu

tipo de retorno Se não for, identifique o código repetitivo e

use um método para substitui-lo

Page 6: Aula 10 Adeline de Sousa adss@cin.ufpe.br. Tópicos desta aula:  Problemas da duplicação de código e como eliminá-la  Aliasing  Escopo de variáveis

Removendo a duplicação passo a passo

Identificando os pontos variáveisvoid criarBotaoEntrada(){

botaoEntrada = new Button();

botaoEntrada.setText(“Entrada”);

this.include(botaoEntrada, 250,65);

}

void criarBotaoResultado(){

botaoResultado = new Button();

botaoResultado.setText(“Resultado”);

this.include(botaoResultado , 360,65);

}

Os dois trechos de código são idênticos. Apenas nome de variável e alguns parâmetros são diferentes

Page 7: Aula 10 Adeline de Sousa adss@cin.ufpe.br. Tópicos desta aula:  Problemas da duplicação de código e como eliminá-la  Aliasing  Escopo de variáveis

Generalizando o métodovoid criarBotaoEntrada(String nome, int x, int y){

botaoEntrada = new Button();

botaoEntrada.setText(nome);

this.include(botaoEntrada, x,y);

}

Button criarBotaoEntrada(String nome, int x, int y){

Button b = new Button();

b.setText(nome);

this.include(b,x,y);

return b;

}

Parametrização

Alteração do tipo de retorno

Page 8: Aula 10 Adeline de Sousa adss@cin.ufpe.br. Tópicos desta aula:  Problemas da duplicação de código e como eliminá-la  Aliasing  Escopo de variáveis

Adaptando as chamadasMinhaClasseComDoisBotoes()

criarBotaoEntrada();

criarBotaoResultado();

}

MinhaClasseComDoisBotoes()

botaoEntrada = criarBotaoEntrada(“Entrada”, 250, 65);

botaoResultado = criarBotaoEntrada(“Resultado”, 360, 65);

}

Page 9: Aula 10 Adeline de Sousa adss@cin.ufpe.br. Tópicos desta aula:  Problemas da duplicação de código e como eliminá-la  Aliasing  Escopo de variáveis

Renomeando o método e removendo os métodos

desnecessáriosMinhaClasseComDoisBotoes()

botaoEntrada = criarBotaoEntrada(“Entrada”, 250, 65);

botaoResultado = criarBotaoEntrada(“Resultado”, 360, 65);

}

Button criarBotaoEntrada(String nome, int x, int y){...}

void criarBotaoResultado(){...}

MinhaClasseComDoisBotoes()

botaoEntrada = criarBotao(“Entrada”, 250, 65); botaoResultado = criarBotao(“Resultado”, 360, 65);

}

Button criarBotao(String nome, int x, int y){...}

Page 10: Aula 10 Adeline de Sousa adss@cin.ufpe.br. Tópicos desta aula:  Problemas da duplicação de código e como eliminá-la  Aliasing  Escopo de variáveis

Adaptando as chamadas e renomeando o método antigoButton criarBotao(String nome, int x, int y){

Button b = new Button();

b.setText(nome);

this.include(b,x,y);

return b;

}

MinhaClasseComDoisBotoes()

criarBotaoEntrada();

criarBotaoResultado();

}

Page 11: Aula 10 Adeline de Sousa adss@cin.ufpe.br. Tópicos desta aula:  Problemas da duplicação de código e como eliminá-la  Aliasing  Escopo de variáveis

Aliasing É o mecanismo através do qual,

duas ou mais variáveis referenciam um mesmo objeto.

Botaobotao1 botao2

“Calc”

Page 12: Aula 10 Adeline de Sousa adss@cin.ufpe.br. Tópicos desta aula:  Problemas da duplicação de código e como eliminá-la  Aliasing  Escopo de variáveis

Aliasing Button botao1 = new Button(); Button botao2 = botao1;

botao1.setText(“abc”); botao2.setText(“xyz”);

Ao final, o objeto apontado tanto por botao1 quanto por botao2 terá o mesmo texto: “xyz”

Page 13: Aula 10 Adeline de Sousa adss@cin.ufpe.br. Tópicos desta aula:  Problemas da duplicação de código e como eliminá-la  Aliasing  Escopo de variáveis

Escopo de Variáveis Chamamos de escopo de uma

variável o trecho de código em que ela pode ser manipulada• Ou seja, o local onde ela é visível

Atributos• São visíveis em toda a classe (entre o

“{” e “}” da declaração de classe )

Page 14: Aula 10 Adeline de Sousa adss@cin.ufpe.br. Tópicos desta aula:  Problemas da duplicação de código e como eliminá-la  Aliasing  Escopo de variáveis

Mais sobre escopo Variáveis locais

• São visíveis dentro do método ou do bloco em que são definidas

public class Janela {

Button botao1;

public void criarBotao(){

Button botao2;

}

}

Escopo de botao1 : toda a classe

Escopo de botao2: método CriarBotao

Page 15: Aula 10 Adeline de Sousa adss@cin.ufpe.br. Tópicos desta aula:  Problemas da duplicação de código e como eliminá-la  Aliasing  Escopo de variáveis

E se redefinirmos a variável? Neste caso, criamos um “buraco”,

no qual o atributo não é visível• A menos que usemos a palavra this

public class Janela {

Button botao = new Button(“teste”);

public void criarBotao(){

Button botao = new Button();

botao.setText(“xyz”)

}

}

Não afeta o atributo “botao”.

Aqui, qualquer alteração

será refletida na

variável local de mesmo nome

Page 16: Aula 10 Adeline de Sousa adss@cin.ufpe.br. Tópicos desta aula:  Problemas da duplicação de código e como eliminá-la  Aliasing  Escopo de variáveis

Ordem de declarações Dentro de uma classe, a ordem de

declaração de métodos, atributos e construtores não importa.

Page 17: Aula 10 Adeline de Sousa adss@cin.ufpe.br. Tópicos desta aula:  Problemas da duplicação de código e como eliminá-la  Aliasing  Escopo de variáveis

Outros assuntos discutidos na aula de hoje...

Extract Method• Consiste em extrair um trecho de

código para um método auxiliar• Melhora a compreensão do código

original, tornando o código mais modular

Page 18: Aula 10 Adeline de Sousa adss@cin.ufpe.br. Tópicos desta aula:  Problemas da duplicação de código e como eliminá-la  Aliasing  Escopo de variáveis

Antes do extract methodMinhaJanelaComComportamento() {

botao = new Button("Calc"); this.include(botao,250,65);

rotuloEntrada = new Label("Entrada");

campoEntrada = new TextField();

this.include(rotuloEntrada,40,60);

this.include(campoEntrada,100,60);

rotuloResultado = new Label("Resultado");

campoResultado = new TextField();

this.include(campoResultado,100,90);

this.include(rotuloResultado,40,90);

}

Page 19: Aula 10 Adeline de Sousa adss@cin.ufpe.br. Tópicos desta aula:  Problemas da duplicação de código e como eliminá-la  Aliasing  Escopo de variáveis

Depois do extract methodMinhaJanelaComComportamento() {

configurarBotao();

configurarEntrada();

configurarResultado();

}

void configurarBotao(){

botao = new Button("Calc"); this.include(botao,250,65);

}

void configurarEntrada(){

rotuloEntrada = new Label("Entrada");

campoEntrada = new TextField();

this.include(rotuloEntrada,40,60);

this.include(campoEntrada,100,60);

}

...

Page 20: Aula 10 Adeline de Sousa adss@cin.ufpe.br. Tópicos desta aula:  Problemas da duplicação de código e como eliminá-la  Aliasing  Escopo de variáveis

Rename Este refactoring deve ser usado

sempre que o nome da entidade ( seja classe, variável ou método) não condiz com o seu propósitovoid configurarBotaoSair(String nome, int x, int y){

Button b = new Button(nome); this.include(b,x,y);

return b;

}void configurarBotao(String nome, int x, int y){

Button b = new Button(nome); this.include(b,x,y);

return b;

}

Page 21: Aula 10 Adeline de Sousa adss@cin.ufpe.br. Tópicos desta aula:  Problemas da duplicação de código e como eliminá-la  Aliasing  Escopo de variáveis

Inline method Inverso do extract method

• Troca uma invocação de método pelo código correspondente

• Deve ser usado quando o corpo do método faz algo que é tão claro quanto o seu nome

MinhaJanelaComComportamento() {

criarEIncluirBotao();

}

void criarEIncluirBotao(){

botao = new Button("Calc");

this.include(botao,250,65);

}

MinhaJanelaComComportamento() {

botao = new Button("Calc");

this.include(botao,250,65);

}