2012-05-23 2 views
0

У меня есть один запрос, который я использовал метод, но есть много времени, которое я использовал. Если Else ..не становится очень неоднозначным, пожалуйста, советую использовать некоторые другие условные петли. мой код ..Чрезмерное использование операторов If else

if (cardType == AARP_CARD_TYPE) { 
     userResponse = messageBox.showMessage("CandidateAARPCardAttachCardToExistingTransaction", 
      null, IMessageBox.YESNO); // MSG:31.59 
     transaction.setValue(ITransactionHashtableWag.LOYALTY_MESSAGE_DISPLAYED, 
      WalgreensRewardsConstants.ATTACH_CANDIDATE_AARP_CARD); 
    } else if ((cardType == PSC_CARD_TYPE) && ((!PosHelper.isRunningAsService()))) { 
     userResponse = messageBox.showMessage("PendingPSCCardAttachCardToExistingTransaction", null, 
      IMessageBox.YESNO); // MSG:31.60 
     transaction.setValue(ITransactionHashtableWag.LOYALTY_MESSAGE_DISPLAYED, 
      WalgreensRewardsConstants.ATTACH_PENDING_PSC_CARD); 

    } else if ((cardType == DR_CARD_TYPE) && ((!PosHelper.isRunningAsService()))) { 
     userResponse = messageBox.showMessage("PendingDRCardAttachCardToExistingTransaction", null, 
      IMessageBox.YESNO); // MSG:31.63 
     transaction.setValue(ITransactionHashtableWag.LOYALTY_MESSAGE_DISPLAYED, 
      WalgreensRewardsConstants.ATTACH_PENDING_DR_CARD); 

    } else if ((cardType == WAG_LOYALTY_CARD_TYPE)){ 
       transaction.setValue(ITransactionHashtableWag.LOYALTY_MESSAGE_DISPLAYED, 
        WalgreensRewardsConstants.ATTACH_NOT_ON_FILE); 

      if((!PosHelper.isRunningAsService())) { 
     userResponse = messageBox.showMessage("CardNotOnFileToAttach", null, IMessageBox.YESNO); // MSG:31.32 
     // BUC 
     // 1.22.1 
    } 


    } else { // If the device is neither of these, POS displays Message 1 
     // Button, MSG 31.14. [BUC 
     // 1.23.2] 
     displayMessage("InvalidLoyaltyCard"); 
     transaction.setValue(ITransactionHashtableWag.LOYALTY_MESSAGE_DISPLAYED, 
      NOT_VALID_LOYALTY_CARD); 
     userResponse = -1; 
    } 

Пожалуйста, посоветуйте, как я могу улучшить свою логику выше с некоторыми другими условными выражениями, поскольку есть много п много If Else используются .. !!

+0

Вы, кажется, предпочитают 'переключатель 'альтернативный - это ваш звонок. Но поскольку вы находитесь в режиме рефакторинга, имеет смысл рассмотреть вопрос о том, является ли текущий шаблон использования байт-констант наиболее эффективным - если у вас нет контроля над той частью кода, которая определяет эти константы. – assylias

ответ

3

Вместо этого используйте инструкцию switch.

switch (cardType) { 
case AARP_CARD_TYPE: 
    // blah 
    break; 
case PSC_CARD_TYPE: 
    // blah 
    break; 

// ... 

default: 
    // default blah 
    break; 
} 
+1

Это не обязательно поможет, потому что некоторые из них имеют несколько условий для проверки. –

+0

@ X-Zero: True. Но они могут быть вложены в отдельные случаи. Таким образом, это поможет в том смысле, что это значительно сократит многословие кода. –

+0

@ Oli .. там тип карты байт будет работать, спасибо заранее – user1406575

6

Если cardType этого перечисления, вы можете добавить методы к вашему перечислимому, (скажет getName, getWag и т.д.) и назовете его:

userResponse = messageBox.showMessage(cardType.getMessage(), ... 
transaction.setValue(cardType.getWag(), cardType.getRewards()); 

Если это INT или другим, не перечисление тип, вы можете использовать переключатель, как уже было предложено, или рассмотреть возможность переключения (ха-ха) на перечисление. Вы также можете сделать PosHelper.isRunningAsService() логическим параметром для этих методов и все ваши коды if/else будут уменьшены до 3 или 4 строк. кажется (хотя в нем будет какая-то связь, но у вас ее уже много).

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

public enum CardType { 
    AARP_CARD_TYPE { 
     public String getName() { 
      return "CandidateAARPCardAttachCardToExistingTransaction"; 
     } 
    }, 
    PSC_CARD_TYPE { 
     public String getName() { 
      return "PendingPSCCardAttachCardToExistingTransaction"; 
     } 
    }; 

    public abstract String getName(); 
} 

Или более компактным, если вы не требует сложной логики в методах:

public static enum CardType { 
     AARP_CARD_TYPE("CandidateAARPCardAttachCardToExistingTransaction"), 
     PSC_CARD_TYPE ("PendingPSCCardAttachCardToExistingTransaction"); 

     private final String transactionName; 

     CardType(String transactionName) { 
      this.transactionName = transactionName; 
     } 

     public String getName() { 
      return transactionName; 
     } 
    } 
1

У вас есть несколько вариантов: стратегия шаблонов, полиморфизм или события, чтобы избежать слишком много ifs/else

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

0

Если вам не нравится добавлять методы CardType, как assylias предложил, вы можете создать перечисление «Действие» и добавить метод (ы) в том, что один и использовать Map

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