Criticas/Dicas para o codigo e sua refratoraçao

9 respostas
java
M

Gostaria que me dessem dicas para melhorar o seguinte codigo, tal como para nao repetir o mesmo codigo em todos os valores da enum. Penso que receber dicas me ajudará a melhorar. Obrigado

public enum Tarifas {

JANEIRO(30, 2.5, 5) {
	@Override
	public BigDecimal getPreco(int pax, String entrada, String saida, String APT) {
		int diaEntrada = Integer.parseInt(entrada.substring(0, 2));
		int diaSaida = Integer.parseInt(saida.substring(0, 2));
		BigDecimal paxDecimal = getPaxDecimal(pax, APT);
		BigDecimal preco = new BigDecimal(getPrecoInicial());
		final BigDecimal ADD = new BigDecimal(getPessoaAlteracao());
		BigDecimal addT2 = new BigDecimal(0);
		if (APT == "T2"){
			addT2 = new BigDecimal(getPessoaAlteracao());
		}
		
		preco = preco.add((addT2.add(paxDecimal.multiply(ADD))));
		preco = preco.multiply(new BigDecimal(diaSaida-diaEntrada));
		
		return preco;
	}
}
, FEVEREIRO(30, 2.5, 5) {
	@Override
	public BigDecimal getPreco(int pax, String entrada, String saida, String APT) {
		int diaEntrada = Integer.parseInt(entrada.substring(0, 2));
		int diaSaida = Integer.parseInt(saida.substring(0, 2));
		BigDecimal paxDecimal = getPaxDecimal(pax, APT);
		BigDecimal preco = new BigDecimal(getPrecoInicial());
		final BigDecimal ADD = new BigDecimal(getPessoaAlteracao());
		BigDecimal addT2 = new BigDecimal(0);
		if (APT == "T2"){
			addT2 = new BigDecimal(getPessoaAlteracao());
		}
		
		preco = preco.add((addT2.add(paxDecimal.multiply(ADD))));
		preco = preco.multiply(new BigDecimal(diaSaida-diaEntrada));
		
		return preco;
	}
}, MARÇO(30, 2.5, 5) {
	@Override
	public BigDecimal getPreco(int pax, String entrada, String saida, String APT) {
		return null;
	}
}, ABRIL(35, 2.5, 5) {
	@Override
	public BigDecimal getPreco(int pax, String entrada, String saida, String APT) {
		return null;
	}
}, MAIO(35, 2.5, 5) {
	@Override
	public BigDecimal getPreco(int pax, String entrada, String saida, String APT) {
		return null;
	}
}, JUNHO(2,2,2) {
	@Override
	public BigDecimal getPreco(int pax, String entrada, String saida, String APT) {
		return null;
	}
}, JULHO(37.5, 5,5) {//ALTERAR
	@Override
	public BigDecimal getPreco(int pax, String entrada, String saida, String APT) {
		return null;
	}
}, AGOSTO(2,2,2) {//ALTERAR
	@Override
	public BigDecimal getPreco(int pax, String entrada, String saida, String APT) {
		return null;
	}
}, SETEMBRO(2,2,2) {//ALTERAR
	@Override
	public BigDecimal getPreco(int pax, String entrada, String saida, String APT) {
		return null;
	}
}, OUTUBRO(35, 2.5, 5) {
	@Override
	public BigDecimal getPreco(int pax, String entrada, String saida, String APT) {
		return null;
	}
}, NOVEMBRO(30, 2.5, 5) {
	@Override
	public BigDecimal getPreco(int pax, String entrada, String saida, String APT) {
		return null;
	}
}, DEZEMBRO(30, 2.5, 5) {
	@Override
	public BigDecimal getPreco(int pax, String entrada, String saida, String APT) {
		return null;
	}
};

private double precoInicial;
private double pessoaAlteracao;
private double TAlteracao;

private Tarifas(double precoInicial, double pessoa, double alteracao) {
	this.precoInicial = precoInicial;
	this.pessoaAlteracao = pessoa;
	this.TAlteracao = alteracao;
}

public static int getMesNum(Tarifas mes){
	return mes.ordinal();
}

public static String getMes(int i){
	return Tarifas.values()[i].name();
}

public abstract BigDecimal getPreco(int pax, String entrada, String saida, String APT);

public static BigDecimal getPrecoMes(int mes, int pax, String entrada, String saida, String APT){
	int entradaMes = Integer.parseInt(entrada.substring(3,5));
	int saidaMes = Integer.parseInt(saida.substring(3,5));
	
	if (entradaMes == saidaMes){
		return Tarifas.values()[mes-1].getPreco(pax, entrada, saida, APT);
	}else{
		System.out.println("Dif");
		Calendar cal = Calendar.getInstance();
		int diaMax = cal.getActualMaximum(entradaMes);
		saida = diaMax + "/" + entradaMes + "/" + entrada.substring(6,10);
		BigDecimal preco1 = Tarifas.values()[mes-1].getPreco(pax, entrada, saida, APT);
		
		entrada = 1 + "/" + saidaMes + "/" + entrada.substring(6,10);
		BigDecimal preco2 = Tarifas.values()[mes-1].getPreco(pax, entrada, saida, APT);
		return preco1.add(preco2);
	}
}

private static BigDecimal getPaxDecimal(int pax, String apt) {
	if (apt == "T1"){
		if (pax < 2){
			pax = 2;
		}
	}else{
		if (pax < 4){
			pax = 4;
		}
	}
	
	pax -=1;
	
	BigDecimal paxDecimal = new BigDecimal(pax);
	return paxDecimal;
}

//GETTERS AND SETTERS

}

PS: O metodo getPrecoMes é provisorio

9 Respostas

S

Oi vc pode utilizar o padrão strategy que consiste em criar uma interface e retornar uma implementação para cada enum.
Ex:

public interface PrecoMes{
    public BigDecimal getPreco(int pax, String entrada, String saida, String APT);
}

No enum vc faz:

public enum Tarifas {
    
     JANEIRO(30, 2.5, 5) {
@Override
public PrecoMes getPreco(){
          return new PrecoJaneiro();//Implementação para janeiro, class concreta.
}
}
}
M

Não entendi muito bem. Vou ter que criar uma classe concreta que implemente a interface PrecoMes para todos os meses?

J

Não use enum. Crie uma classe com os atributos necessários e 1 método.

Não sei em que material de estudo está se baseando pra fazer dessa forma, mas aconselho seguir a apostila da caelum de java e orientacao a objetos.

M

Estou me baseando nos meus poucos conhecimentos… Não estou vendo como fazer isto em uma classe sem usar um monte de ifs, pode dar um exemplo por favor?

J

Qual monte de ifs? Seja mais específico.

M

Penso que vou ter que fazer um if para cada enum

J

Mas o que faz esse if? Dê pelo menos dois exemplos.

M

Ah já entendi o que você queria dizer, Obrigado!

S

Oi, Fiz um video sitando sua duvida e esplicando sobre o padrão strategy.
Nesse link:

Criado 11 de julho de 2018
Ultima resposta 12 de jul. de 2018
Respostas 9
Participantes 3