Olá pessoal, estou com um exercício aqui do padrão Expert pra resolver, e estou com algumas dúvidas, gostaria de esclarecê-las.
Material Original: http://www.dsc.ufcg.edu.br/~jacques/cursos/map/html/pat/expert.htm
O problema é o seguinte:
Fita.java
public class Fita {
public enum Tipo {
normal, lancamento, infantil
};
private String titulo;
private Tipo codigoDePreco;
//Getters and Setters
}
Aluguel.java
public class Aluguel {
private Fita fita;
private int diasAlugada;
//Getters and Setters
}
Cliente.java
public class Cliente {
private String nome;
private List<Aluguel> fitasAlugadas = new ArrayList<Aluguel>();
public void adicionaAluguel(Aluguel aluguel) {
fitas.add(aluguel);
}
public void extrato() {
double valorTotal = 0.0;
//Responsabilidade 1: Calcula o total dos aluguéis
for (Aluguel cadaAluguel : fitasAulagadas )
double valorCorrente = 0.0
//Responsabilidade 2: Calcula o valor de cada aluguel
Tipo tipo = cadaAluguel.getFita().getCodigoDePreco();
switch(tipo) {
case normal:
//Responsabilidade 3: Calcular o preço de cada fita
valorCorrente += 2;
//Responsabilidade 4: Calcular multa
int dias = cadaAluguel.getDiasAlugada();
if ( dias > 2 ) { valorCorrente += (dias - 2) * 1.5; }
break;
case lancamento:
//Responsabilidade 3: Calcular o preço de cada fita
int dias = cadaAluguel.getDiasAlugada();
valorCorrente += dias * 3;
//Note que não há cálculo de multa para filmes lançamento
break;
case infantil:
//Responsabilidade 3: Calcular o preço de cada fita
valorCorrente += 1.5;
//Responsabilidade 4: Calcular multa
int dias = cadaAluguel.getDiasAlugada();
if ( dias > 3 ) { valorCorrente += (dias - 3) * 1.5; }
break;
}//switch
}//for
}
}
Como vocês podem ver, identifiquei as principais responsabilidades que existem na classe Cliente. Preciso agora identificar onde essas responsabilidades devem estar concentradas, devem permanecer na classe Cliente? na classe Aluguel ou na classe Fita? Decidi, analisar uma por uma.
Responsabilidade 1 (getTotal()): - Para Calcular o total dos aluguéis É PRECISO conhecer todos aluguéis (Information Expert: Cliente)
BELEZA!
Responsabilidade 2 (getPrecoAluguel()): - Para Calcular o valor do aluguel É PRECISO ter acesso tanto ao preco da fita (getPrecoFita()) quanto ao preço da multa (getPrecoMulta()) . Pois o cálculo é getPrecoFita() + getPrecoMulta(). Nesse caso quem é o information expert, já que eu não sei quem é responsável por calcular o preço da fita e nem o valor da multa.
Responsabilidade 3 (getPrecoFita()): - Para Calcular o preço de cada fita É PRECISO ter acesso ao tipo da fita (Fita.codigoDePreco) e quantidade de dias alugada (Aluguel.diasAlugada), no caso de fitas lançamento o preço pago é 3 reais por dia. Nesse caso, quem é o information expert? Aluguel (porque encapsula uma fita, dessa forma posso fazer fita.getCodigoDePreco() para obter o tipo ) ? Ou a Fita é o information expert (porque a classe fita é responsável por conhecer seu preço… Alta coesão)
Responsabilidade 4 (getPrecoMulta()): - Para Calcular o valor da multa É PRECISO ter acesso a quantidade de dias que ela ficou alugada e também o tipo da fita(dependendo do tipo podemos passar 2 ou até 3 dias com a fita) . -> Aluguel.diasAlugada e Fita.codigoDePreco. A dúvida é a mesma da de cima.