問題タブ [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 に答える
3060 参照

java - これはどのデザイン パターンですか? アダプター、プロバイダー、デリゲート、テンプレート メソッド、または ...?

以下は、デザイン パターンに関する簡単な質問です。

現在のプロジェクトの一環として、(Web サービスと関連するクライアント スタブを使用して) データベース検索を実行し、結果を返すインターフェイスを作成しました。結果は、後で JSON 要求への応答として Struts アクションによって使用されます。

インターフェイスは次のようなものです。

次に、オブジェクトの特定のタイプごとに、上記の具体的なバージョンが実装され、関連する Web サービスを呼び出して結果を返します。

基本的に、私が知る限り、これは一連のビジネス ロジックの単なるラッパーです。

問題は、これを何と呼ぶか​​ということです。プロバイダーという用語はかなりあいまいなので好きではありません。これに対して明確に定義された設計パターンはありますか?

理想的には、これでSpringを使用することを好みましたが、残念ながら、このプロジェクトはレガシーコードベースの一部であるため、このプロジェクトでは使用できません...

編集:

使用される場所は次のとおりです。

等...

したがって、特定のタイプのオブジェクトに対して、上記の Action クラスの具体的なバージョン (ちなみにこれは stuts アクションです) が実装され、上記の「プロバイダー」の実装への参照が含まれます...次のようになります。

それがより明確になることを願っています。

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

python - 上書きされることを意図した属性とメソッドのPython命名規則

私はPythonでオブジェクト指向のコードをいくつか持っています。ここで、いくつかのクラスは、コードの欠落しているカスタムビット(テンプレートメソッドパターンだけでなく、変数も含む)を提供するために拡張されることを意図しており、スーパークラスによってのみ使用されます。それらを使用するクライアントコード。

そのような抽象(またはスーパークラスでの実装は例外を発生さpassせるため、鈍いNonImplemented)メソッドと属性のスタイル規則はありますか?

私はPEP-0008を閲覧してきましたが、サブクラスで使用することを意図していないプライベートメンバーにアンダースコアを付けることについてのみ言及しています。

0 投票する
5 に答える
9279 参照

python - Python でメソッドのドキュメント文字列を継承する

コード自体と同じくらい多くのメンテナンスが必要な docstrings を持つ OO 階層があります。例えば、

ここでの問題はAfricanSwallow.airspeed、スーパークラス メソッドの docstring を継承しないことです。テンプレート メソッド パターンを使用して docstring を保持できることはわかっています。つまり、

_ask_arthur各サブクラスに実装します。しかし、ドキュメントストリングを継承する別の方法があるかどうか疑問に思っていました。おそらく、まだ発見していないデコレータですか?

0 投票する
5 に答える
491 参照

c++ - 純粋な抽象メソッドを他の基本クラスのメソッドで満たす最も簡単な方法は何ですか?

編集:いくつかのコメントによると、単純とは、a) コードが少なく、b) 保守が容易で、c) 間違いにくいことを意味します。

編集 #2:また、プライベート継承の代わりに包含を使用することは、実装が実際に簡素化される場合、好ましくありませんInterfaceImpl

現在、これを行う唯一の方法は、実装者に抽象メソッドを定義させ、呼び出しをターゲットの基本型のメソッドに委任することです。例:

最初は、おそらくこれで問題が解決するのではないかと思いました。

最初の using ステートメントは両方のMethodOneImpl::method1メソッドをパブリックにしますが、実際には との契約を履行せずInterface、 のアクセシビリティを変更しますMethodOneImpl::method1(int)。そして明らかにmethod2、名前が一致しないため、このソリューションを使用できませんでした。

FWIW、私は解決策だと思うものを持っていますが、それは標準の一部ではありません(つまり、コンパイルされません)。私は C++ 委員会に提案をしようと考えていました。誰かアドバイスがあれば、以下のコメントをいただければ幸いです (ただし、アドバイスを回答として提出しないでください)。

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

