0

メソッドを使用したクエリが 1 つありますが、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が使用されているn個のものがたくさんあるので、他の条件文で上記のロジックを改善する方法を教えてください..!!

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 に答える