オブジェクト指向プログラムでコールバックを使用した経験は何ですか? コールバックによって、コードの品質が向上しますか (理解しやすく、拡張しやすく、保守しやすい)? それとも、オブジェクト指向のコードではコールバックを避けるべきでしょうか?
この問題を説明するために、クラスが非同期タスクの処理を終了したことを通知できる次の 2 つの方法を検討してください (コードは C++ であり、コールバックとして単純な関数ポインターを使用していますが、これらは単なる詳細であり、問題はオブジェクト指向の実践に関するものです)。
通知用のインターフェースを定義し、このインターフェースを実装するオブジェクトを非同期リーダーに渡します。
class IReadFinishedListener { virtual void readDone() = 0; }; class ReaderA { void asyncRead(IReadFinishedListener& readFinished); };
コールバックをリーダーに渡します。
class ReaderB { void asyncRead(void (*readFinishedCallback)(void)); };
最初の解決策は、オブジェクト指向の観点からはより純粋に見えます。明示的に定義されたインターフェイスがあり、インターフェイスを実装するコードが何をするかを文書化します。インターフェイスを実装するクラスを簡単に見つけることができ、コードを簡単に理解できます。
2 番目のソリューションはより軽量であり、設計や名前付けが難しいことが多い追加のインターフェイスを必要としません。また、読み取りを処理するクラスと、読み取りが終了したときに通知されるコードとの間の結合を減らすことができるため、より柔軟に見えます。ただし、どのクラスが通知を処理できるかを文書化する明示的なインターフェイスがないため、コードを理解するのが難しくなる可能性があります。