Fork me on GitHub

设计原则和编程技巧


单一职责原则

就一个类而言,应该仅有一个引起它变化的原因。在JavaScript中,需要用到类的场景并不太多,单一职责原则(SRP)更多的是被运用在对象或者方法级别上。
总之,SRP原则体现为:一个对象(方法)只做一件事情。
例如:

  • 代理模式

  • 迭代器模式

  • 单例模式

  • 装饰者模式
    但是,并不是所有的职责都应该一一分离的,一方面如果随着需求的变化,有两个职责是同时变化的,那就不必分离他们。比如在ajax请求的时候,创建xhr对象和发送xhr请求几乎总是在一起的,那么创建xhr对象的职责和发送xhr对象的职责就没有必要分开。

另一方面,职责的变化轴线仅当它们确定会发生变化时才有意义,即使两个职责已经被耦合在一起但他们没有发生改变的征兆,那么也许没有必要主动分离他们,在代码需要重构的时候再分离也不迟。

最少知识原则

最少知识原则(LKP)说的是一个软件实体应当尽可能少与其他实体发生相互作用。这里的软件的实体是一个广义的概念,不仅包括对象,还包括系统,类,模块,函数,变量等。
单一职责原则指导我们把对象划分成较小的粒度,这可以提高对象的可复用性。但越来越多的对象之间可能会产生错综复杂的联系,如果修改了其中一个对象,很可能会影响到跟它相互引用的其他对象。对象和对象耦合在一起,有可能会降低他们的复用性。在程序中,对象的“朋友”太多并不是一件好事。
最少知识原则要求我们在设计程序时,应当尽量减少对象之间的交互。如果两个对象之间不必彼此直接通信,那么两个对象就不要发生直接的相互联系。常见的做法是引入一个第三者对象,来承担这些对象之间的通信作用。如果一些对象需要向另一些对象发起请求,可以通过第三者对象来转发这些请求。
体现地方:

  • 中介者模式

  • 外观模式

开放-封闭原则

在面向对象的程序设计中,开放-封闭原则(OCP)是最重要的一条原则。他的定义为:软件实体(类,模块,函数)等应该是可以拓展的,但是不可修改的。
举例:

  • 发布-订阅模式

  • 模板方法模式

  • 策略模式

  • 代理模式

  • 职责链模式

我知道是不会有人点的,但万一有人想不开呢?