6

戦略パターンが実際に何であるかについて誰かとオタクの戦いがあり、問題を解決するには専門家が必要です.

同じインターフェースを維持しながら、実行時にクラスの中身 (動作など) を交換できるストラテジー パターンについては、両者とも同意しています。しかし、彼女の主張は、「[アルゴリズム] が戦略であるためには、同じ結果が得られなければならない」というものです。私の主張は、クラスの「アルゴリズム」またはロジックを交換すると、オーバーライドされた操作の結果が異なることを意味する可能性がありますが、それでも戦略パターンの目的、意図 (および分類) を満たしているということです。

コメント付きの彼女のコード例:


あなたの定義によれば、クラスのサブクラスは戦略になります。これらは同じメソッド定義 (シグネチャ) を持っているため、交換可能です。

Interface Strategy
{
    DoArithmatic(int[] a)
}

Class A : Strategy
public int DoArithmatic(int[]a)
{
     int temp = 0;
     for(int i =0; i< a.length; i++)
          temp += a[i]
}

Class B : Strategy
public int DoArithmaticB(int[]a)
{
     int temp = 0;
     for(int i =a.length -1; i>-1; i--)
          temp += a[i]
}

Class C : Strategy
public int DoArithmatic(int[]a)
{
     int temp = 0;
     for(int i =0; i< a.length; i++)
          temp -= a;
}

int[] a = { 1,2,3 }
ClassA.DoArithmatic(a) = 6
ClassB.DoArithmatic(a) = 6
ClassC.DoArithmatic(a) = -6//This one is not interchangeable

最初の 2 つは戦略です。どんな入力に対しても、彼らはあなたに正確に同じ答えを与えるからです。最後のものはそうではありません。int が得られるからといって、それが戦略になるわけではありません。彼らは同じことを「行う」必要があります。

それらを戦略にするためだけに「より高い」抽象化用語を使用することはできません。

これらはすべて「数学」を行いますが、すべて「同じ」ことを異なる方法で行っているわけではありません。それが戦略の本質です。

それで、誰が正しいですか?

4

9 に答える 9

11

あなたは正しく、あなたの同僚は GoF を読む必要があります。

「戦略パターンにより、アルゴリズムを使用するクライアントとは独立してアルゴリズムを変えることができます。」

見る:

http://www.dofactory.com/Patterns/PatternStrategy.aspx

于 2009-03-26T13:42:38.640 に答える
6

技術的には、戦略は彼らが望むことを何でもすることができます。

「外部コンテキスト」が、プログラムインターフェイスでキャプチャできない固定された反復可能な動作(「望ましいプロパティ」と呼びます)を指示する場合にのみ、戦略がリスコフの原則で真に代替可能であることに注意する必要があります。これらの望ましい特性。

于 2009-03-26T13:54:15.087 に答える
4

私はあなたの意見を支持します。異なる戦略は、同じコンテキストで使用できる限り、非常に異なることを行うことができます。

たとえば、ツリーの各ノードにアクセスする場合、有効な戦略は次のようになります。

  • 深さ優先検索の予約注文
  • DFSポストオーダー
  • BFS
  • ランダム化された
  • ...

すべての戦略は異なる順序でノードにアクセスしますが、目的 (各ノードにアクセスすること) は同じです。したがって、順序が重要でない場合は、どちらの戦略もニーズに合っています。

于 2009-03-26T13:45:07.340 に答える
3

FWIW、ウィキペディアの記事はあなたに同意し、彼女の立場について聞いたことがありません。

于 2009-03-26T13:54:09.283 に答える
3

最初の 2 つは戦略です。どんな入力に対しても、彼らはあなたに正確に同じ答えを与えるからです。最後のものはそうではありません。それがあなたにintを与えるという理由だけで、それは戦略にはなりません。彼らは同じことを「行う」必要があります。

同じことをしなければなりませんが、まったく同じ結果が得られるわけではありません。GoF からの動機付けの例は、さまざまなレイアウト アルゴリズム、またはさまざまなレジスタ割り当てアルゴリズムの 1 つです。これらの戦略には同じ目標 (ページ上にテキストと画像のブロックをレイアウトする、またはハードウェア レジスタに仮想レジスタを割り当てる) がありますが、まったく同じ結果を作成する必要はありません。

したがって、Strategyあなたの例の目標が入力で算術を行うことである場合、各例はその目標のための戦略です。目標が渡された配列を合計することであった場合、DoArithmaticが呼び出され、最後の例は戦略のコントラクトに準拠していないため、 LSPCalculateSumに違反します。

于 2009-03-26T14:01:34.320 に答える
2

戦略が決定論的に同一でなければならないかどうかという問題は、戦略パターンの定義の範囲外であると言った方が正しいと思います。

関数が特定の入力に対して常に同じ結果を返す場合、それは決定論的です。2つの関数が決定論的であり、同じ入力に対して常に同じ値を返す場合、それらは決定論的に同等です。それらは同じ副作用を持っているかもしれませんし、持っていないかもしれません。もしそうなら、それらは単に同等です。

通常、これは当てはまりません。決定論的同等性を必要とすると思われる例を考えてみましょう:ソート​​。2つの比較子の実装が同じ入力に対して同じ結果を返さない場合は、少なくとも1つに障害があるはずですが、必ずしもそうとは限りません。

並べ替え順序は国によって異なります。一部の場所では、アクセントに影響されないように並べ替えられます。McDuckをMacDuckと一緒に置く人もいます。これらは戦略であり、これは戦略パターンの完璧なアプリケーションであり、戦略は決定論的に同等ではないことは間違いありません。

あなたが勝ちます。

于 2009-03-26T14:29:07.403 に答える
2

「ヘッドファーストデザインパターン」(こちらを参照)によると24ページ

「ストラテジーパターンは、アルゴリズムのファミリーを定義し、
それぞれをカプセル化し、それらを交換可能にします。ストラテジーにより、アルゴリズムは 、それを使用するクライアントと
は独立して変化します。」

少なくともパターンを定義した人々によれば、あなたは正しいのですが、彼らは何を知っていますか。

于 2009-03-26T13:53:38.770 に答える
2

あなたは。戦略のポイントは、アルゴリズムを置き換えることです。それらが同じ結果をもたらすかどうかは、望ましい動作の副産物です。

于 2009-03-26T13:55:06.223 に答える
0

私も同意する必要があります。良い例は、価格計算機戦略です。アイテムの数量、顧客のタイプ、配送先などのいくつかの変数に応じて、請求書の最終的な金額を計算するためのさまざまな戦略を立てることができます。これらの戦略はそれぞれ異なる結果を返すことが確実に期待され、それでも考慮されます。戦略パターン。

于 2009-03-26T13:46:05.183 に答える