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

2 に答える 2

5

Switch は役に立ちませんが、条件式は次のことができます。

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

ところで、キャッチしないことを強くお勧めします。必要に応じて特定のException例外タイプをキャッチします。ただし、その場合は、戻る前に少なくともエラーをログに記録します。

編集: コードの 2 番目の部分については、次のように表示されます。

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

determineCardType(input)true を返したときに DR_CARD_TYPE 以外を返す理由はisDRCard(input)謎ですが...

于 2012-04-23T15:57:58.523 に答える
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 を byte として返すため、タイプを設定した後で切り替えることができます。このコードは、あなたのコードよりも読みにくいです。Jons コードは少なくともリーンです。

ステートメントを切り替えるのは初めてだと思います。というわけで少し詳しく。

switch ステートメントは、入力が整数形式 (int、byte、short、Enum) であり、値のほとんどが中程度の短いリストと照合できる場合に便利です。

それ以外の場合は、一連の if/else ステートメントを使用します。Case ステートメントは相互に排他的である必要はありませんが、ほとんどの場合は排他的です。

あなたの場合、ブール値を返す 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");
      }

それ以外の場合は、次のように記述する必要があります。

      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 ...

Java 1.7以降、文字列の切り替えも可能ですが、それまでは整数型のみを切り替えることができ、大文字と小文字のラベルは文字通り定数であり、コンパイル時に認識されている必要があります.

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. 
于 2012-04-23T16:06:32.477 に答える