私は、戦略パターンが本当に何であるかについて、誰かとオタクの戦いをしていました。問題を解決するには専門家が必要です。戦略デザインパターンの正確な定義は何ですか?
戦略パターンでは、同じインターフェースを維持しながら、ランタイムにスワップアウトされるようなクラス(例えば、行動)の勇気が戦略パターンによって許容されることに、両方とも同意します。しかし、彼女の主張は、 "[アルゴリズム]が戦略であるためには、同じ結果を得なければならない"ということです。私の論点は、クラスの「アルゴリズム」やロジックを交換すると、オーバーライドされた操作の結果が異なることを意味するが、ストラテジパターンの目的、意図(および分類)を満たしているということです。
コメントと彼女のコード例:あなたの定義により
、クラスの任意のサブクラスでは、戦略だろう。それらは同じメソッド定義(シグネチャ)を持ち、したがって互換性があります。
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を与えるので、それを戦略にしません。彼らは同じことを "行う"必要があります。
「高い」抽象化用語を使用して戦略にすることはできません。
これらはすべて「数学」をしていますが、すべてが同じようなことを別のやり方で行っているわけではありません。それが戦略の本質です。
だから、誰が正しいですか?
それはアルゴリズムを変えることができますが、その結果は変わりますか?すなわち、それは実装を変えることができますが、インタフェースはどうですか?それが問題なのです。 –
??その質問は具体的に述べました。「同じパターンのインターフェイスを維持しながら、ランタイムにスワップアウトされる戦略パターンによって、クラスパターン(つまり行動など)がスワップアウトされることに同意します」 –
「クライアントとは独立して変化します。お互いの間で変わる(戦略対戦略)?それが問題です。 – eljenso