2017-05-10 10 views
2
switch (customerPaymentInfo.getPtType()) { 
     case CASH: 
      test(); 
      otherMethod1(); 
      break; 
     case CARD: 
      test(); 
      otherMethod2(); 
      break; 
     default: 
      throw new IllegalArgumentException("Payment Type is Not Correct."); 
    } 

上記のコードでは、CASHまたはCARDの両方の場合に1つの共通の方法を実行しています。スイッチコードの共通コードのリファクタリング

それを単一の時間を使用するようにスイッチケース内の任意の可能性はありますか?私たちは、コードを書くことができるブロックの場合の場合のeaxmpleについては

以下のもの:これにアプローチする1つの方法は、今switch

switch (customerPaymentInfo.getPtType()) { 
    case CASH: 
    case CARD: 
     test(); 
     break; 
    default: 
     throw new IllegalArgumentException("Payment Type is Not Correct."); 
} 

switch (customerPaymentInfo.getPtType()) { 
    case CASH: 
     otherMethod1(); 
     break; 
    case CARD: 
     otherMethod2(); 
     break; 
    default: 
     throw new IllegalArgumentException("Payment Type is Not Correct."); 
} 

のカスケードプロパティを使用することです

if (customerPaymentInfo.getPtType().equals("CASH") || customerPaymentInfo.getPtType().equals("CARD")) { 
    test(); 
} 
+0

あなたは 'case cash 'として複数のケースを書くことができます:case card:do stuff;それがあなたが意味するものならば、しかし、それはあなたのユースケースにはまったく適合しません。 – khelwood

+0

'switch'の前に' test'を呼び出せますか? – bradimus

+0

機能を追加する予定がある場合は、これが大きくなり、別の問題が発生する可能性があります。より良いアプローチは、異なるケースを扱うためにいくつかの戦略パターンを使用することです... –

答えて

-1
case CASH: 
    case CARD: 
     test(); 
     if(customerPaymentInfo.getPtType().equals("CASH")) 
      otherMethod1(); 
     else 
      otherMethod2(); 
     break; 
0

ただし、switchステートメントには冗長性があります。あなたは(多くのそのような例を持っている場合、最後に

if (!customerPaymentInfo.getPtType().equals(CASH) || !customerPaymentInfo.getPtType().equals(CARD)) 
    throw new IllegalArgumentException("Payment Type is Not Correct."); 
test(); 
switch(customerPaymentInfo.getPtType()) { 
    //switch code 
} 

、Java8のみsoltion、彼らは共通があります

もう一つの方法は、switch文を行う、その後test()を実行し、IllegalArgumentExceptionの最初のチェックになりますコールと特定のコール)をグループ化することができます。特定の部分については、EnumsとFunctionsのマップを使用できます。

switch (customerPaymentInfo.getPtType()) { 
    case CASH: 
    case CARD: 
     test(); 
     functionMap.get(customerPaymentInfo.getPtType()).apply(holderOfOtherMethod); 
     break; 
    default: 
     throw new IllegalArgumentException("Payment Type is Not Correct."); 
} 
3

おそらく、これを別の角度から見るとよいでしょう。なぜスイッチはありますか? otherMethod1()otherMethod2()のように、支払方法に依存してさまざまな方法で同じことをしています。

IイメージothMethod1()は、processPaymentByCash()processPaymentByCard()のようになります。そして、実装の違いではなく、これらの支払タイプに対して異なるクラスによって処理されなければならない:

class PaymentCash extends Payment { 
    processPayment() { 
     test(); 
     // Code from othermethod1 
    } 
} 

class PaymentCard extends Payment { 
    processPayment() { 
     test(); 
     // Code from othermethod2 
    } 
} 

class PaymentWhatever extends Payment { 
    processPayment() { 
     throw new IllegalArgumentException("Payment Type is Not Correct."); 
    } 
} 

スイッチの上、単にこの1つのライナーに置き換えられます:今

customerPaymentInfo.getPtType().processPayment(); 

、あなたはまだ2を持っていますあなたのコードでtest()を呼び出しますが、これは本当にすべてがあなたのコードのより大きなコンテキストに依存しています。それはまた別の支払タイプのように見えます

ではなくenum値として実装する必要があります。

+0

クラスごとにスイッチケースを交換するのは良い考えです。しかし、もう少し明確にする必要があります。どの支払いクラスが構成されていますか? –

+0

詳細を記入してください。 –

+0

これは[デザインパターン](https://en.wikipedia.org/wiki/Software_design_pattern)です。それは[戦略パターン](https://en.wikipedia.org/wiki/Strategy_pattern)と呼ばれます。私が見つけたもう一つの例は[ここ](https://sourcemaking.com/refactoring/replace-conditional-with-polymorphism)です。 – Axel

関連する問題