2017-12-07 23 views
-3

以下のコードでは、月日(mtd)インジケータがtrueである場合、または前2営業日(btd)インジケータは真です。if/else文をパターンに置き換えてください

現在、別のインジケータが表示された場合、別のelse if文を含める必要があります。

私は、このコードの保守を容易にする方法はファクトリデザインパターンを使用することだと読んだことがあります。しかし、パターンを実装するためにどのようなステップを取るべきかわかりません。

public static string GetBusDate(bool mtdIndicator, bool prev2BusDtInd) 
    { 
     string busDate = Helper.PreviousBusinessDate; 

     if (mtdIndicator) 
     { 
      busDate = Helper.FOMBusDt; 
     } 
     else if (prev2BusDtInd) 
     { 
      busDate = Helper.Previous2BusinessDate; 
     } 

     return busDate; 
    } 
+3

_パターンを実装するためにどのようなステップを取るべきかわかりません._最初に、どの工場パターンが適切であるかを調べてください。 –

+4

この時点では、ネストされた条件演算子を使用しています。私は特定のデザインパターンが必要であるとは確信していません。そして、工場パターンは関連性がないようです。 –

+2

オブジェクトの存続期間中にフォーマットが変更されない場合、ファクトリ・パターンは機能します。そのような場合は、[戦略パターン](https://en.wikipedia.org/wiki/Strategy_pattern)を使用します。しかし、この単純なケースでは、 'if' /' else if'チェーンに固執しています –

答えて

2

ファクトリパターン(ファクトリメソッド& &抽象ファクトリー)このパターンは唯一のカップルを作成することを強制されますので、ご使用のケースのために働くつもりはないされています。ここでは

コードです各ifステートメントのクラスとパターンは通常、消費するクライアントコードに抽象オブジェクトを返します(単純な文字列を返すので、あなたのケースではありません)。

シンプルファクトリ(デザインパターンではありません)は、条件付きロジックを1つのクラスに移動するだけなので、コードデザインが改善されないため、使用できません。

デザインパターンを使用すると、コードの複雑さが増し、柔軟性が損なわれます。

私は単純にif/else文を1行のコードで残しておきます。

return mtdIndicator ? Helper.FOMBusDt : 
     prev2BusDtInd ? Helper.Previous2BusinessDate : 
         Helper.PreviousBusinessDate; 

あなたは多型と条件文を交換したい場合は、試してみてください:

  • Chain of Responsibilityパターン
  • Strategyパターン
  • Decoratorパターン

...またはその他のパタ​​ーン(全体的なアーキテクチャに依存)

また、「尋ねないで尋ねる」に従って、ifを避けることができます。

  • あなたはそれが内部 コンテキスト/状態だについてあなたは、低レベルのコンポーネントを頼むべきではありませんタスクX
  • を行うには、低レベルのコンポーネントへの要求を送信する必要があります(あなたがisStateXOk():Booleanのような機能を避けていることを行う)

ヒント:3から10+のクラスを作成してを作成して短いif/elseステートメントを回避しないでください。ケースブランチごとにクラスを作成してスイッチを回避してください。

関連する問題