Upload
alicia-campos-da-fonseca
View
213
Download
0
Embed Size (px)
Citation preview
Aula 10
Adeline de Sousa [email protected]
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
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 ?
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!!!
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
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
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
Adaptando as chamadasMinhaClasseComDoisBotoes()
criarBotaoEntrada();
criarBotaoResultado();
}
MinhaClasseComDoisBotoes()
botaoEntrada = criarBotaoEntrada(“Entrada”, 250, 65);
botaoResultado = criarBotaoEntrada(“Resultado”, 360, 65);
}
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){...}
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();
}
Aliasing É o mecanismo através do qual,
duas ou mais variáveis referenciam um mesmo objeto.
Botaobotao1 botao2
“Calc”
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”
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 )
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
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
Ordem de declarações Dentro de uma classe, a ordem de
declaração de métodos, atributos e construtores não importa.
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
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);
}
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);
}
...
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;
}
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);
}