一点设计原则

单一职责原则

一个对象 / 方法只做一件事(只有一个引起他变化的原因)

一件事是逻辑上的一件事, 不是一个函数(比如创建 xhr 与发送 xhr 完全可以放一起)

应用

  • 代理模式的单一功能

  • 迭代器模式迭代与执行分离

  • 单例模式中工厂方法与传入方法分离

  • 装饰者模式动态添加单一职责

  • 优点: 降低对象粒度, 降低单个类 / 对象复杂度, 提升对象可复用性

  • 缺点: 增加代码复杂度

最少知识原则(狄米特法则)

尽量提供简单的接口, 减少对象之间的交互, 从而减小类之间的耦合

应用

  • 中介者模式
  • 封装

开放-封闭原则

软件实体(类, 模块, 函数)应该是可扩展的, 但不可修改

应用

  • 发布订阅模式
  • 模板方法模式
  • 策略模式
  • 代理模式
  • 职责链模式

如何开放

  • 通过回调
  • 通过钩子控制宏观流程
  • 找到容易变化的地方, 通过多态将变化的部分封装入多态

里氏替换原则

如果对每一个类型为 S 的对象 o1, 都有类型为 T 的对象 o2, 使得以 T 定义的所有程序 P 在所有的对象 o1 都代替 o2 时, 程序 P 的行为没有发生变化, 那么类型 S 是类型 T 的子类型.

通俗点讲, 就是只要父类能出现的地方, 子类就可以出现, 而且替换为子类也不会产生任何错误或异常.

  • 子类必须完全实现父类的方法
  • 子类可以有自己的个性
  • 覆盖或实现父类的方法时, 输入参数可以被放大
  • 覆盖或实现父类的方法时, 输出结果可以被缩小

依赖倒置原则(面向接口编程)

高层模块不应该依赖于低层模块, 而应该依赖于抽象. 抽象不应依赖于细节, 细节应依赖于抽象

  1. 模块间的依赖通过抽象发生, 实现类之间不直接发生依赖关系, 其依赖关系是通过接口或抽象类产生的
  2. 接口或抽象类不依赖于实现类
  3. 实现类依赖接口或抽象类

  • 每个类尽量都有接口或抽象类,或者接口和抽象类两者都具备。
  • 变量的表面类型尽量是接口或抽象类。
  • 任何类都不应该从具体类派生。
  • 尽量不要重写基类的方法。如果基类是一个抽象类,而且这个方法已经实现了,子类尽量不要重写。

接口隔离原则

不要对外暴露没有实际意义的接口

重构原则

  • 抽离函数原则
    • 当函数过于臃肿时
    • 独立部分可以被复用
    • 独立出的函数拥有更好的命名(语义)
    • 独立出的函数可以被重载(重写)
  • 对于条件分支
    • 尝试将条件抽离为函数以提高语义
    • 提取重复部分而不是在每个分支都执行
  • 对于较长的硬编码
    • 使用循环完成硬编码
  • 对于函数参数
    • 尽量减少参数数目
    • 参数数目过多可以采用对象传入而不是传入参数列表
  • 链式调用不利于调试, 应该将其应用于逻辑稳定的场景
  • 使用函数代替冗长的 if-else