私は、タイプに基づいて1回または複数回(ループで)実行する必要のあるロジックを持っています。戦略パターンはここで理にかなっていますか?本質的には、これにはどのデザインパターンを使用しますか?
答えて
通常、戦略パターンはアルゴリズムのファミリを定義し、それぞれをカプセル化し、それらを交換可能にします。ストラテジーは、アルゴリズムを使用するクライアントとは独立してアルゴリズムを変えることができます。
私は価値があなたがProcessReportの振る舞いをカプセル化したい場合は自分でIProcessReport.Process(userId)
を呼び出すことができますように、私はこの振る舞いを表すインターフェイスを作成し、抽象化
の別の層を追加している任意の複雑なアルゴリズムが表示されない
ループ
あなたのコードは、このように単純化することができます。もちろん、
if (type == 1)
SendFullReport();
else if (type == 2)
for (int i = 0; i < numUsers; i++)
GetReportFragment(userId);
は、あなたがSendFullReport()
とGetReportFragment(string userId)
メソッドを実装する必要があります。
複雑なデザインパターンをこの文脈で使用することには意味がありません。
type
変数のセマンティクスに応じて、多態性を使用すると意味があります。
オーバーヘッド(2つのブランチしかありません)がある場合、if() ... else if() ... else if() ...
またはswitch() { case: ... }
のような構造が表示されるたびに、いくつの条件付きブランチが存在するのでしょうか?将来新しいものが登場する可能性はありますか?
これらの質問の回答に応じて、Replace Conditional with Polymorphismリファクタリングを行うことがあります。
これは単なる例ですか、それとも実際のサイズですか?つまり、2つのタイプがある場合、使用するのに最適なパターンはそれを単純に保つことです。
複数のタイプがある場合は、その中で戦略を取るか、実行するコードを持つ辞書タイプの委任/コマンドを使用できます。
これは単なる例です。実際のコードはここに投稿するには大きすぎます – DotnetDude
Ok、タイプコマンドの辞書で十分でしょう。コマンドが単純すぎる場合は、デリゲートを使用できます。 – ivowiblo
異なる動作を区別するために「タイプコード」を使用しているので、replacing it with subclasses (polymorphism)から開始できます。これは通常、タイプコードベースの分岐があるときに行う最初の処理です。
しかし、簡単な問題では、これは過度の可能性があります。どのようなあなたのコードでより多くの不快なのは、次のとおりです。
- マジックナンバーあなたのタイプのためのの使用:あなたは、少なくとも特定を示すために空のパラメータ(
""
)を通過可読性 - を改善するために、列挙型にそれらを変更する必要がありますあなたが指定するIDを持っていない場合、少なくとも "完全なレポート"のための別個のメソッドを作成する
現在の機能の単純さにもかかわらず戦略パターンが正しい解決策であるように感じます。一般的に、私はif文を避け、自分のコードを霧化しようとします。 Grooのコード「臭い」の観察も私のものです。多態性(戦略)は過剰なものと思われるかもしれませんが、私はむしろ空である文字列パラメータや数値に基づいて関数の動作を変更しようとするよりも、やや抽象的な解決策になります。
- 1. これはFactoryデザインパターンを使用していますか? (Java)
- 2. コレクションの保存にはどのデザインパターンを使用しますか?
- 3. 私はここでどのデザインパターンを使うべきですか
- 4. この解析メカニズムで使用するデザインパターンはどれですか?
- 5. これはデザインパターンですか?
- 6. どのようなデザインパターンを使用していますか?
- 7. どのようなデザインパターンを使用しますか?
- 8. どのデザインパターンを使用しますか? (決済システムAPI)
- 9. これを行うにはどのデザインパターンが便利ですか?
- 10. これを行うにはどのデザインパターンが必要ですか?
- 11. このMVCですか?私はどのような「デザインパターン」を使用しましたか?
- 12. これにはどのUML図を使用しますか?
- 13. Springフレームワークではどのようなデザインパターンが使用されていますか?
- 14. これはどのようなデザインパターンですか?
- 15. このデザインでは、どのデザインパターンが正しいですか?
- 16. データベースへのインタフェース非同期サーバーで使用するデザインパターンはどれですか?
- 17. どのデザインパターンをループオーバーステップに使用する必要がありますか
- 18. このユースケースでは、どのデザインパターンを使用する必要がありますか?
- 19. ここでどのようなデザインパターンが提案されていますか?
- 20. AndroidのUIデザインパターンとは何ですか、HNewsが使用していますか?
- 21. Struts 1.xフレームワークで使用されたデザインパターンは何ですか?
- 22. アーキテクチャまたはデザインパターンはこのアプリケーションに適していますか?
- 23. APIのクライアントに使用するデザインパターンは何ですか?
- 24. 私のユースケースに使用するデザインパターンは何ですか?
- 25. 検証用に使用するデザインパターン
- 26. クラスに追加のプロパティを与えるために使用するデザインパターンはどれですか?
- 27. NLogを使用して$ {basedir}はどこにありますか?
- 28. NoSQLを使用する際にデザインパターンに役立つリソースはありますか?
- 29. Android Twilioこれらのサンプルクラスはどのように使用しますか?
- 30. これに最適なデザインパターンは何ですか?
私が間違っていないと、リポジトリパターンを使用した方がうまくいかないでしょうか?最初の一見でちょっと考えました。 – MethodMan
デザインパターンは問題に対する答えではありませんが、特定の問題に対する解決策です。だから賢明に使ってください。あなたの場合、私はパターンの理由を見ません。 – Zenwalker
コードスニペットが短すぎて、明確な提案ができません。デザインパターンについて言えば、問題の詳細を明らかにするために、問題、ワークフロー、行動を説明することがはるかに役立ちます。コード内の 'if/else'ステートメントは、すぐにデザインを変更する必要があるとは限りません。 – Groo