
2.1
模块化设计的要点
|
31
2.1.4
寻找正确的抽象
开源软件组件通常会收到不少特性请求(
feature request
)。这些请求对某个
特定用户的需求来说过于具体,仅仅从表面上考虑特性请求或需求是不够
的 ;相反,我们需要深入挖掘,并且在该需求的特性、我们为路线图规划
的特性,以及我们可能希望在未来调整组件以支持的特性之间找到共同点。
诚然,对于一个组件来说,满足大多数使用者的需求是很重要的,但这并
不意味着我们应该试着一个一个地或孤立地满足用例中的需求。毫无疑问,
这样做的结果就是 :逻辑重复、在
API
层级上不一致,以及实现同一目标
有好几种方式,而这个目标通常与观察到的结果不一致。
如果能发现一个共同点,抽象时涉及的冲突较少,则有助于避免前面提到
的各种不一致之处。例如,考虑
DOM
事件监听器的例子 :对于每一个事件
处理程序,我们都有一个
HTML
属性和与之匹配的
JavaScript DOM
元素属
性,例如
onlick
、
onchange
、
oninput
等。可以为每个属性分配一个处理事
件的
listener
函数。然后是
EventTarget#addEventListener
方法,它有一
个类似
addEventListener(type, listener, options)
1
的签名,将所有事件
处理逻辑集中到一个以事件类型(
type
)作为参数的方法中。当然,这个
API
更好,是因为下面的几个原因。首先,
EventTarget#addEventListener
是一个方法,明确定义了它的行为。相比之下, ...