2015-10-26 2 views
-2

У меня есть серия из 8 «нокаутов», если заявления, которые должны пройти, чтобы показать соответствующий ответ. Если какой-либо из этих 8-ти утверждений не выполнен, отображается соответствующий ответ. Ниже мой код ...Java Вложенные If/Else Условные

if (ageCustInt >= ageMinComp1Int && ageCustInt <= ageMaxComp1Int){ 
      if(adtV1MileageCustInt >= adtVMileageMinComp1Int && adtV2MileageCustInt >= adtVMileageMinComp1Int && adtV3MileageCustInt >= adtVMileageMinComp1Int && 
       adtV1MileageCustInt <= adtVMileageMaxComp1Int && adtV2MileageCustInt <= adtVMileageMaxComp1Int && adtV3MileageCustInt <= adtVMileageMaxComp1Int) 
       if(totalViolationsCustInt >= totalViolationsMinComp1Int && totalViolationsCustInt <= totalViolationsMaxComp1Int) 
        if(totalAdtDriversCustInt >= adtDriversMinComp1Int && totalAdtDriversCustInt <= adtDriversMaxComp1Int) 
         if(bodilyInjuryCust.equals(bodilyInjuryComp1)) 
          if(propDamageCust.equals(propDamageComp1)) 
           if(currentInsur.equals(presInsurKOComp1) || presInsurKOComp1.equals("Both")) 
            if(unUiBodilyCust.equals(unUiBodilyComp1)) 
            { 
            btnComp1.setVisible(true); 
            lblPriceComp1.setText("$ " + price1String); 
            lblPriceComp1.setVisible(true); 
            } 
     } else 
     { 
      lblPriceComp1.setText("Not Competitive"); 
     } 

Я получаю в основном правильные результаты, но каждый сейчас, а затем соответствующий «не конкурентоспособны» результат от блока еще не отображается, как это должно быть. Мое предположение заключается в том, что оператор else применяется только к самому первому оператору if, а если он передан, то блок else не выполняется. Мне нужно структурировать мои операторы if, чтобы, если ЛЮБЫЕ из операторов if не выполняются, блок else будет выполняться. Я пробовал реструктурировать свои блоки без успеха. Есть идеи?

+4

Идея: не использовать так много вложенных IF ... – Andremoniy

+2

Вместо того, чтобы вложить столько, если бы вы могли объединить все условия вместе с операторами (&&). –

+1

Вытащите _все_ эти условия в одну функцию, скованную вместе с '&&'. Используйте один маленький, если. –

ответ

2

Как было предложено другими, используйте Если сцепление концепции, используя &&, слияния все условия в один, если блок

Простейшее может быть ниже.

boolean isValid = false; 

    if (ageCustInt >= ageMinComp1Int && ageCustInt <= ageMaxComp1Int){ 
       if(adtV1MileageCustInt >= adtVMileageMinComp1Int && adtV2MileageCustInt >= adtVMileageMinComp1Int && adtV3MileageCustInt >= adtVMileageMinComp1Int && 
        adtV1MileageCustInt <= adtVMileageMaxComp1Int && adtV2MileageCustInt <= adtVMileageMaxComp1Int && adtV3MileageCustInt <= adtVMileageMaxComp1Int) 
        if(totalViolationsCustInt >= totalViolationsMinComp1Int && totalViolationsCustInt <= totalViolationsMaxComp1Int) 
         if(totalAdtDriversCustInt >= adtDriversMinComp1Int && totalAdtDriversCustInt <= adtDriversMaxComp1Int) 
          if(bodilyInjuryCust.equals(bodilyInjuryComp1)) 
           if(propDamageCust.equals(propDamageComp1)) 
            if(currentInsur.equals(presInsurKOComp1) || presInsurKOComp1.equals("Both")) 
             if(unUiBodilyCust.equals(unUiBodilyComp1)) 
             { 
             btnComp1.setVisible(true); 
             lblPriceComp1.setText("$ " + price1String); 
             lblPriceComp1.setVisible(true); 
             } 
           isValid = true; 
      } 

// позже проверьте значение переменной, если оно не верно, означает, что оно не было введено ни в одной инструкции if.

if(!isValid){ 
    lblPriceComp1.setText("Not Competitive"); 
} 
+0

OP должен помнить, что код должен быть переведен на следующую строку в соответствующее время. – Sweeper

