Solid原则

面向对象原则

单一职责(Single Responsibility)


高内聚,一个类只干一件事,低耦合,影响范围小

开闭原则(Open-Close)


开放扩展,封闭修改。可以在不修改现有代码的情况下加入新功能,保持原逻辑稳定性,提升代码复用性。

面向接口的编程,使用设计模式比如策略模式,装饰器等等

里氏替换(Liskov Subtitution)


程序逻辑中使用父类的地方可以透明的替换成子类,子类可以扩展父类,不要改变父类原有行为

  • 不覆盖父类非抽象的方法
  • 子类可以增加自己的方法
  • 子类实现父类抽象时,返回值更严格
  • 子类重载父类时,参数更宽泛

接口分离(Interface Segregation)


接口要小而专,因为接口中的所有方法必须要实现,大而全的接口会造成类不需要某些方法

依赖倒转(Dependence Inversion)


针对接口编程,不依赖具体实现

迪米特法则(Law of Demeter)


最少知识原则(Least Knowledge Principle, LKP),对象只暴露简单方法,封装内部复杂逻辑,降低类间耦合,严控访问权限
只和直接朋友交互,不和朋友的朋友间接交互,避免长链式调用
直接朋友的范围

  • 当前对象本身
  • 方法传入的参数
  • 当前对象直接引用的实例变量
  • 当前对象创建的对象
  • 当前对象所处的集合

缺点:
由于只和直接朋友交互,如果想调用另一模块的方法,那么需要包装出很多用于传递调用的类或方法,一定程度上增加了复杂度,过多的传递降低通信效率

门面模式,调停者模式

组合/聚合复用原则(Composite/Aggregate Reuse Principle CARP)


组合优于继承

  • 继承只能单继承扩展性受限
  • 父类方法子类不一定全部需要