在面向对象程序中使用回调是一种很好的做法吗?

时间:2012-08-25 10:49:24

标签: oop callback

在面向对象程序中使用回调有什么经验?回调是否会产生更高质量的代码(更易于理解,扩展和维护)?或者应该在面向对象的代码中避免回调?

为了说明这个问题,请考虑以下两种方法,类可以通知它已完成处理异步任务(代码在C ++中使用普通函数指针作为回调,但这些只是细节,问题是关于面向对象的实践):

  1. 定义通知接口,并将实现此接口的对象传递给异步读取器:

    class IReadFinishedListener {
       virtual void readDone() = 0;
    };
    
    class ReaderA {
      void asyncRead(IReadFinishedListener& readFinished);
    };
    
  2. 将回调传递给读者:

    class ReaderB {
       void asyncRead(void (*readFinishedCallback)(void));
    };
    
  3. 从面向对象的角度看,第一个解决方案看起来更纯粹。您有一个显式定义的接口,它记录了实现接口的代码所执行的操作。您可以轻松找到实现该接口的类,代码可以更容易理解。

    第二种解决方案更轻量级,它不需要额外的接口,这通常很难设计和命名。它似乎也更灵活,因为它可以减少处理读取的类和读取完成时通知的代码之间的耦合。但是,代码可能变得更难以遵循,因为没有明确的接口来记录哪些类可以处理通知。

1 个答案:

答案 0 :(得分:3)

我认为第一个变体在OOP中更好,这就是原因:

  1. 在OOP中,我认为,对象是最重要的,而不是行动,当对象通过其他对象做某事时,这种意识形态似乎更为正确。
  2. 您声明某个拥有该职责范围的实体,并且您有能力灵活简单地更改此区域。