08 Simplificando Expressoes Condicionais

16
Refatoração Simplificando 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 [email protected]

description

08 Simplificando Expressoes Condicionais

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

[email protected]

Tópicos

I. Definição;

II. Técnicas de Refatoração;

III. Referência.

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() {...}...}

16/16

Referência

● FOWLER, MARTIN. Refatoração: Aperfeiçoando o Projeto de Código Existente.– Capitulo 9: Simplificando Expressões

Condicionais.