2012-05-23 55 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