2012-05-23 79 views
0

我有一個是我用的方法,但有我用的if else很多時間..not它變得很曖昧,請告知我可以用一些其他的條件循環also..below一個查詢是我的代碼..過度使用如果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; 
    } 

請告知我怎麼能提高我其他一些條件語句上述邏輯有很多ň很多的。如果其他人在使用.. !!

+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:確實。但是這些可以嵌套在個案中。所以它將有助於在很大程度上減少代碼的冗長度。 –

+0

@ Oli..here卡類型是字節的將它的工作,在此先感謝 – user1406575

6

如果cardType是一個枚舉,你可以添加方法,以你的枚舉,(說getNamegetWag等),並將其命名爲:

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

如果你不喜歡添加方法CardTypeassylias建議,你可以創建一個「操作」枚舉和方法(S)添加到一個和使用Map