A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

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

Apresentações semelhantes


Apresentação em tema: "Aula 10 Adeline de Sousa Tópicos desta aula:  Problemas da duplicação de código e como eliminá-la  Aliasing  Escopo de variáveis."— Transcrição da apresentação:

1 Aula 10 Adeline de Sousa adss@cin.ufpe.br

2 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

3 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 ?

4 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 repetidos Duplicação de código == duplicação de esforço!!!

5 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

6 Removendo a duplicação passo a passo  Identificando os pontos variáveis 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

7 Generalizando o método void 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

8 Adaptando as chamadas MinhaClasseComDoisBotoes() criarBotaoEntrada(); criarBotaoResultado(); } MinhaClasseComDoisBotoes() botaoEntrada = criarBotaoEntrada(“Entrada”, 250, 65); botaoResultado = criarBotaoEntrada(“Resultado”, 360, 65); }

9 Renomeando o método e removendo os métodos desnecessários MinhaClasseComDoisBotoes() 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){...}

10 Adaptando as chamadas e renomeando o método antigo Button criarBotao(String nome, int x, int y){ Button b = new Button(); b.setText(nome); this.include(b,x,y); return b; } MinhaClasseComDoisBotoes() criarBotaoEntrada(); criarBotaoResultado(); }

11 Aliasing  É o mecanismo através do qual, duas ou mais variáveis referenciam um mesmo objeto. Botao botao1botao2 “Calc”

12 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”

13 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 )

14 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

15 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

16 Ordem de declarações  Dentro de uma classe, a ordem de declaração de métodos, atributos e construtores não importa.

17 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

18 Antes do extract method MinhaJanelaComComportamento() { 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); }

19 Depois do extract method MinhaJanelaComComportamento() { 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); }...

20 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ósito void 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; }

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


Carregar ppt "Aula 10 Adeline de Sousa Tópicos desta aula:  Problemas da duplicação de código e como eliminá-la  Aliasing  Escopo de variáveis."

Apresentações semelhantes


Anúncios Google