1. 单一职责原则(SRP)
单一职责原则通常指,一个类只有一种功能。但是JavaScript是一门面向对象的语言,没有类的概念,所以单一职责在JavaScript中的含义是:一个对象(方法)只有一种功能。
那么为什么需要单一职责原则呢?
是因为不同功能的代码耦合在一起容易造成混乱,维护起来十分困难,而且不利于单元化测试。将不同职责的代码分离开来,有利于我们定位代码位置,一旦需要修改代码可以一目了然,提高可读性。
当然,单一职责原则也有一些缺点,比如代码会被分得更加细粒度,相互之间的联系也就更加频繁,如果处理不好对象之间的联系,容易违背后面要介绍的 最少知识原则。
单一职责原则要把握好代码分离的度,一些随着需求变化会一起变化的代码有时候可以不分离,比如xhr请求中建立和发送的操作。
2. 最少知识原则(LKP)
最少知识原则是指一个实体应该尽量少地和其他实体发生相互作用,其中实体包括的范围很广,包括:对象、函数、模块、变量等。
那么为什么要有最少知识原则?
这是因为如果实体之间的相互作用很多,那么当其中一个实体发生改动的时候,就会影响其他的实体,牵一发而动全身。
一般来说,实现最少知识原则,我们可以从以下几步入手:
(1) 减少对象之间的联系
尽量采用第三者对象来作为这些对象联系的媒介,同时在单一职责原则下,不能把代码粒度分得太细,要把握有度。
(2) 多采用封装的方式
封装能够建立变量的独立作用域,使得封装的变量与外界没有相互作用,而只暴露一些必要的方法(或者说API)给外界调用,将有可能相互作用的部分大大缩小。
3. 开放-封闭原则(OCP)
大多数时候,当一个程序有良好的设计,往往说明它是符合开放-封闭原则的
开放封闭原则是指对扩展开放,对修改封闭。它的意思是,当我们需要增加需求的时候,我们可以考虑增加代码而不是修改代码。
那么为什么需要开放封闭原则呢?
那是因为我们的代码都会跟着需求进行改动,用了开放封闭原则提高了程序灵活扩展的能力。
通常当我们代码里存在条件分支时,我们可以考虑用多态来改写它。比如:、
function makeSound(obj) {
if (obj instanceof Duck) {
console.log("gagaga");
} else if (obj instanceof Chicken) {
console.log("gegege");
}
}
function Duck() {
//...
}
function Chicken() {
//...
}
var a = new Duck();
var b = new Chicken();
makeSound(a);
makeSound(b);
如果是这一种情况,那么当我们再增加一种狗叫声的时候,又要再加上 else if分支语句,我们可以考虑用多态来改写代码:
function makeSound(obj) {
obj.sound();
}
function Duck() {
this.sound = function() {
console.log('gagaga');
}
}
function Chicken() {
this.sound = function() {
console.log('gegege');
}
}
var a = new Duck();
makeSound(a);
这样当我们增加狗叫声的时候,不用修改原有代码,只要再增加一个function Dog()就可以了
这样就符合开放-封闭的原则了