一、编程设计原则
1)单一职责原则(SRP):
这里的职责是指“引起变化的原因”;单一职责原则体现为:一个对象(方法)只做一件事。
事实上,未必要在任何时候都一成不变地遵守原则,实际开发中,因为种种原因违反SRP的情况并不少见,比如jQuery中的attr方法,既负责赋值,又负责取值。这对于jQuery的维护者来说,带来了一些困难,然而对于jQuery的用户来说,则方便了使用。
因此很多时候,需要在方便性和稳定性之间有一些取舍。
2)最少知识原则(LKP):
最少知识原则是说,一个软件实体应当尽可能少地与其他实体发生相互作用。这里的软件实体是一个广义的概念,不仅包括对象,也包括系统、类、模块、函数、变量等。
最少知识原则体现最多的地方是中介者模式和外观模式。与封装不同的是,封装侧重于体现数据的隐藏,而最少知识原则则侧重于减少对象之间的联系。
3)开放—封闭原则(OCP):
在面向对象程序设计中,开放—封闭原则是最重要的一项原则。几乎所有的设计模式的初衷都是为了满足这一原则,该原则定义如下:
软件实体(类、模块、函数)等可以扩展,但不可以被修改。即:当需要变动 一个程序的功能或者给这个程序增加新功能的时候,可以通过增加代码的方式,但是不允许更改程序的源代码。
二、接口和面向接口编程
接口的含义有很多:
1)通常说一个库对外提供了某某API接口。这里的接口是指通过主动暴露的接口来通信,可以隐藏软件系统内部的工作细节。
2)第二种接口是指某些语言提供的关键字,如java中的interface;
3)第三种是指“面向接口编程”中的接口,这里的接口体现的更为抽象,指的是对象能响应的请求的集合。
2.1 java中的面向接口编程:
在java中,面向接口编程通常采用的方法有两种:1)抽象类;2)interface
java中的抽象类主要有两个作用:1)向上转型,实现多态;2)建议一些契约;
java中的interface也可以达到同样的效果,虽然很多人在实际使用中刻意区分抽象类和interface,但是实际上interface也是继承的一种方式,叫做接口继承。interface同样可以用于向上转型和订立契约。
2.2 javascript中的面向接口编程
对于javascript而言,因为javascript是一门动态的语言,类型本身就是一个模糊的概念,不需要利用抽象类或者interface给对象进行“向上转型”,或者说,是天生可以向上转型的。即在动态类型语言中,对象的多态性是与生俱来的。
因为不需要进行向上转型,因此接口在javascript中的最大作用就退化到了检查对象的规范性。动态语言中广泛采用“鸭子类型”的思想:
“如果它走起来像鸭子,叫起来也是鸭子,那么它就是鸭子”
这种思想运用的地方很多,如一个对象如果有length属性,也可以根据数字下标来存取属性,该对象就可以当做数组来使用。一个对象如果有push和pop方法,就能当做栈来使用。
例如如果利用鸭子类型的思想来判断一个对象是否是数组,方法如下:
var isArray=function(obj){
return obj&& typeof obj ==='object'&&typeof obj.length==='number' &&typeof obj.splice==='fucntion';
};