javascript设计模式学习之十七——程序设计原则与面向接口编程

时间:2023-03-08 17:37:18
javascript设计模式学习之十七——程序设计原则与面向接口编程

一、编程设计原则

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';
};