在面向对象程序中使用回调有什么经验?回调是否会产生更高质量的代码(更易于理解,扩展和维护)?或者应该在面向对象的代码中避免回调?
为了说明这个问题,请考虑以下两种方法,类可以通知它已完成处理异步任务(代码在C ++中使用普通函数指针作为回调,但这些只是细节,问题是关于面向对象的实践):
定义通知接口,并将实现此接口的对象传递给异步读取器:
class IReadFinishedListener {
virtual void readDone() = 0;
};
class ReaderA {
void asyncRead(IReadFinishedListener& readFinished);
};
将回调传递给读者:
class ReaderB {
void asyncRead(void (*readFinishedCallback)(void));
};
从面向对象的角度看,第一个解决方案看起来更纯粹。您有一个显式定义的接口,它记录了实现接口的代码所执行的操作。您可以轻松找到实现该接口的类,代码可以更容易理解。
第二种解决方案更轻量级,它不需要额外的接口,这通常很难设计和命名。它似乎也更灵活,因为它可以减少处理读取的类和读取完成时通知的代码之间的耦合。但是,代码可能变得更难以遵循,因为没有明确的接口来记录哪些类可以处理通知。
答案 0 :(得分:3)
我认为第一个变体在OOP中更好,这就是原因: