0

我有一个查询是我使用了一种方法,但是我使用过很多次 If Else ..not 它变得非常模棱两可,请告知我是否也可以使用其他一些条件循环..下面是我的代码..

 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 ..!!

4

4 回答 4

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;
        }
    }
于 2012-05-23T16:58:35.850 回答
3

改为使用switch语句。

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

// ...

default:
    // default blah
    break;
}
于 2012-05-23T16:56:16.787 回答
1

你有一些选择:模式策略、多态性或事件来避免过多的 ifs/else

在您的示例中,业务逻辑可能接近用户界面。您可以使用 MVC 概念将逻辑与表示分离并减少 if/else(如果可能)。

于 2012-05-23T17:01:40.110 回答
0

如果您不喜欢向assyliasCardType建议的那样添加方法,您可以创建一个“Action”枚举并将方法添加到该枚举并使用Map

于 2012-05-23T17:20:10.753 回答