什么是设计原则?
S.O.L.I.D 是面向对象设计(OOD
)的头五大基本原则的首字母缩写,由俗称「鲍勃大叔」的 Robert C. Martin
提出。这些原则,结合在一起能够方便程序员开发易于维护和扩展的软件,也让开发人员轻松避免代码异味,易于重构代码,
也是敏捷或自适应软件开发的一部分。
注意:这只是一篇“欢迎来到S.O.L.I.D
”的简单介绍文章,它只是揭示了S.O.L.I.D
是什么。
S.O.L.I.D代表什么:
虽然缩略词展开后看似复杂,但其实非常容易掌握。
S – 单一职责原则
O – 开放封闭原则
L – 里氏替换原则
I – 接口隔离原则
D – 依赖倒置原则
让我们来单独看看每个原则,来理解为什么 S.O.L.I.D
能帮助我们成为更优秀的开发人员。
五大基本原则:
一、单?职责原则(SRP:Single Responsibility Principle)
背景:
二、??替换原则(LSP:Liskov Substitution Principle)
三、依赖倒置原则(DIP:Dependence Inversion Principle)
四、接?隔离原则(ISP:Interface Segregation Principle)
五、开闭原则(OCP:Open Closed Principle)【总则】
其他原则:
一、迪?特原则(LKP:Least Knowledge Principle )
二、合成复用原则(CRP: Composite Reuse Principle)
合成复用原则就是指在一个新的对象里通过关联关系(包括组合关系和聚合关系)来使用一些已有的对象,
使之成为新对象的一部分;新对象通过委派调用已有对象的方法达到复用其已有功能的目的。
又叫组合/聚合复用原则(Composition/Aggregate Reuse Principle,CARP)。
它要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。
简言之:要尽量使用组合/聚合关系,少用继承。
合成复用原则的重要性:
通常类的复用分为继承复用和合成复用两种,继承复用虽然有简单和易实现的优点,但它也存在以下缺点。- 继承复用破坏了类的封装性。因为继承会将父类的实现细节暴露给子类,父类对子类是透明的,所以这种复用又称为“白箱”复用。
- 子类与父类的耦合度高。父类的实现的任何改变都会导致子类的实现发生变化,这不利于类的扩展与维护。
- 它限制了复用的灵活性。从父类继承而来的实现是静态的,在编译时已经定义,所以在运行时不可能发生变化。
采用组合或聚合复用时,可以将已有对象纳入新对象中,使之成为新对象的一部分,新对象可以调用已有对象的功能,它有以下优点。
- 它维持了类的封装性。因为成分对象的内部细节是新对象看不见的,所以这种复用又称为“黑箱”复用。
- 新旧类之间的耦合度低。这种复用所需的依赖较少,新对象存取成分对象的唯一方法是通过成分对象的接口。
- 复用的灵活性高。这种复用可以在运行时动态进行,新对象可以动态地引用与成分对象类型相同的对象。
合成复用原则的实现方法:
合成复用原则是通过将已有的对象纳入新对象中,作为新对象的成员对象来实现的,新对象可以调用已有对象的功能,从而达到复用。下面以汽车分类管理程序为例来介绍合成复用原则的应用。
【例1】汽车分类管理程序。
分析:汽车按“动力源”划分可分为汽油汽车、电动汽车等;按“颜色”划分可分为白色汽车、黑色汽车和红色汽车等。如果同时考虑这两种分类,其组合就很多。图 1 所示是用继承关系实现的汽车分类的类图。
图1 用继承关系实现的汽车分类的类图
从图 1 可以看出用继承关系实现会产生很多子类,而且增加新的“动力源”或者增加新的“颜色”都要修改源代码,这违背了开闭原则,显然不可取。但如果改用组合关系实现就能很好地解决以上问题,其类图如图 2 所示。
图2 用组合关系实现的汽车分类的类图