WebKit 源代码评析一
作为过去两年最受热捧的浏览器引擎 WebKit,可谓风光无限好!
本人抱着学习的态度,埋头研读,斩获颇多。但也发现一些细节上的小疑问!
比如下面这段代码
class EventTarget {
public:
void ref() { refEventTarget(); }
void deref() { derefEventTarget(); }
virtual EventSource* toEventSource();
virtual MessagePort* toMessagePort();
virtual Node* toNode();
virtual DOMWindow* toDOMWindow();
virtual XMLHttpRequest* toXMLHttpRequest();
virtual XMLHttpRequestUpload* toXMLHttpRequestUpload();
...
EventTarget 表示DOM模型中Event宿主对象,封装了事件触发等行为逻辑。
DOM Node 从 EventTarget 派生,从而继承了相关的事件行为特性。可以
认为,EventTarget 本是一个完全不依赖于 DOM Node 的独立体系。但是,
上面代码中,却出现了一组 toXXXXX()的类型转换函数。这是典型的从上向下的
类型识别操作,现在,EventTarget 和 Node 相互依赖了。
通过虚函数来提供类型识别,我个人是不太赞成的,因为它加强了基类与派生类型
的耦合,不利于代码维护,每增加一个派生类型,基类型就需要增加一个转换函数。
更不好的是,不利于代码阅读。第一次看到这些代码,大概都会犯疑惑,
EventTarget 为什么要依赖如此多的类型?
最后,从代码复用的角度,假设需要在一个新的环境中使用EventTarget 类型,
首先就要去掉上面那么一堆的类型转换函数。
当然,WebKit这样的实现,从功能上说也没什么不好,或许我的观点太苛刻了,
太学究了。有句话,“好软件都是用烂代码写出来的”,不知道WebKit算不算,哈哈!