Вопрос по java – Чрезмерное использование операторов If else

0

У меня есть один запрос, который я использовал метод, но есть много раз, когда я использовал Если Иначе .. не становится очень неоднозначным, пожалуйста, посоветуйте, могу ли я использовать какой-то другой условный цикл также ... ниже мой код ..

 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;
    }

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

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

Ваш Ответ

4   ответа
6

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

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

Если это тип int или другой тип, отличный от enum, вы можете использовать переключатель, как уже предлагалось, или рассмотреть возможность переключения (ха-ха) на enum. Вы также можете сделатьPosHelper.isRunningAsService() логический параметр для этих методов иall your if/else code would be reduced to 3 or 4 lines Кажется (хотя это введет некоторую связь, но у вас, кажется, уже есть много).

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

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

3

Использоватьswitch утверждение вместо.

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

// ...

default:
    // default blah
    break;
}
@ user1406575: должно работать.
Что не обязательно поможет, потому что некоторые из них имеют несколько условий для проверки.
@ oli..Просто проверьте случай 2 У меня также есть или условие ... еще если ((cardType == PSC_CARD_TYPE) & amp; & ((! PosHelper.isRunningAsService ()))) { user1406575
@ X-Zero: правда. Но они могут быть вложены в отдельные случаи. Так что это поможет в том смысле, что это значительно уменьшает многословность кода.
@ Oli.. здесь тип карты байтовый будет работать, заранее спасибо user1406575

Похожие вопросы