深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP详解
前言
本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第4篇,接口隔离原则ISP(TheInterfaceSegregationPrinciple)。
英文原文:http://freshbrewedcode.com/derekgreer/2012/01/08/solid-javascript-the-interface-segregation-principle/
注:这篇文章作者写得比较绕口,所以大叔理解得也比较郁闷,凑合着看吧,别深陷进去了
接口隔离原则的描述是:
Clientsshouldnotbeforcedtodependonmethodstheydonotuse.
不应该强迫客户依赖于它们不用的方法。
当用户依赖的接口方法即便只被别的用户使用而自己不用,那它也得实现这些接口,换而言之,一个用户依赖了未使用但被其他用户使用的接口,当其他用户修改该接口时,依赖该接口的所有用户都将受到影响。这显然违反了开闭原则,也不是我们所期望的。
接口隔离原则ISP和单一职责有点类似,都是用于聚集功能职责的,实际上ISP可以被理解才具有单一职责的程序转化到一个具有公共接口的对象。
JavaScript接口
JavaScript下我们改如何遵守这个原则呢?毕竟JavaScript没有接口的特性,如果接口就是我们所想的通过某种语言提供的抽象类型来建立contract和解耦的话,那可以说还行,不过JavaScript有另外一种形式的接口。在DesignPatterns–ElementsofReusableObject-OrientedSoftware一书中我们找到了接口的定义:
http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612
一个对象声明的任意一个操作都包含一个操作名称,参数对象和操作的返回值。我们称之为操作符的签名(signature)。
一个对象里声明的所有的操作被称为这个对象的接口(interface)。一个对象的接口描绘了所有发生在这个对象上的请求信息。
不管一种语言是否提供一个单独的构造来表示接口,所有的对象都有一个由该对象所有属性和方法组成的隐式接口。参考如下代码:
varexampleBinder={}; exampleBinder.modelObserver=(function(){ /*私有变量*/ return{ observe:function(model){ /*代码*/ returnnewModel; }, onChange:function(callback){ /*代码*/ } } })();
exampleBinder.viewAdaptor=(function(){ /*私有变量*/ return{ bind:function(model){ /*代码*/ } } })();
exampleBinder.bind=function(model){ /*私有变量*/ exampleBinder.modelObserver.onChange(/*回调callback*/); varom=exampleBinder.modelObserver.observe(model); exampleBinder.viewAdaptor.bind(om); returnom; };