私は1つのアニメーションクラスを持っています。Play
、Pause
およびStop
アニメーションのイベントのオブザーバーが必要です。この問題に対して 2 つの解決策を見つけましたが、どちらを選択すればよいかわかりません。
boost::signals などを使用し、すべてのイベントにコールバックを登録します
3 つの純粋仮想関数 (
OnPlay()
、OnPause()
、OnStop()
) を持つ単純なインターフェイスを作成し、このインターフェイスを実装する Animation クラス オブジェクトに渡します。
どの方法にも長所と短所があります。これまでに見つけたものを列挙してみます。
1の利点。
- 任意のメンバー関数/フリー関数をコールバックとして使用できます
- それらすべてを気にしない場合、3つの関数すべてを実装する必要はありません
- Animation クラスから追加のパラメーターを渡すことなく、同じオブジェクトを複数のアニメーションのオブザーバーとして使用できます。
1のデメリット。
- コールバックごとに呼び出し可能なオブジェクトを作成する必要があります
- 後で新しいイベントを追加したい場合、それが使用された場所を見つけるのは困難です (コンパイラーは、新しいイベントを実装または無視するよう強制できません)。
- どういうわけか奇妙な構文 (私は std::bind/boost::bind をどこでも使用する必要があります)。
2のメリット。
- 分かりやすい施工
- Animation/Observer インターフェース クラスに新しいイベントを追加すると、コンパイラは新しい関数を実装する (おそらく空にする) ように強制します。
2のデメリット。
- 1つしか使用しない場合でも、3つの関数を実装する必要があります(おそらく空です)
- アニメーションから追加のパラメーター (ID など) を送信しないと、同じオブジェクトを別のアニメーションのオブザーバーとして使用することはできません。
- 無料の機能は使用できません。
何を使うべきか教えてください。あなたの経験から、この問題にはどちらが優れていますか?最初のアプローチからの自由か、2番目のアプローチからの明確で理解しやすいコードですか? 両方の方法または他の解決策の他の利点/欠点を教えてください。