2012-04-23 22 views
-3

については、私は、私が開発したコードの下の部分を持っている...スイッチ条件文

public byte determineCardType(final IInput inputData) { 
    byte cardType = UNKNOWN_CARD; 
    try { 
     if (isWagRewardsLoyaltyCard(inputData)) 
      cardType = WAG_LOYALTY_CARD_TYPE; 
     else if (isDRCard(inputData)) //checking that card scanned and swiped is a DR Card 
      cardType = DR_CARD_TYPE;  
     else if (isWagRewardsPartnerCard(inputData)) 
      cardType = AARP_CARD_TYPE; 
     return cardType; 
    } catch (Exception e) { 
     return UNKNOWN_CARD; 
    } 
} 

私に助言してくださいはい、その後アドバイスしてください場合は、上記のコードは、スイッチのループで調整することができ、事前に感謝。

それにリンクされている他のコード...

if((aarpCardSupport.isAARPCard(input))||(determineCardType(input)==DR_CARD_TYPE)) { 
    return true; 
} else if((isDRCard(input))&&(isDRLoayltyEnabled())) { //would return 1 for DR card only when isDRLoayltyEnabled returns true 
    return true; 
}  
return false ; 
+0

先生はあなたに 'スイッチ'に切り替えるように頼んだのですか? ;) – adarshr

+0

'is * Card'メソッドのいくつかのコードを提供するべきです。 – Sirko

+0

if((aarpCardSupport。||(determineCardType(入力)== DR_CARD_TYPE)) { trueを返します。 } else if((isDRCard(input))&&(isDRLoayltyEnabled()))// isDRLoayltyEnabledがtrueを返す場合に限り、DRカードに1を返します。 { return true; } falseを返します。 } – dghtr

答えて

5

スイッチはあなたを助けにはなりませんが、条件式は、次のことができます。

return isWagRewardsLoyaltyCard(inputData) ? WAG_LOYALTY_CARD_TYPE 
    : isDRCard(inputData) ? DR_CARD_TYPE 
    : isWagRewardsPartnerCard(inputData) ? AARP_CARD_TYPE 
    : UNKNOWN_CARD; 

私は強くExceptionを引くに対してをお勧めします、btw。キャッチの具体的な例外タイプ - 必要があれば、私は少なくともそのエラーをログに戻す前にログを残すだろうが。

編集:コードの2枚については、それはあなただけで希望のようになります。determineCardType(input)isDRCard(input) trueを返しますが、謎があるDR_CARD_TYPE以外のものを返す理由が、

return aarpCardSupport.isAARPCard(input) 
    || determineCardType(input) == DR_CARD_TYPE 
    || (isDRCard(input) && isDRLoayltyEnabled); 

...

+0

驚くべき男は、三元演算子の形で条件を表現し、非常に感謝して、多くのおかげで、上記のコードは.. public byte decideCardType(final IInput inputData){ byte cardType = UNKNOWN_CARD; { 返信isWagRewardsLoyaltyCard(inputData)? WAG_LOYALTY_CARD_TYPE :isDRCard(inputData)? DR_CARD_TYPE :isWagRewardsPartnerCard(inputData)? AARP_CARD_TYPE :UNKNOWN_CARD; catch(例外e){ return UNKNOWN_CARD; } } } – dghtr

+0

+1、「例外」をキャッチすることを推奨します。 – Makoto

+0

@ user1344709:あなたの質問のコードに従って編集しました。コメントにまだもっと多くのコードを投稿した理由は明らかではありませんが、基本的にはそれが読めません。 –

1

しないでください。あなたがそれを行う必要がある場合、あなたはこのようにそれを行うことができます:

public byte determineCardType (final IInput inputData) { 
    byte cardType = UNKNOWN_CARD; 
    try { 
     switch (isWagRewardsLoyaltyCard (inputData) ? 1 : 
     (isDRCard (inputData) ? 2 : (isWagRewardsPartnerCard (inputData) ? 3 : 4))) 
     { 
      case 1: cardType = WAG_LOYALTY_CARD_TYPE; break; 
      case 2: cardType = DR_CARD_TYPE; break; 
      case 3: cardType = AARP_CARD_TYPE; break; 
      default: // UNKNOWN_CARD already default 
     } 
     return cardType; 
    } catch (CardException ce) { 
     return UNKNOWN_CARD; 
    } 
    } 
} 

しかし、あなたがバイトとしてCARDTYPEを返すために、あなたはタイプを設定した後、後で切り替えることができます。このコードはあなたのコードよりも読みにくいです。ジョンズコードは少なくともリーンです。

私はあなたがswitch文を初めて使ったことを知っています。だから私は少し精緻化します。

switch文は、入力がIntegral形式(int、byte、short、Enum)の場合に有用で、値のほとんどが短いリストと一致させることができます。

それ以外の場合は、if/else文のシーケンスを使用します。大文字小文字のステートメントは、相互排他的である必要はありませんが、大抵の場合、

あなたの場合、ブール値を返す3つのメソッドを呼び出すので、入力は整数ではありません。しかし、あなたの出力はです。

後のコードでは、あなたが書くことができる:

 byte cardType = determineCardType (inputDate); 
     switch (cardType) 
     { 
      case WAG_LOYALTY_CARD_TYPE: doWlct (foo, bar); break; 
      case DR_CARD_TYPE: doDct(); break; 
      case AARP_CARD_TYPE: doAct (baz); foobar(); break; 
      case UNKNOWN_CARD: System.err.println ("Unknown card"); 
     } 
エルス

をあなたが記述する必要があります:文字列以上のJava 1.7スイッチが同様に可能であるので

 if (cardType == WAG_LOYALTY_CARD_TYPE) 
      doWlct (foo, bar); 
     else if (cardType == DR_CARD_TYPE) 
      doDct(); 
     else if (cardType == AARP_CARD_TYPE) { 
      doAct (baz); 
      foobar(); 
     } 
     else ... 

が、それまでは、整数型を切り替えるだけで、ケースラベルは文字通り一定であり、コンパイル時に知られていなければなりません。

OOPでは、switch文は動的ディスパッチのために放棄されることがよくあります。

interface Card { 
    public abstract int authenticate(); 
} 

class WagLoyalityCard implements Card { 
    public int authenticate() { 
     doWlct (foo, bar); 
    } 
} 

class DrCard implements Card { 
    public int authenticate() { 
     doDct(); 
    } 
} 

// ... and so on 

Card card = new DrCard(); 
// authenticate: 
card.authenticate(); 

// depending on the card type, DrCard.authenticate() or 
// WagCard.authenticate() gets called. 
+0

ありがとう、これも動作します、ありがとうたくさんありがとう – dghtr

+0

@ userunknown..lase助言しかし、あなたがバイトとしてcardTypeを返すので、タイプを設定した後で後で切り替えることができます。掴む。 – dghtr

+0

@ user1344709:それをよりよく説明しようとしました。 –