请解释什么是对象设计原则(类的设计原则,包的内聚性设计原则,包之间的耦合性设计原则)?

(1)类的设计原则


(资料图片)

[1]单一职责原则(Single Responsibility Principle, SRP)

所谓职责,是指类变化的原因。此原则规定一个类应该只有一个发生变化的原因。

如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责,实际上就是耦合了多个不相关的职责,从而降低了这个类的内聚性。

[2]开—闭原则(Open-Close Principle.OCP)

一个类应当对扩展开放,对修改关闭。“对扩展开放(Open for Extension)"意味着类的行为是可以扩展的,当应用程序的需求改变时,可以对类进行扩展,使其具有满足改变的行为。“对修改关闭(Close for Modification)”意味着不用修改类,就能扩展这个类的新行为。

[3]里氏替换原则(Liskov Substitution Principle,LSP)

任何基类出现的地方,子类一定可以出现。LSP是继承复用的基石。只有当衍生类可以替换基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。

Liskov 于1987 年提出了一个关于继承的原则 Inheritance should ensure that any property proved about supertype objects also holds for subtype objects.—“继承必须确保超类所拥有的性质在子类中仍然成立”。也就是说,当一个子类的实例能够替换任何其超类的实例时,它们之间才具有is-A关系。

[4]依赖倒置原则(Dependence-Inversion Principle,DIP)

系统抽象化的具体实现,要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。

依赖倒置原则是很多面向对象技术的根基。它特别适合用于构件可复用的软件框架,有利于编写弹性、易于变化的代码;此外,由于抽象和细节彼此隔离,代码也便于维护。

[5]接口隔离原则(Interface Segregation Principle,ISP)

客户端不应该依赖它不需要的接口,一个类对另一个类的依赖应该建立在最小的接口上。要求接口的方法尽量少,接口尽量细化。

接口隔离原则和单一职责原则很相似,区别在于观察角度不同。前者是从调用者的角度来看;而后者从类或自身方法的角度来看。

[6]迪米特原则(Law of Demeter,LoD)

迪米特原则又叫最少知识原则(Least Knowledge Principle,LKP),也就是说,一个对象应当对其他对象有尽可能少地了解,即“不和陌生人说话”。降低系统的耦合度,使一个模块的修改尽量少地影响其他模块,扩展会相对容易。

[7]组合/聚合复用原则(Composition/Aggregation Reuse Principle,C/ARP)。

在面向对象的设计中,如果直接继承基类,会破坏封装,因为继承将基类的实现细节暴露给子类;如果基类的实现发生改变,则子类的实现也不得不发生改变;从基类继承而来的实现是静态的,不可能在运行时发生改变,没有足够的灵活性。

组合/聚合复用原则指出,在实际开发设计中尽量使用合成/聚合,不要使用类继承。

(2)包的内聚性设计原则

[1]共同重用原则(Common Reuse Principle,CRP)

一个包中的所有类应该是共同重用的,也就是说,如果重复用了包中的一个类,就要重用包中的所有类。换句话说,相互之间没有紧密联系的类不应该放在同一个包中。

[2]共同封闭原则(Common Closure Principle,CCP)

包中的所有类对于同一种性质的变化应该是共同封闭的。一个变化若对一个封闭的包产生影响,则将对该包中的所有类产生影响,而对于其他包则不造成任何影响,这样会减少软件的发布、重新验证和重新发布的工作量。

(3)包之间的耦合性设计原则

[1]无环依赖原则(Acyclic Dependencies Principle,ADP)

包之间的依赖结构必须是一个直接的无环图形(DAG)。换成另一个说法是,包之间的依赖不能是一个环状形式,否则对类的隔离会变得非常难。

[2]稳定依赖原则(Stable Dependencies Principle,SDP)

对于任何包而言,如果它是可变的,就不应该让一个难以更改的包依赖它。否则,可变的包也会难以更改。

[3]稳定抽象原则(Stable Abstractions Principle,ASP)

包的抽象程度应该和其稳定程度一致。稳定的包应该是抽象的,它的稳定性使其灵活扩展。一个包的抽象程度越高,它的稳定性越高。反之,它的稳定性就低。

明确对象设计任务后,在对象设计原则的指导下使用程序设计工具才能实施对象设计。总之,在对象设计阶段继续完善面向对象方法中的3个基础模型:对象模型、功能模型以及动态模型。

作者主页

https://blog.csdn.net/weixin_61964996

推荐内容