問題タブ [template-method-pattern]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
126 参照

oop - オープン ソース ライブラリにイベントまたは「テンプレート メソッド」パターンを使用する必要がありますか?

私はそのようなものに要約できるオープンソースライブラリを構築しています:

ライブラリのユーザーがカスタム動作を追加できるようにしたいと考えています。

たとえば、操作の特定の時点でログを挿入したり、特定の時点でオブジェクトを変更したりする場合があります。

私はそれを行う2つの方法を見ます:

  • テンプレート メソッドパターンは適切に思えますが、保護されたメソッド ( など) を大量に追加する必要あり、ライブラリのユーザーは自分の動作を追加するためにクラスを拡張する必要があります。beforeDoingThingA()afterDoingThingA()

  • イベントの使用:SuperThing::doStuff()イベントを発生させ、ユーザーは好きなように登録できます。

イベントの使用は、私にとってよりシンプルで明確で保守しやすいように思えます...

しかし、イベントは主に、何かが起こったというメッセージを送ることだと思います。誰かが操作に「フック」して一部のオブジェクトを変更することはできません。多分私はこれについて間違っています。

では、イベントはこの状況に適していますか? そうでない場合、テンプレート メソッド パターンに代わるものはありますか?

0 投票する
3 に答える
375 参照

oop - Template Method デザイン パターンで Strategy デザイン パターンを使用する私の例は意味がありますか?

いくつかの宿題として、ストラテジーとテンプレート メソッドの両方の設計パターンを組み合わせて相互に補完し、結果としてよりカスタマイズ可能にする例 (クラスを含む) を考案する必要があります。または、「テンプレート メソッドを使用して、さまざまな戦略を処理するためのカスタマイズ性を高めます」。

Dog多くの読書と最初の混乱の後、私は 2 匹の動物をクラスとして持ち、それらの両方にインターフェースを使用して特定の機能を実装させるというアイデアを思いつきました (つまりSnake、犬は歩き、ヘビは滑ります)。それぞれが独自の移動機能を個別に実装しているため、これは戦略パターンの部分だと思いました。

これに Template Method パターンを組み込むために、実装しているクラスをカスタマイズ可能にするためにさらにサブクラス化するようにしようと思いました。これは質問に沿っているようです。だから私はクラスとして持っていて、それを and にサブクラス化したいと思っMoverた. しかし、これは各動物がスーパークラスまたはサブクラスの1つを実装するので、私を混乱させましたか? また、サブクラスはインターフェイスですが、スーパークラスは抽象ですか? それともすべてインターフェースですか?WalkSlitherMover

私の例は理にかなっていますか?

0 投票する
2 に答える
147 参照

c++ - テンプレート メソッド パターンの混乱

ここでは、フック関数自体が、クラスの階層にも属するデータ メンバーの typeid をチェックする必要があります。そこで、そのクラス階層のテンプレート メソッドを定義します。これは私が遭遇する混乱です:

}

したがって、この状況では、typeid(*person) と dynamic_cast を使用する独自の方法に頼る必要があります。また、Person 派生クラスの各タイプに対して if ステートメントを使用して、仮想 locationHook を定義する必要があります。

0 投票する
1 に答える
197 参照

javascript - JavaScript の setTimeout を使用したテンプレート メソッド パターン

インスタンスをclose閉じる関数があります。関数を含むクラスでは、派生クラスがオーバーライドできますclose。ここで、派生クラスでもがclose常に呼び出されるようにします。dispose私はこれを次のように達成します。

これは問題なく動作しますが、インスタンスを破棄する前に CSS アニメーションを実行したい場合が 1 つあります。これが私がすることです。

しかし、これを行うとすぐに、使用しているテンプレート パターンを適用できません。2 番目の例で、close 関数が常に dispose を呼び出すようにする方法はありますか?

0 投票する
2 に答える
142 参照

c++ - 非仮想インターフェイスのイディオムに不変条件を追加する

NVI イディオムを使用して次の階層があるとします。

階層のある時点で、非仮想基本メソッドに不変条件を「追加」したい場合、最善の方法は何ですか?

1 つの方法は、SpecialBase レベルで NVI イディオムを再帰することです。

しかし、階層に追加する派生ベースごとに (異なる名前の) メソッドを追加したくないので、このアイデアはあまり好きではありません...

別の方法は、次のものを用意することです (これは NVI ではありません)。

私の意見では、具象クラスはいつでも仮想メソッドを実装する必要があるだけなので、混乱は少ないと思いますが、派生基本クラスも選択した場合は基本 (仮想) メソッドをオーバーライドできます。

同じことを達成するための別のよりクリーンな方法はありますか?

編集:

次のような階層を持つことができる非常に一般的な設計パターンを探しています。

Baseクラスは foo をオーバーライドできますが、クラスA-Fは再実装するだけで済みますfoo_impl

別のオプションのカスタマイズ仮想関数 (例: bar_impl) を追加するだけでは、ここでは役に立たないことに注意してください。

0 投票する
1 に答える
492 参照

php - テンプレート メソッド デザイン パターンの実装を PHPUnit モック オブジェクトでテストする

テンプレート メソッドの設計パターンを実装したコードがあるとします。そして、テンプレートメソッドでメソッド呼び出しのシーケンスとカウントをテストしたいと思います。PHPUnit モックを使用しようとしています。私のソースコードは次のようになります。

その結果、次のようなエラーが発生しました。

モック オブジェクトを使用して、このようなシナリオでメソッド呼び出しをカウントすることは可能ですか?