6

私は過去 8 年間、C# と Java の間を行ったり来たりしてきました。

私が驚くべきことの 1 つは、C# での "テンプレート メソッド" デザイン パターンの使用を完全にやめたことです。実際、C# では、このパターンをアンチパターンと考えるようになりました。

http://en.wikipedia.org/wiki/Template_method_pattern

Java に戻ると、このパターンは生きていて素晴らしいものであることがわかります。まだアンティークに見えると思いますが、Java でこれを行う方法は他にないことに気付きました。Javaもアンティークに見えます;)

これはとにかく出てくるので、なぜそれはアンチパターンなのですか?

  • 多くの場合、「間違った理由」で継承階層を使い果たします。
  • 基本クラスには、あらゆる種類の無関係なコードが散らばる傾向があります。
  • 多くの場合、開発プロセスのかなり早い段階で、設計をロックダウンする必要があります。(多くの場合、時期尚早のロックダウン)
  • 後の段階でこれを変更すると、ますます難しくなります。

したがって、クロージャー/デリゲート/関数ポインターを使用すると、通常、サブクラス化する代わりに関数を渡します。

質問に戻ります。

あなたの言語にクロージャー/デリゲート/関数がある場合、テンプレート メソッドを使用しますか? また、いつ使用しますか?

4

3 に答える 3

4

私が Java を使っていたときは、そうでした。しかし、「クロージャー/デリゲート/関数」を使用する言語の場合、私の場合は Lua です。もう必要ありません。代わりに、ほとんどのニーズの装飾パターンにますます傾いています。

于 2008-11-21T11:24:16.693 に答える
3

はい、私は D プログラミング言語で常にテンプレート メソッドを使用しています。クロージャー、デリゲート、および関数ポインターは、その性質上、基本クラスと非常に疎結合です。この疎結合が必要な場合、これは良いことです。一方、カスタマイズしている動作が、その性質上、基本クラスに非常に密接に結合されている場合があります。このような振る舞いは、他の状況ではほとんど役に立ちません。この結合が必要な場合、テンプレート メソッド パターンは、それを表現する最もクリーンでシンプルな方法です。

簡単なテストは、基本クラスとカスタマイズ可能な動作の間の通信が一方向である場合、つまり、基本クラスがカスタマイズ可能な動作を呼び出すだけである場合は、常に戦略/クロージャー/デリゲート/関数ポインターを使用する必要があることです。メソッドなどを呼び出すことができるように、カスタマイズ可能な動作で基本クラスへの参照が必要な場合は、多くの場合、テンプレート メソッド パターンが最も簡単な方法です。

于 2010-01-14T18:06:27.173 に答える
2

このスレッドを再訪している間に、もう 1 つ回答を追加します。

テンプレート メソッド パターンは、ベース オブジェクトをカスタマイズしているポリシーが相互に認識する必要があり、考えられるすべての組み合わせの非常に限られたサブセットでしか意味をなさない場合、戦略パターンよりも優れています。たとえば、基本クラスに、ポリシーが自分自身を初期化できるように設計された具象関数doIt()とフックがあり、ポリシーが自分自身をクリーンアップできるように設計されているとします。これらの動作は組み合わせた場合にのみ意味があるため、これらの動作を個別に設定することは望ましくありません。beforeDoIt()afterDoIt()

于 2010-07-20T17:25:05.430 に答える