2009-03-26 10 views
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を与えるので、それを戦略にしません。彼らは同じことを "行う"必要があります。

「高い」抽象化用語を使用して戦略にすることはできません。

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

だから、誰が正しいですか?

答えて

11

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

"戦略パターンは、アルゴリズムを使用するクライアントから独立して変化させます。"

参照:

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

+1

それはアルゴリズムを変えることができますが、その結果は変わりますか?すなわち、それは実装を変えることができますが、インタフェースはどうですか?それが問題なのです。 –

+0

??その質問は具体的に述べました。「同じパターンのインターフェイスを維持しながら、ランタイムにスワップアウトされる戦略パターンによって、クラスパターン(つまり行動など)がスワップアウトされることに同意します」 –

+0

「クライアントとは独立して変化します。お互いの間で変わる(戦略対戦略)?それが問題です。 – eljenso

4

私はあなたの意見をサポートしています。異なる戦略は、同じ文脈で使用できる限り、非常に異なることを行うことができます。あなたは、ツリー内の各ノードを訪問したい場合は

例えば、有効な戦略は次のようになります。

  • 深さ優先探索プリオーダー
  • DFSポストオーダー
  • BFS
  • ランダム化
  • ...

すべての戦略はノードを訪問するsの順番は変わりませんが、目的(各ノードの訪問)は同じです。したがって、注文が問題でなければ、いずれの戦略もあなたのニーズに合っています。

0

私も同意する必要があります。良い例は、価格計算ツール戦略です。品目数、顧客のタイプ、出荷先などのいくつかの変数に応じて、請求書の最終金額を計算するためのさまざまな戦略を立てることができます。これらの戦略のそれぞれは、異なる結果を返すことが確かに予想されます。戦略パターン。

2

「ヘッド最初のデザインパターン」によると、(see here)24ページ

「Strategyパターンは、アルゴリズムのファミリーを定義する
は、それぞれをカプセル化し、それらを交換可能になります。
戦略アルゴリズムが独立して変化することができます"

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

3

FWIWの場合、Wikipedia articleはあなたと同意し、彼女の立場を聞いたことがありません。

6

技術的には、戦略は必要なものを技術的に行うことができます。

「外側のコンテキスト」は、プログラマティックインターフェイスでは捕捉できない固定された繰り返し可能な動作(「望ましいプロパティ」と呼ばれます)を指示し、戦略が真に代替可能であることに注意する必要があるこれらの望ましい特性に関してはリスコフ(Liskov)である。

2

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

3

最初の2つは戦略です。彼らはあなたにまったく同じ答えを与える任意の入力のためにBecuase。最後のものはありません。ちょうどそれがあなたにintを与えるので、それを戦略にしないでください。彼らは同じことを "行う"必要があります。

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

あなたの例のStrategyの目標がの入力との演算であれば、各例はその目標の戦略です。目的が成功した場合は、DoArithmaticCalculateSumと呼ばれ、最後の例は戦略の契約に準拠しないため、LSPに違反します。

2

戦略が決定論的に同一でなければならないかどうかの問題は、戦略パターンの定義の範囲外です。

関数が与えられた入力に対して常に同じ結果を返す場合、それは決定的です。 2つの関数が決定論的で、それらが常に同じ入力に対して同じ値を返す場合、それらは決定論的に同等です。彼らは同じ副作用を持っていてもいなくてもよい。彼らがそうするならば、それはまったく平等である。

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

並べ替え順は国によって異なります。いくつかの場所でアクセントを区別しています。マクダックとマクダックを置く者もいます。これらは戦略であり、これは戦略パターンの完璧な応用であり、戦略は確かにではなく、と決定的に同等です。

あなたが勝ちます。

関連する問題