+0

Да, объявите флаг, чтобы проверить условие - это правильное решение. Я согласен с этим. –

+0

Условия @Sweeper могут быть объединены, но это просто альтернатива существующему коду OP. –

1

Один из способов улучшить читаемость и решить цитируемую проблему будет путем извлечения индивидуальных условий, указанных Вами в методах (таким образом, давая им название, что они делают)
и называя их, используя цепь, как другие уже высказались.

private boolean checkAgeLimits(int ageCustInt){ 
return (ageCustInt >= ageMinComp1Int) && (ageCustInt <= ageMaxComp1Int); 
} 
private boolean checkAdtV1MileageCustInt(int adtV1MileageCustInt){ 
... 
} 
... 
other validator methods 
... 
if (checkAgeLimits(ageCustInt) 
    && checkAdtV1MileageCustInt(adtV1MileageCustInt) 
    && .. other validators){ 
             btnComp1.setVisible(true); 
             lblPriceComp1.setText("$ " + price1String); 
             lblPriceComp1.setVisible(true); 

      } else 
      { 
       lblPriceComp1.setText("Not Competitive"); 
      } 
0

С уровня сложности технически вы никогда не должны опускаться более чем на 3 уровня относительно условных операторов или обработчиков исключений. Если вы приступите к этому моменту, лучшим целевым маршрутом будет разделить код и сформировать его собственный метод. Таким образом, вы можете более логично разделить и преодолеть свою логику, не усложняя свою жизнь (или разработчик, занимающий код).

пример, основанный на программном коде может быть следующим (я не создавать экземпляры объектов, так что вам придется сделать самостоятельно):

/** 
* Add comment on the purpose of this method 
*/ 
public void someMethod() { 
    boolean isValid = false; 
    if (ageCustInt >= ageMinComp1Int) { 
     isValid = checkPointOne(); 
    } 

    if(!isValid){ 
     lblPriceComp1.setText("Not Competitive"); 
    } 
} 

/** 
* Add comment on the purpose of this method 
* @return 
*/ 
public boolean checkPointOne() { 
    if (ageCustInt >= ageMinComp1Int && ageCustInt <= ageMaxComp1Int) { 

     if (adtV1MileageCustInt >= adtVMileageMinComp1Int 
       && adtV2MileageCustInt >= adtVMileageMinComp1Int 
       && adtV3MileageCustInt >= adtVMileageMinComp1Int 
       && adtV1MileageCustInt <= adtVMileageMaxComp1Int 
       && adtV2MileageCustInt <= adtVMileageMaxComp1Int 
       && adtV3MileageCustInt <= adtVMileageMaxComp1Int) { 
      return checkPointTwo(); 
     } 
    } 
    return false; 
} 

/** 
* Add comment on the purpose of this method 
* @return 
*/ 
public boolean checkPointTwo() { 
    if (totalViolationsCustInt >= totalViolationsMinComp1Int && totalViolationsCustInt <= totalViolationsMaxComp1Int) { 

     if (totalAdtDriversCustInt >= adtDriversMinComp1Int && totalAdtDriversCustInt <= adtDriversMaxComp1Int) { 
      return checkPointThree(); 
     } 
    } 
    return false; 
} 

/** 
* Add comment on the purpose of this method 
* @return 
*/ 
public boolean checkPointThree() { 
    if (bodilyInjuryCust.equals(bodilyInjuryComp1)) { 
     if (propDamageCust.equals(propDamageComp1)) { 
      return checkPointFour(); 
     } 
    } 
    return false; 
} 

/** 
* Add comment on the purpose of this method 
* @return 
*/ 
public boolean checkPointFour() { 
    if (currentInsur.equals(presInsurKOComp1) || presInsurKOComp1.equals("Both")) { 
     if (unUiBodilyCust.equals(unUiBodilyComp1)) { 
      activateForm(); 
      return true; 
     } 
    } 
    return false; 
} 

/** 
* This method will activate the form 
*/ 
public void activateForm() { 
    btnComp1.setVisible(true); 
    lblPriceComp1.setText("$ " + price1String); 
    lblPriceComp1.setVisible(true); 
} 

Надеемся, что это может помочь вам в фильтрации логика, которой вы не нуждаетесь, так как этот подход поможет вам в выборе лучшего кодирования и не наступит путь к кодированию ада. Удачи! :)

Смежные вопросы