Como utilizar menos ifs?

7 respostas
V

Gente tem alguma forma de testar o valor do salário e a idade da pessoa sem usar tantos ifss, como fiz abaixo. É que o prof, pediu para modularizar mais e utilizar menos if. Desenvolvi como está abaixo, mas tem muito if, acho que ele vai reclamar :frowning: , alguém tem alguma sugestão?

Tipo assim:

public double getClassificacaoEtaria( char sexo )
	{
		double[] limitePorcentagem = null;
		int[] limiteIdade = null;
	  	
		if (sexo == 'F') 
			limiteIdade = IDADE_MULHER; 
		else if( sexo == 'M' )
			limiteIdade = IDADE_HOMEM ;
	  	
		  if( sexo == 'M')
		  {
			  if( idadeUI <= 35 )
			  {
				  if ( salarioUI <= 5000 )
					  limitePorcentagem = PORCENTAGEM_EMPRESTIMO_HOMEM_SALARIO_MENOR;
				  else if ( salarioUI > 5000 && salarioUI <= 10000 ) 
					  limitePorcentagem = PORCENTAGEM_EMPRESTIMO_HOMEM_SALARIO_MAIOR;
			  }
			  else if( idadeUI >= 36 && idadeUI <= 45 )
			  {
				  if( salarioUI <= 6000)
					  limitePorcentagem = PORCENTAGEM_EMPRESTIMO_HOMEM_SALARIO_MENOR;
				  else if( salarioUI > 6000 && salarioUI <= 10000 )
					  limitePorcentagem = PORCENTAGEM_EMPRESTIMO_HOMEM_SALARIO_MAIOR;
			  }
			  else if( idadeUI >= 46 && idadeUI <= 56 )
			  {
				  if( salarioUI <= 10000 )
					 limitePorcentagem = PORCENTAGEM_EMPRESTIMO_HOMEM_SALARIO_MAIOR;
			  }
		  }
		  else if( salarioUI <= 10000 )
		  {
			  limitePorcentagem = PORCENTAGEM_EMPRESTIMO_MULHER;
		  }	
		  
		  return getCalculaEmprestimo( limiteIdade, limitePorcentagem );
	  }

public double getCalculaEmprestimo( int[] idade, double[] porcentagem )
	  {
		  try
		  {
			  double valorEmprestimo = 0.0;
		  	
			  if ( idadeUI < MENOR_IDADE )
			  {
				  return 0;
			  }
			  else
			  {
				  for( int i = 0; i < idade.length; i++ )
				  {
					  if( idadeUI <= idade[i] )
					  {
						  valorEmprestimo = salarioUI * porcentagem[i];
						  return valorEmprestimo ;
					  }
				  }
		  		}
		  }
		  catch( Exception e)
		  {
			  e.getMessage();
		  }
	  	
	  		return 0;
	  }

7 Respostas

sergiolopes

Tem um post recente no Blog da Caelum que aborda a questão do excesso de IFs:

Andre_Rosa

Na definição de sexo, você poderia usar o Case. Por exemplo:

switch(sexo){ case 'F': limiteIdade = IDADE_MULHER; break; case 'M': limiteIdade = IDADE_HOMEM ; break; default: /* Sexo inválido */ break; }

E eu não entendi o porque de você usar dois IFs para verificar se o valor da variável sexo é ‘M’. Você poderia colocar tudo no bloco do case.

L

Boa noite!

Sugiro que vc poste o exercicio para agente dar uma olhada…

Seu codigo esta um tanto quanto confuso, e parece q tem muita coisa redundante ai…

[]'s

Anime

Oi,

Se usar operadores lógicos, diminui a quantidade de if…

ftorres

Percebi também que no seu código tem 2 ifs com a mesma condição. Exemplo:.

if( sexo == 'M' )  
            limiteIdade = IDADE_HOMEM ;  
          
          if( sexo == 'M')
InSeOfKn

Ola!
Da de economizar em alguns pontos, os que identifiquei então na lista abaixo

1º: Da de utilizar um switch como o Andre Rosa falou
2º: Da de mover o código do segundo if com a condição sexo == ‘M’ para o switch
3º: No else if(idadeUI >= 46 && idadeUI <= 56) da de remover o if interno adicionando a condição do mesmo no externo
4º: É desnecessário o bloco else do método getCalculaEmprestimo já que se entrar no if o return vai interromper a execução do método

Até!

A

Apesar do post no blog já ter bastante informação relevante, acho que posso dar uma dica que se aplique ao seu código.

Pelo que entendi, sua lógica está tentando representar o comportamento de uma tabela.
Para cada combinação sexo por intervalo de idade, você tem um valor de porcentagem, certo?

Crie uma estrutura que represente sua tabela e aplique as regras de forma genérica para esta tabela.
(Basicamente seria procurar a “linha” com o sexo e o intervalo de idade correto).

Criado 10 de maio de 2011
Ultima resposta 10 de mai. de 2011
Respostas 7
Participantes 8