
126
|
第
5
章
模块化模式与实践
5.2.3
在组合和继承之间进行选择
在实际开发中,除非需要连接到所依赖的特定框架、使用特定的模式(如
扩展原生的
JavaScript
数组),或者当性能被看作最重要的衡量因素时,否
则几乎不需要使用继承。当性能被作为使用原型的一个考量因素时,在匆
忙选择一种可能不那么理想的模式之前,对我们所做的假设进行测试并权
衡不同的方法,是非常有必要的。为了提高性能,我们可能会忽略很多因素。
装饰(
decoration
)和功能组合是更友好的模式,因为它们并不那么死板。
一旦你继承了某些东西,除非继续向原型链添加继承层,否则以后就不能
选择继承其他东西。当多个类继承自一个基类,但需要向外扩展,同时仍
然共享不同的功能部分时,这就成了一个问题。在这些情况以及许多其他
情况下,使用组合能让我们在不牺牲灵活性的前提下挑选所需要的功能。
与简单地改变对象或添加基类相比,函数式的方法实现起来有点麻烦,但
它提供了最大的灵活性。这种方法避免了对底层目标进行更改,使对象易
于序列化为
JSON
,不受不断增长的方法集的影响,因此更容易在代码库中
兼容。
此外,使用基类会使在原型链的不同插入点处重用逻辑变得有点困难。同样,
使用扩展函数,也会使添加类似方法来支持稍有不同的用例变得具有挑战
性。在这方面使用函数方法产生的耦合较少,但它也可能使对象构造的底
层实现变复杂,很难解释清楚它们的功能是如何联系在一起的,这会破坏
我们对代码流的基本理解,并使调试会话的时间变得更长。
与编程中的大多数道理一样,保持外观上的一致性对代码库是有好处的 ...