objective-c - Objective-C - テンプレート メソッド パターン?

だから私はObjective-Cのテンプレートメソッドについて読んでいて、それらの何が特別なのかを理解しようとしています. 私の理解では、基本クラスのメソッドはオーバーライドでき、スーパーを呼び出すことができますか? では、テンプレート メソッドは基本クラスのメソッドをオーバーライドする以上のものなのでしょうか?

私が間違っている場合は、テンプレート メソッド パターンとは何かを説明してください。また、例を挙げていただけますか?

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

unit-testing - モック フレームワークを使用したテンプレート メソッドのテスト。低レベルじゃないですか

m1() と m2() を呼び出すテンプレート メソッド template() があるとします。m1 と m2 のテストがあります。template() のテスト中に、モックを使用して m1 と m2 が正しく呼び出されたかどうかを確認するか、その API をテストするか、またはその両方を行う必要があります。

テンプレートのアルゴリズムを(モッキングを使って)チェックするテストは低レベルで、ソースコードの各行をチェックするようなものだと思います。

他の人がこれについてどう思うか聞きたいです。

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

c++ - なぜ GoF は、C++ テンプレート メソッド パターンの実装で保護された (プライベートではなく) 仮想メソッドを使用することを勧めているのですか?

テンプレート メソッド パターンのギャング オブ フォーから:

3 つの実装上の問題は注目に値します。

  1. C++ アクセス制御の使用。C++ では、テンプレート メソッドが呼び出すプリミティブ操作は、保護されたメンバーとして宣言できます。これにより、テンプレート メソッドによってのみ呼び出されるようになります。オーバーライドする必要があるプリミティブ操作は、純粋仮想として宣言されます。テンプレート メソッド自体はオーバーライドしないでください。したがって、テンプレート メソッドを非仮想メンバー関数にすることができます。

「これにより、テンプレートメソッドによってのみ呼び出されることが保証されます。」は真実ではありませんね。プリミティブ メソッド (一部が純粋仮想ではなく仮想の場合など) は、派生クラスからも呼び出すことができます。プリミティブ メソッドをプライベートに宣言するだけで、それらがテンプレート メソッドによってのみ呼び出されることが保証されるというのは本当ではないでしょうか? その後、プライベート仮想プリミティブ メソッドをサブクラスに実装 (または再実装) して、スーパークラスのテンプレート メソッドで定義されたアルゴリズム内で必要な特殊な動作を提供できます。

Herb Sutter の "Virtuality" を参照してください。

http://www.gotw.ca/publications/mill18.htm

彼は次のように述べています。

ガイドライン #2: 仮想機能を非公開にすることを優先します。ガイドライン #3: 派生クラスが仮想関数の基本実装を呼び出す必要がある場合にのみ、仮想関数を保護します。

派生クラスが仮想関数の基本クラスの実装を呼び出すための GoF テンプレート メソッド パターン内の要件が見当たりません。

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

java - templatemethod パターンを使用してワークチェーンを実装しますか?

クラスの階層がありworker、そのすべてがワークピースに対して何らかの処理を行います。アイデアは、各ワーカーがいくつかの前処理を行い、ワークピースをサブクラスにプッシュしてから、いくつかの後処理を行うというものです。

現在、新しい抽象メソッドを宣言することでこれを解決しています:

これには、階層レベルごとに追加の新しいメソッドがあるという明らかな欠点があります。

すべての前処理および後処理メソッドが、私の制御下にない新しいユーザー実装ワーカーでも実行されることを保証したいと思います。

どうやってそれをしますか?

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

java - リストをループするにはどうすればよいですかテンプレートメソッドパターンを使用しますか?

Javaでのtemplate-methodパターンの実装例を探しています。たとえば、をループして、リスト内のタイプの各アイテムにList<T>署名を付けてテンプレートメソッドを実行できるジェネリッククラスを作成するとします。void execute(T t)T