首页 理论教育 软件系统分析与设计模式原则

软件系统分析与设计模式原则

时间:2023-10-16 理论教育 版权反馈
【摘要】:避免出现这个问题的办法便是遵循单一职责原则。因此抽象类和接口在开闭原则中既要预知可变的需求,又要预见所有可能的扩展。如果开闭原则是面向对象设计的目标,那么依赖倒置原则是达到开闭原则的基础与手段。使用继承时遵循里氏替换原则。运用接口隔离原则一定要适度,接口设计得过大或过小都不好,只有多花时间去思考和筹划才能准确实现这个原则。也就是说,陌生的类最好不要以局部变量的形式出现在类的内部。

软件系统分析与设计模式原则

1)单一职责原则(Single Responsibility Principle)

单一职责原则表示一个类只负责一项职责,不能将太多职责放在一个类中。因为一个类承担的职责越多,被复用的可能性就越小。若一个类负责多个职责,当一个职责需求发生改变而要修改类时,有可能导致其他的职责功能发生故障。避免出现这个问题的办法便是遵循单一职责原则。

单一职责原则是实现高内聚低耦合的指导方针,在很多代码重构手法中都能找到它的存在。单一职责原则虽然最简单却又最难运用,需要设计人员发现类的不同职责并将其分离,将职责分化为粒度更细的多个职责。

遵循单一职责原则有以下优点:

(1)降低了类的复杂度,类的职责清晰明确。

(2)提高了类的可读性和系统的可维护性

(3)变更是必然的,却可使变更引起的风险降低,对系统的扩展性、维护性都有很大的帮助。

2)开闭原则(Open Close Principle)

开闭原则指一个软件实体(如类、模块和函数)应该对扩展开放,对修改关闭。意思是在程序需要进行扩展的时候,不能去修改原有的代码,而是要扩展原有代码,实现热插拔的效果,使变化的软件具有一定的适应性和灵活性,使程序具有扩展性,易于维护和升级。

对开闭原则来说抽象化是关键,不允许修改的是抽象类接口,允许扩展的是具体的实现类。开闭原则用抽象构建框架,用实现扩展细节,从抽象派生的实现类来进行扩展,当软件需要发生变化时,只需要根据需求重新派生一个实现类来扩展即可。因此抽象类和接口在开闭原则中既要预知可变的需求,又要预见所有可能的扩展。

找到系统的可变因素,将其封装是实现开闭原则的关键,不要把可变因素放在多个类中,而应该将其封装起来。

3)里氏替换原则(Liskov Substitution Principle)

里氏替换原则由麻省理工学院教授Barbara Liskov提出,要求所有引用父类的地方必须能够透明地使用其子类的对象。即把父类都替换成它的子类的话,程序将不会产生任何错误和异常,但反过来则不能成立。

里氏替换原则通俗地讲就是子类可以扩展父类的功能,但不能改变父类原有的功能。它包含4层含义:

(1)子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。

(2)子类可以增加自己特有的方法。

(3)当子类的方法重载父类的方法时,方法的形参要比父类方法的输入参数更宽松。

(4)当子类方法实现父类的抽象方法时,方法的返回值要比父类方法的更严格。

遵循里氏替换原则是实现开闭原则的重要方式之一。实现开闭原则的关键步骤是抽象化,而父类与子类的继承关系就是抽象化的具体实现,所以里氏替换原则是对实现抽象化的具体步骤的规范。因此在程序中应尽量使用父类类型对对象进行定义,而在运行时再确定其子类类型,用子类对象替换父类对象。

4)依赖倒置原则(Dependence Inversion Principle)(www.xing528.com)

依赖倒置原则指高层模块不应该依赖低层模块,两者都应该依赖抽象,抽象不应该依赖细节,细节应该依赖于抽象。如果开闭原则是面向对象设计的目标,那么依赖倒置原则是达到开闭原则的基础与手段。

依赖倒置原则的核心是直接面向接口编程,而不是针对实现编程。在实际编程中,一般要做到三点:

(1)低层模块尽量都要有抽象类或接口。

(2)变量的声明类型尽量是抽象类或接口。

(3)使用继承时遵循里氏替换原则。

相对于细节的多变性,抽象的东西要稳定得多。以抽象为基础搭建起来的架构比以细节为基础搭建的架构要稳定得多。遵循依赖倒置原则的优点是可以减少类之间的耦合性,提高系统稳定性,降低并行开发引起的风险性,提高代码可读性和可维护性。

5)接口隔离原则(Interface Segregation Principle)

接口隔离原则指客户端不应该依赖它不需要的接口,一个类对另一个类的依赖应该建立在最小的接口上。即建立专用接口,尽量细化接口,每一个接口应该担任一种相对独立的角色,不要去建立一个庞大臃肿的接口供所有依赖它的类去调用。

使用接口隔离原则拆分接口时,首先必须满足单一职责原则,将一组相关的操作定义在一个接口中,在满足高内聚的前提下,接口中的方法越少越好,仅提供客户端需要的即可。接口隔离原则和单一职责原则的区别是:单一职责原则注重职责,而接口隔离原则注重对接口依赖的隔离;单一职责原则主要约束类,针对的是程序中的实现和细节,而接口隔离原则主要约束接口,针对的是抽象和程序整体框架的构建。

运用接口隔离原则一定要适度,接口设计得过大或过小都不好,只有多花时间去思考和筹划才能准确实现这个原则。

6)迪米特法则(Law Of Demeter)

迪米特法则又称最少知道原则,最早是在1987年由美国东北大学提出,指一个对象应当对其他对象有尽可能少的了解,使得系统功能模块相对独立。因为类与类之间的关系越密切,耦合度就越大,改变一个类对另一个类造成的影响也越大。

简单来说迪米特法则表示只与直接的朋友通信。只要两个对象之间有耦合关系,就说明这两个对象之间是朋友关系。耦合的方式很多,如依赖、关联、组合、聚合等。其中,称出现在成员变量、方法参数、方法返回值中的类为直接的朋友,而出现在局部变量中的类则不是直接的朋友。也就是说,陌生的类最好不要以局部变量的形式出现在类的内部。

迪米特法则减少了类之间的耦合度。系统扩展的时候可能需要修改类,而类与类之间的关系决定了修改的复杂度,相互作用越少,修改难度也越小。所以采用迪米特法则时要反复权衡,既做到结构清晰,又做到高内聚低耦合。

7)合成/聚合复用原则(Composite/Aggregate Reuse Principle)

合成/聚合复用原则表示要尽量使用合成/聚合,而不是使用继承来达到复用目的。即在一个新的对象里使用一些已有的对象,使之成为新对象的一部分,新对象通过向这些对象的委派达到复用已有功能的目的。

继承复用即“白箱”复用,其实现简单,易于扩展却破坏系统的封装性,没有足够的灵活性。合成/聚合复用即“黑箱”复用,耦合度较低,可以在运行时动态进行,使系统更加灵活。

合成/聚合复用原则和里氏替换原则相辅相成,两者都是具体实现开闭原则的规范。因此要避免在系统设计中出现一个类的继承层次过多。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