08 Simplificando Expressoes Condicionais
description
Transcript of 08 Simplificando Expressoes Condicionais
RefatoraçãoSimplificando Expressões Condicionais
Instituto Federal Baiano – Campus Catu
Curso: Análise e Desenvolvimento de Sistemas
Disciplina: Laboratório de Programação Web II
Prof. Marcos Camada
3/16
Definição
Consiste em simplificar estruturas condicionais melhorando assim, a legibilidade do código.
4/16
Técnicas de Refatoração
(1) Decompor Condicional;
(2) Substituir Comando Condicional por Polimorfismo.
5/16
Decompor Condicional
● Descrição:– Extraia métodos da condição, da parte após o
then e da parte após o else.
● Motivação– Estruturas condicionais complexas dificulta o
entendimento do código.
● Dica– A utilização de procedimentos que indique suas
intenções pode tornar as condições mais fáceis de serem lidas.
6/16
Decompor Condicional
● Exemplo
if (data.before(INICIO_VERAO) || data.after(FIM_VERAO)) aCobrar = quantidade * _taxaDeInverno + _precoDoServicoNoInverno;else aCobrar = quantidade * _taxaDeVerao;
7/16
Decompor Condicional
● Mecânica
(1) Extraia o teste da condição para seu próprio método;
if (naoVerao(data)) aCobrar = quantidade * _taxaDeInverno + _precoDoServicoNoInverno;else aCobrar = quantidade * _taxaDeVerao;
8/16
Decompor Condicional
(2) Extraia a parte do then e do else para seus próprios métodos.
if (naoVerao(data)) aCobrar = precoDeInverno(quantidade);else aCobrar = precoDeVerao(quantidade);
9/16
Substituir Comando Condicional por Polimorfismo
● Descrição– Mova cada ramificação do comando condicional para um método de
sobrescrita em uma subclasse. Torne abstrato o método original.
● Motivação– A utilização do polimorfismo apresenta como vantagem quando
utilizado em um conjunto de condições aparece em muitos lugares do programa.
● Dica– Quando existe um comando condicional que seleciona diferentes
comportamentos de acordo com o tipo de um objeto.
10/16
Substituir Comando Condicional por Polimorfismo
● Exemplo
public double obterVelocidade() { switch (_tipo) { case EUROPEU: return obterVelocidadeBasica(); case AFRICANO: return obterVelocidadeBasica() - obterFatorDeCarga(); case NORUEGUES_AZUL: return (_estaPregada) ? 0 : obterVelocidadeBasica(_voltagem); } throw RuntimeException("Deveria ser inacessível");}
11/16
Substituir Comando Condicional por Polimorfismo
● Mecânica(1) Se a declaração condicional for uma parte de um
método maior, separe-a e use Extrair Método;
(2) Caso necessário, use Mover Método para colocar a expressão condicional no topo da hierarquia de herança;
public class Passaro { public double obterVelocidade() { switch (_tipo) { case EUROPEU: return obterVelocidadeBasica(); case AFRICANO: return obterVelocidadeBasica() - obterFatorDeCarga(); case NORUEGUES_AZUL: return (_estaPregada) ? 0 : obterVelocidadeBasica(_voltagem); } throw RuntimeException("Deveria ser inacessível"); }}
12/16
Substituir Comando Condicional por Polimorfismo
(3) Selecione uma das subclasses. Crie um método na subclasse que sobrescreva o método da declaração condicional. Copie o corpo dessa ramificação da declaração condicional para o método na subclasse e ajuste-a;
(4) Compile e teste;
public classe Europeu { ... public double obterVelocidade() { return obterVelocidadeBasica(); }}
13/16
Substituir Comando Condicional por Polimorfismo
(5) Remova a ramificação copiada da declaração condicional;
(6) Compile e teste;
public class Passaro { public double obterVelocidade() { switch (_tipo) { case EUROPEU: return obterVelocidadeBasica(); case AFRICANO: return obterVelocidadeBasica() - obterFatorDeCarga(); case NORUEGUES_AZUL: return (_estaPregada) ? 0 : obterVelocidadeBasica(_voltagem); } throw RuntimeException("Deveria ser inacessível"); }}
14/16
Substituir Comando Condicional por Polimorfismo
(7) Repita com cada ramificação da declaração condicional até que todas elas tenham sido transformadas em métodos de subclasse;
Africano
obterVelocidade()
NorueguesAzul
obterVelocidade()
15/16
Substituir Comando Condicional por Polimorfismo
(8) Transforme o método da superclasse em abstrato.
public abstract class Passaro {... public abstract double obterVelocidade() {...}...}