软件设计原则-上

在程序设计领域, SOLID(单一功能、开闭原则、里氏替换、接口隔离以及依赖反转)是由罗伯特·C·马丁在21世纪早期引入的记忆术首字母缩略字,指代了面向对象编程和面向对象设计的五个基本原则。当这些原则被一起应用时,它们使得一个程序员开发一个容易进行软件维护和扩展的系统变得更加可能。

开闭原则

定义: 一个软件实体如类、模块和函数应该对扩展开放,对修改关闭

  • 用抽象构建框架,用实现扩展细节
  • 优点: 提高软件系统的可复用性及可维护性
  • 实现核心: 面向抽象编程

Code 演示

开闭原则实现

JavaCourse 实现类

JavaDiscountCourse 子类

测试类

依赖倒置原则

定义: 高层模块不应该依赖低层模块,二者都应该依赖其抽象

  • 抽象不应该依赖细节,细节应该依赖抽象
  • 针对接口编程,不要针对实现编程
  • 优点: 可以减少类间的耦合性,提高系统稳定性,提高代码可读性和可维护性,可降低修改程序所造成的风险

Code 演示

依赖倒置原则实现

接口

实现类1

实现类2

实现类3

业务类

测试类,高层模块

单一职责原则

定义: 不要存在多于一个导致类变更的原因

  • 一个类/接口/方法只负责一项职责
  • 优点: 降低类的复杂度、提高类的可读性,提高系统的可维护性、降低变更引起的风险

Code

类没有使用单一职责

这个例子中的 Bird 类同时为两种鸟类移动的行为负责,每次增加或修改一个鸟类都会影响到其他鸟类的行为

Bird类

测试类

类应用单一职责原则

这个例子中每种鸟都有自己的行为类负责,增加或修改某个鸟类,不会影响到其他的鸟类

类遵循了单一职责原则设计

会飞的鸟类

用脚走路的鸟类

测试类

接口没有遵循单一职责原则

下面这个接口没有遵循单一职责原则,getCourseName()getCourseVideo 属于课程信息相关的职责,而 studyCourse()refundCourse()却属于课程管理相关的职责

没有遵循单一职责的接口

接口遵循单一职责原则

接口遵循了单一职责原则设计

课程信息接口

课程管理接口

实现类实现两个课程相关的接口

方法采用单一职责原则

方法的单一职责原则

单一职责原则的总结

单一职责原则告诉我们: 一个类不能太”累”,在软件系统中,一个类(大到模块,小到方法)承担的职责越多,它被复用的可能性就越小,而且一个类承担的职责过多,将相当于将这些职责耦合在一起,当其中一个职责变化时,可能会影响其他职责的运作,因此要将这些职责进行分离,将不同的职责封装在不同的类中,即将不同的变化原因封装在不同的类中,如果多个职责总是同时发生改变则可将他们封装在同一个类中。

实际项目开发过程中,如果所有的类、接口、方法都遵循单一职责原则,可能会导致类的数量巨大,结合项目的开发周期,开发人员代码水平的不同,不可能让类、接口、方法都遵循单一职责原则,但我们应尽量保证接口与方法遵循单一职责原则。

Author: csthink
Link: csthink.com/java/desing_principle_part_one.html
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
支付宝打赏
微信打赏