过度使用If else语句

时间:2012-05-23 16:55:01

标签: java

我有一个查询,我已经使用了一个方法,但有很多时候我已经使用了If Else ..不会变得非常模糊,请指教我可以使用其他一些条件循环..下面是我的代码.. < / p>

 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 个答案:

答案 0 :(得分:6)

如果cardType是枚举,您可以为枚举添加方法,(例如getNamegetWag等)并调用它:

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

如果是int或其他非枚举类型,您可以使用已经提出的开关,或者考虑将(haha)切换为枚举。你也可以使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 :(得分:3)

改为使用switch语句。

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

// ...

default:
    // default blah
    break;
}

答案 2 :(得分:1)

你有一些选择:模式策略,多态或事件,以避免过多ifs / else

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

答案 3 :(得分:0)

如果您不希望将方法添加到CardType建议的assylias,则可以创建“操作”枚举并将方法添加到该方法并使用{{1} }