第十七章:GRASP:基于职责设计对象
17.1UML与设计原则
重点内容由于UML只是一种标准的、可视化建模语言,了解它的细节并不能教会你如何用对象思想来思考,而对象思想正是此文的主题。UML有时候被描述成一种“设计工具”。
OO设计总得来说,是基于职责驱动设计(RDD)所代表的内在含义是考虑怎样给协作中的对象分配职责。
17.3职责和职责驱动设计
思考软件对象设计以及大型构件的流行方式是考虑其职责、角色和协作。这是被称为职责驱动设计的大型方法的一部分。
在RDD中,我们认为软件对象具有职责,即对其所作所为的抽象。UML把职责定义为“类元的契约或义务”。就对象的角色而言,职责与对象的义务和行为相关。职责分为以下两种类型:行为和认知。
对象的行为职责包括:
- 自身执行的一些行为,如创建对象或计算。
- 初始化对象中的动作
- 控制和协调其他对象的活动
对象的认知职责包括:
- 对私有封装数据的认知。
- 对相关对象的认知。
- 对其能够导出或计算的事物的认知。
在对象设计中,职责被分配给对象类。例如,我可以声明“Sale负责创建SalesLineItems”(行为职责),或“Sale负责认知其总额”(认知职责)。
准则:对于软件领域对象来说,由于领域模型描述了领域对象的属性和关联,因此其通常产生与“认知”相关的职责。 职责与方法并非同一事物,职责是一种抽象,而方法实现了职责。
RDD也包括了协作的思想。职责借助于方法来实现,该方法既可以单独动作,也可以与其他方法和对象协作。**
RDD使我们把OO设计看做是有职责对象进行协作的共同体。
17.4GRASP:基于OO设计的系统方法
GRASP:使用职责进行OO设计的学习工具
GRASP原则或模式是一种学习工具,它能帮助你理解基本对象设计,并且以一种系统的、合理的、可以理解的方式来运用设计推理。对这种设计原则进行理解和使用的基础是分配职责的模式。
17.5职责、GRASP和UML图之间的联系
在编写代码或建模时,如何给对象分配职责。在UML中,绘制交互图时考虑这些职责(实现方法)的时机
当我们在绘制UML交互图时,就是在决定职责的分配。
17.6什么是模式
如果以结构化形式对这些问题、解决方案和命名进行描述使其系统化,那么这些原则和习惯用法就可以称为模式
“新模式”是一种矛盾修饰法
术语“模式”真正的含义是长期重复的事物,设计模式的要点并不是要表达新的设计思想。恰恰相反,优秀模式的意图是将已有的经过验证的知识、惯用法和原则汇编起来。
17.8使用GRASP进行对象设计的简短示例
- 创建者
- 信息专家
- 低耦合
- 控制器
- 高内聚
(1)创建者模式的定义
名称:创建者
问题:谁创建了A?
解决方案:如果以下条件为真,将创建类A的实例的职责分给类B
B记录了A
B紧密的使用A
B具有A的初始化数据
(2)信息专家模式的定义
名称:信息专家
问题:给对象分配职责的基本原则是什么?
解决方案:把职责分配给具有完成该职责所需信息的类
(3)低耦合模式的定义
名称:低耦合
问题:如何减少因变化产生的影响?
解决方案:分配职责以使耦合保持在较低水平。用该原则对可选方案进行评估。
(4)控制器模式的定义
名称:控制器
问题:在UI层之上首先接受和协调(“控制”)系统操作对象是什么?
解决方案:把职责分配给能代表下列选择之一的对象:
1.代表全部“系统”、“根对象”、运行软件的设备或主要的子系统这些是外观控制器的所有变体)
2.代表发生系统操作的用例场景(用例或会话控制器)
(5)高内聚模式的定义
名称:高内聚
问题:怎样使对象保持有内聚、可理解和可管理,同时具有支持低耦合的附加作用?
解决方案:职责分配应保持高内聚,依次来评估备选方案。