编程思想之六大原则

六大基本原则

如果要求一口气说出六大基本原则,估计只有少部分人能流利地回答出来,但如果是提到具体的某项原则,相信大多数人光听到名字就能知道其中的内容。

单一职责原则

一句话概述:一个类或接口只做一件事

优点:

  • 降低复杂度
  • 提高可读性
  • 提高可维护性

接口的设计尽量做到单一职责,类的设计尽量做到一个原因引起变化

个人见解 很多时候只能是尽量做到而不是完全做到。不过思想是可以借鉴的,比如现在如日中天的 Spring Cloud,一个模块相当于也只是做自己的事,另外还可以从 JDK 源码看出,所以单一职责原则大到模块、系统,小到具体的类、方法都是有用武之地的。

里氏替换

一句话概述:只要父类能出现的地方子类就可以出现

优点:

  • 提高重用性
  • 提高可扩展性

尽量避免子类的“个性”

个人见解 里氏替换实际上是指导继承的使用,使用继承父类最好是一个抽象类而非具体类,子类的个性是通过抽象方法的实现,而不是去扩展新的方法。要是非要扩展父类没有的方法,就需要考虑两类使用依赖、聚集、组合等关系来替代继承。

依赖倒置

一句话概述:面向接口编程

优点:

  • 降低耦合性
  • 提高可扩展性
  • 提高可维护性

每个类尽量都有接口或抽象类,或者抽象类和接口两者都具备

个人见解 依赖倒置一般结合里氏替换来运用,接口定义公共方法和属性,抽象类负责实现公共特性,剩下的由具体类来实现。实际在项目中运用最多就是 IxxService 命名的接口。此外,项目开发很多时候都是并行的(除非一个人负责项目),所以可以经常听到同事说能不能先给(定义)一个接口,却没有听到谁说给一个类,侧面说明依赖倒置的普遍性。

接口隔离

一句话概述:接口尽量细化

优点:

  • 降低耦合性
  • 提高可扩展性
  • 提高可维护性

接口内容尽量细化和分散,一个接口只服务于一个子模块或业务逻辑

个人见解 这是一项专门针对接口的原则,看上去和单一职责有点像,不过接口隔离是对单一职责的内容更,不必刻意去深究。

迪米特法则

一句话概述:一个类应该对自己需要耦合或调用的类知道得最少

优点:

  • 降低耦合性
  • 提高重用性

一个类尽量收敛,不要对外开放太多的 public 方法和非静态的 public 变量

个人见解 这个原则是最难理解的,什么叫调用的类知道最少,什么叫不要开放太多 public 属性和方法。第一点,调用类知道最少,简单的来说就是A想叫B得到C的结果,既然能通过B得到C的结果,那么A就不需要去和C产生关联;第二点,举一个实际例子,比如把大象装进冰箱。首先肯定需要找到冰箱,然后打开门,接着把大象赛进去,最后关上门。如果把每个步骤封装成一个方法,对于用户来说,只需要得到把大象装进冰箱这个结果,如果在设计时候暴露找冰箱等步骤,很有可能被别人偷梁换柱。所以,迪米特法则也保证了类的高内聚特性。

开闭原则

一句话概述:对修改关闭,对扩展开放

优点:

  • 提高重用性
  • 提高可维护性

开闭原则是目的,其他五大原则是手段

个人见解 开闭原则更适合称作为一种思想,其具体实现是通过其他五大原则。

总结

六大基本原则不需要过于刨根追底,本质上也不存在什么标准答案。就算一个系统设计得再符合六大原则的标准,也不见得比完全不符合的性能高多少。说得功利一点,面试被拒也轮不到六大原则来背锅。不过个人觉得六大基本原则和二十三种设计模式至少还是学习两遍,第一遍是刚学习编程的时候,还有一遍就是有一定实际开发经验,肯定会对自己不管是源码的理解还是新技术体系的接触有所帮助。

posted @ 2020-03-25 15:50  white_lei  阅读(591)  评论(0)    收藏  举报