1

私が書いている c++ (c++11) ライブラリ (OpenGL グラフィック エンジン) があります。

私の質問は、イベント リスナーを登録するための優れたプログラミング手法に関するものです。

私は次のようなクラス関係を持っています:

Program--has--> SceneManager--has--> ShaderManager--has-->*Shader

このShaderクラスにより、他のオブジェクトが自身を として登録できるようになりますShaderBindListener。つまり、シェーダーでそのbind()メソッドが呼び出されるたびに、リスナーに通知されます。

ShaderManagerクラスは、外部ライブラリがアクセスできるクラスであり、そこから新しいオブジェクトを作成できますShader

ここで、各オブジェクトにオブジェクトを としてShader持たせて、 aがバインドされたときにオブジェクトに通知し、行列データなどをGPU に渡すことができるようにします。ProgramShaderBindListenerShaderProgramShader

私の最初の解決策は、Programオブジェクトがそれ自体へのポインタを にSceneManager渡し、それがポインタを に渡し、ShaderManagerそれを格納することでした。Shader新しいが作成されるたびに、はをリスナーとしてShaderManager追加します。Program

これは問題なく動作しますが、設計に関しては少し間違っているようです。

多分私は衒学的なだけかもしれません-しかし、これはあなたにとって良いデザインのように思えますか?

4

1 に答える 1

2

いくつかのオプションがありますが、その長所と短所はしばしば議論の余地があり、スタイルによって異なります。

シングルトン

プロセスに のインスタンスが 1 つしかない場合は、シングルトンProgramを作成できます。この方法では、ポインターを渡す必要はありません。Program

中間オブジェクト

ポインターを通過させる代わりに、そのイベント処理をthisカプセル化して管理するオブジェクトを通過させることができます。Programそうすれば、他のクラスは について知る必要がなくProgram、必要なのはイベント クラスのインターフェイスだけです。

実際、Boostの使用を嫌がらない場合は、探しているもの、つまり Signals2ライブラリが用意されています。

于 2013-04-07T02:21:54.807 に答える