[quote=lavreh]Salve, salve!
Estou iniciando no mundo dos objeto e, resolvendo uma lista de exercícios,
[/quote]
O interessante é que vc não usou objetos.
Vamos traduzir isto em objetos:
Foi pedido que se calcule o IMC corporal de um indivíduo. Há uma tabela com faixas predefinidas e distintas para homens e mulheres.
então vamos começar com IMC
O IMC é um numero, mas no seu cado vc quer a classificação. Isto pede um enum
public enum ICMClassification {
ABAIXO_PESO,
PESO_IDEAL,
UM_POUCO_ACIMA,
ACIMA_PESO,
OBESO;
}
agora “tabela de faixas”
public class Faixa {
private double menor;
private double maior;
public Faixa (double menor, double maior, ICMClassification classification){
this.menor = menor;
this.maior = maior;
this.classification = classification;
}
public ICMClassification getClassification(){
return classification;
}
public boolean contains(double value){
return value >= menor || value <= maior;
}
}
// tabela de faixas
public class Tabela {
private List<Faixa> faixas = new ArrayList<Faixa>();
public void addFaixa(Faixa faixa){
this.faixas.add(faixa);
}
public ICMClassification getClassificacao(double icm){
for (Faixa faixa : faixas){
if (faixa.contains(icm)){
return faixa.getClassification();
}
}
// se chegou aqui nenhuma faixa foi escolhida, o que é um erro
throw new IllegalArgumentException(icm + " não está em nenhuma faixa" );
}
}
Agora precisamos de um objeto que racterize o sujeito
public enum Genero {
FEMENINO,
MASCULINO
}
public class Sujeito {
private Genero genero;
private double icm;
public Sujeito ( Genero genero , double icm){
this.genero = genero;
this.icm = icm;
}
public Genero getGenero (){
return genero;
}
public double getICM (){
return icm;
}
}
Agora juntamos tudo num ICMClassificationCalculator
public class ICMClassificationCalculator {
Map<Genero, Tabela > tabelas = new HashMap<Genero, Tabela>();
public ICMClassificationCalculator (){
// monta as tabelas com os valores
Tabela masculina = new Tabela();
masculina.addFaixa(new Faixa(0, 20.7, ABAIXO_PESO));
// etc. ..
tabela.put(Genero.MASCULINO, masculina);
// semelhante para a femenina
}
public ICMClassification calculateFor(Sujeito sujeito){
return tabelas.get(sujeito.getGenero()).getClassificacao(sujeito.getICM());
}
}
E usaria assim :
Sujeito sujeito = new Sujeito(Genero.MASCULINO, 23.8);
ICMClassificationCalculator calculator = new ICMClassificationCalculator ();
ICMClassification classificao = calulator.calculateFor(sujeito);
switch (classificao ){
case ABAIXO_PESO:
System.out.println("Abaixo do peso.");
break;
case PESO_IDEAL:
System.out.println("Peso ideal.");
break;
// etc..
}
Veja que vc só usa um if . O truque é estruturar o codigo para usar for e map e métodos boolenos como contains.
Este modelo é OO, é elegante e o desempenho usando ifs e for é depresável em relação à legibilidade e entendimento.
Usando enum vc se livra de usar Strings para opções (o que tornar o codigo POS - programação orientada a string) e permite um melhor entendimento.
Vc pode achar que é sobre-engenharia, mas apenas usamos o processo padrão. Analizar as entidades, trasnformá-las em classes e compor as responsabilidades.
Poderiamos agora simplificar algumas coisas, mas o objetivo aqui é vc entender o que é OO. usar ifs não é OO.