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