3

オブジェクト指向プログラムでコールバックを使用した経験は何ですか? コールバックによって、コードの品質が向上しますか (理解しやすく、拡張しやすく、保守しやすい)? それとも、オブジェクト指向のコードではコールバックを避けるべきでしょうか?

この問題を説明するために、クラスが非同期タスクの処理を終了したことを通知できる次の 2 つの方法を検討してください (コードは C++ であり、コールバックとして単純な関数ポインターを使用していますが、これらは単なる詳細であり、問​​題はオブジェクト指向の実践に関するものです)。

  1. 通知用のインターフェースを定義し、このインターフェースを実装するオブジェクトを非同期リーダーに渡します。

    class IReadFinishedListener {
       virtual void readDone() = 0;
    };
    
    class ReaderA {
      void asyncRead(IReadFinishedListener& readFinished);
    };
    
  2. コールバックをリーダーに渡します。

    class ReaderB {
       void asyncRead(void (*readFinishedCallback)(void));
    };
    

最初の解決策は、オブジェクト指向の観点からはより純粋に見えます。明示的に定義されたインターフェイスがあり、インターフェイスを実装するコードが何をするかを文書化します。インターフェイスを実装するクラスを簡単に見つけることができ、コードを簡単に理解できます。

2 番目のソリューションはより軽量であり、設計や名前付けが難しいことが多い追加のインターフェイスを必要としません。また、読み取りを処理するクラスと、読み取りが終了したときに通知されるコードとの間の結合を減らすことができるため、より柔軟に見えます。ただし、どのクラスが通知を処理できるかを文書化する明示的なインターフェイスがないため、コードを理解するのが難しくなる可能性があります。

4

1 に答える 1

3

OOPでは最初のバリアントの方が優れていると思います。それが理由です:

  1. OOP では、私が思うに、オブジェクトはアクションではなく最優先事項であり、このイデオロギーでは、オブジェクトが他のオブジェクトを介して何かを行う場合、より正確に見えます。
  2. 独自の責任領域を持つエンティティを宣言すると、この領域を柔軟かつ簡単に変更できます。
于 2012-08-25T11:08:59.483 に答える