面向对象设计的原则指南
我们在进行面向对象设计(OOD)时应该怎样进行,遵循什么原则呢?我们或许听说过设计模式,那是针对特定的问题提出的特定的解决方法。面向对象的设计从提出到现在经过很多人的经验和实践,也总结出了很多原则。
在设计开发中,如果能有意识地向这些原则靠拢,对我们的系统设计与开发会有很大的帮助,也是构筑具有稳定性,扩展性的系统的一个保障:
- 是否遵守了那些基本原则
- 如果违反了基本原则,是否存在合适的理由
这些被大师们总结出来的基本原则包括了:
1,类的设计原则
2,包的设计原则
2.1 包的内部关系方面(聚合性)的原则
2.2 包之间的关系方面(耦合性)的原则
类设计原则
The Single Responsibility Principle(SRP) - OO设计的单一职责原则
There should never be more than one reason for a class to change. 永远不要让一个类存在多个改变的理由。
The Open-Closed Principle(OCP) - 面向对象软件设计的开闭原则Software entities (classes, modules, function, etc.) should be open for extension, but closed for modification.
软件实体(模块,类,方法等)应该对扩展开放,对修改关闭。
The Liskov Substitution Principle(LSP) - OO设计的里氏替换原则
Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.所有引用基类的地方必须能透明地使用其子类的对象。
The Dependency Inversion Principle(DIP) - OO设计的依赖倒置原则
A. High level modules should not depend upon low level modules. Both should depend upon abstractions.B. Abstractions should not depend upon details. Details should depend upon abstractions.
A. 高层模块不应该依赖于低层模块,二者都应该依赖于抽象
B. 抽象不应该依赖于细节,细节应该依赖于抽象
The Interface Segregation Principle(ISP) - OO设计的接口分隔原则Clients should not be forced to depend upon interfaces that they do not use. 不能强迫用户去依赖那些他们不使用的接口。
包设计原则
包的内部关系方面(聚合性)的原则The Release Reuse Equivalency Principle (REP) - OO设计的重用发布等价原则
The granule of reuse is the granule of release.
重用粒度等价于发布粒度。
The Common Reuse Principle(CRP) - OO设计的全部重用原则
The classes in a package are reused together. If you reuse one of the classes in a package, you reuse them all.
包的所有类被一起重用。如果你重用了其中的一个类,就重用全部。
The Common Closure Principle(CCP) - OO设计的共同封闭原则
The classes in a package should be closed together against the same kinds of changes. a change that affects a package affects all the classes in that package. 一个包中所有的类应该对同一种类型的变化关闭。一个变化影响一个包,便影响了包中所有的类。
包之间的关系方面(耦合性)的原则
The Acyclic Dependencies Principle (ADP) - OO设计的无环依赖原则
The dependency structure between packages must be a directed acyclic graph (DAG). That is, there must be no cycles in the dependency structure.
包之间的依赖结构必须是一个直接的无环图形(DAG)。也就是说,在依赖结构中不允许出现环(循环依赖)。
The Stable Dependencies Principle(SDP) - OO设计的稳定依赖原则
The dependencies between packages in a design should be in the direction of the stability of the packages. A package should only depend upon packages that are more stable that it is.
GRASP设计模式简介
GRASP是General Responsibility Assignment Software patterns(通用职责分配软件模式)的简称,它的核心思想是“职责分配(Responsibility Assignment)”。GRASP提出了几个基本原则,用来解决面向对象设计的一些问题。Craig Larman氏在《Applying UML and Patterns》一书中提出了GRASP设计模式的概念。作者称其为设计模式,其实,更好的理解应该为设计原则。因为,与GoF等设计模式不同的是,GoF等设计模式是针对特定问题而提出的解决方法,而GRASP则是站在面向对象设计的角度,告诉我们怎么样设计问题空间中的类与它们的行为责任,以及明确类之间的相互关系等等。GRASP可以说是GoF等设计模式的基础。
GRASP是General Responsibility Assignment Software patterns(通用职责分配软件模式)的简称,它的核心思想是“职责分配(Responsibility Assignment)”,用职责设计对象:"Designing Objects with Responsibilities"。它包含了9个基本模式:
1,信息专家(Information expert)
2,创建者(Creator)
3,高内聚(High Cohesion)
4,低耦合(Low coupling)
5,控制器(Controller)
6,多态性(Polymorphism)
7,纯虚构(Pure Fabrication)
8,间接性(Indirection)
9,变化预防(Protected Variations)
GRASP的主要特征:
- 对象职责分配的基本原则。
- 主要应用在分析和建模上。
GRASP的核心思想的理解:
自己干自己的事(职责的分配)
自己干自己的能干的事(职责的分配)
自己只干自己的事(职责的内聚)
面向对象设计
所谓面向对象设计,就是在系统设计的过程中,通过把系统分成相对独立但又互相联系的对象组合的一种设计方法。对象具有属性和行为,对象间通过消息进行交互(协作)。
面向对象设计一般有以下几个关键步骤:
1,发现对象。找出系统应该由哪些对象构成。
2,对象的属性。对象具有哪些属性。
3,对象的行为。对象具有哪些行为,或者说对象需要做什么,它的职责是什么。
4,对象的关系。对象与对象之间的关系是什么,怎样进行交互,协作等等。
发现对象
对象的发现超出了本文的讨论范围。我们简单地介绍一下对象发现的过程与手段。 一般意义上的对象是现实世界上物体的抽象。也就是说,现实世界里有什么物体,就有什么对象;物体存在什么属性,对象就有什么属性。 我们可以用“名词筛选法”来发现系统的对象。
比如,一个学生考试成绩管理系统,有以下简单的用例:
- 管理员创建题库(把题条加入题库)
- 系统根据管理员输入的某些条件随机生成试题
- 学生成绩入库与管理
我们可以通过字面意思找出名词,就可以找出“管理员”,“题条”,“题库”,“试题”,“学生”,“学生成绩”等几个对象。一般通过这种方法(名词筛选法)就可以找出系统的绝大部分对象。
对象行为
行为是对象应该执行的动作,也就是对象的职责。对象具有哪些职责呢?相对于上面所说的“名词筛选法”,可以简单地用“动词筛选法”来发现“对象的行为”。 比如,上面的“学生考试成绩管理系统”一例中,有“创建题库”,“输入(条件)”,“生成试题”,“成绩入库”,“成绩管理”等动词,也就是说,系统的对象至少具有以上这些行为(或职责)。 有时,我们可能还会发现某些“行为”的粒度过大,这时,可以通过进一步细化用例的描述,来发现更多更细的“行为”。这里不再详述。
问题1:找出对象的行为(职责)之后,怎么样分配这些行为呢?也就是说怎么确认“行为”属于哪个对象呢?
对象关系
系统的所有对象不可能是一个个单独存在毫无关系的个体,它们或多或少的有着各种联系(协作关系)。
问题2:如果2个对象之间有协作关系,他们之间最好通过什么样的方式协作呢?
对象扩展特性
问题3:已经被抽象出来的对象,如何面对将来可能发生的变化呢?
GRASP提出9个基本模式,用于解决以上设计过程中遇到的各种问题。
本文转自:https://wenku.baidu.com/view/395bb7caa1c7aa00b52acb2f.html