一点设计原则
单一职责原则
一个对象 / 方法只做一件事(只有一个引起他变化的原因)
一件事是逻辑上的一件事, 不是一个函数(比如创建 xhr 与发送 xhr 完全可以放一起)
应用
代理模式的单一功能
迭代器模式迭代与执行分离
单例模式中工厂方法与传入方法分离
装饰者模式动态添加单一职责
优点: 降低对象粒度, 降低单个类 / 对象复杂度, 提升对象可复用性
缺点: 增加代码复杂度
最少知识原则(狄米特法则)
尽量提供简单的接口, 减少对象之间的交互, 从而减小类之间的耦合
应用
- 中介者模式
- 封装
开放-封闭原则
软件实体(类, 模块, 函数)应该是可扩展的, 但不可修改
应用
- 发布订阅模式
- 模板方法模式
- 策略模式
- 代理模式
- 职责链模式
如何开放
- 通过回调
- 通过钩子控制宏观流程
- 找到容易变化的地方, 通过多态将变化的部分封装入多态
里氏替换原则
如果对每一个类型为 S 的对象 o1, 都有类型为 T 的对象 o2, 使得以 T 定义的所有程序 P 在所有的对象 o1 都代替 o2 时, 程序 P 的行为没有发生变化, 那么类型 S 是类型 T 的子类型.
通俗点讲, 就是只要父类能出现的地方, 子类就可以出现, 而且替换为子类也不会产生任何错误或异常.
- 子类必须完全实现父类的方法
- 子类可以有自己的个性
- 覆盖或实现父类的方法时, 输入参数可以被放大
- 覆盖或实现父类的方法时, 输出结果可以被缩小
依赖倒置原则(面向接口编程)
高层模块不应该依赖于低层模块, 而应该依赖于抽象. 抽象不应依赖于细节, 细节应依赖于抽象
- 模块间的依赖通过抽象发生, 实现类之间不直接发生依赖关系, 其依赖关系是通过接口或抽象类产生的
- 接口或抽象类不依赖于实现类
- 实现类依赖接口或抽象类
即
- 每个类尽量都有接口或抽象类,或者接口和抽象类两者都具备。
- 变量的表面类型尽量是接口或抽象类。
- 任何类都不应该从具体类派生。
- 尽量不要重写基类的方法。如果基类是一个抽象类,而且这个方法已经实现了,子类尽量不要重写。
接口隔离原则
不要对外暴露没有实际意义的接口
重构原则
- 抽离函数原则
- 当函数过于臃肿时
- 独立部分可以被复用
- 独立出的函数拥有更好的命名(语义)
- 独立出的函数可以被重载(重写)
- 对于条件分支
- 尝试将条件抽离为函数以提高语义
- 提取重复部分而不是在每个分支都执行
- 对于较长的硬编码
- 使用循环完成硬编码
- 对于函数参数
- 尽量减少参数数目
- 参数数目过多可以采用对象传入而不是传入参数列表
- 链式调用不利于调试, 应该将其应用于逻辑稳定的场景
- 使用函数代替冗长的
if-else