私が書いている 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
これは問題なく動作しますが、設計に関しては少し間違っているようです。
多分私は衒学的なだけかもしれません-しかし、これはあなたにとって良いデザインのように思えますか?