3

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

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

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

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

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

从面向对象的角度来看,第一个解决方案似乎更纯粹。您有一个明确定义的接口,它记录了实现该接口的代码的作用。您可以轻松找到实现该接口的类,代码可以更容易理解。

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

4

1 回答 1

3

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

  1. In OOP, as I think, objects are paramount, not actions, and with this ideology it seems more correctly, when objects do something through other objects.
  2. You declare some entity which has it's own area of ​​responsibility, and you have ability to change this area flexible and simple.
于 2012-08-25T11:08:59.483 回答