UML与设计原则
由于UML只是一种标准的、可视化建模语言,了解它的细节并不能教会你如何用对象思想来思考,而对象思想正是此文的主题。UML有时候被描述成一种“设计工具”。最关键的软件开发工具是受过良好设计原则训练的思维,而不是UML或任何其他技术。
OO设计总得来说,是基于职责驱动设计(RDD)所代表的内在含义是考虑怎样给协作中的对象分配职责。
职责和职责驱动设计
思考软件对象设计以及大型构件的流行方式是考虑其职责、角色和协作。这是被称为职责驱动设计的大型方法的一部分。在RDD中,我们认为软件对象具有职责,即对其所作所为的抽象。UML把职责定义为“类元的契约或义务”。就对象的角色而言,职责与对象的义务和行为相关。职责分为以下两种类型:行为和认知。
对象的行为职责包括:
- 自身执行的一些行为,如创建对象或计算。
- 初始化其他对象中的动作。
- 控制和协调其他对象中的活动。
对象的认知职责包括:
- 对私有封装数据的认知。
- 对相关对象的认知。
- 对其能够导出或计算的事物的认知。
在对象设计中,职责被分配给对象类。例如,我可以声明“Sale负责创建SalesLineItems”(行为职责),或“Sale负责认知其总额”(认知职责)。
准则:对于软件领域对象来说,由于领域模型描述了领域对象的属性和关联,因此其通常产生与“认知”相关的职责。
职责与方法并非同一事物,职责是一种抽象,而方法实现了职责。
RDD也包括了协作的思想。职责借助于方法来实现,该方法既可以单独动作,也可以与其他方法和对象协作。RDD是一种隐喻。RDD是思考OO软件设计的一般性隐喻。把软件对象想象成具有某种职责的人,他要与其他人协作完成工作。RDD使我们把OO设计看做是有职责对象进行协作的共同体。
关键点:GRASP对一些基本的职责分配原则进行了命名和描述,因此掌握这些原则有助于支持RDD。
GRASP:基于OO设计的系统方法
GRASP:使用职责进行OO设计的学习工具
GRASP原则或模式是一种学习工具,它能帮助你理解基本对象设计,并且以一种系统的、合理的、可以理解的方式来运用设计推理。对这种设计原则进行理解和使用的基础是分配职责的模式。
职责、GRASP和UML图之间的联系
在编写代码或建模时,如何给对象分配职责。在UML中,绘制交互图时考虑这些职责(实现方法)的时机。从以下图可以看出,Sale对象具有创建Payment的职责,具体实现是,使用makePayment消息向Sale发出请求,Sale在相应的makePayment方法中进行处理。此外,完成这个职责需要通过写作来创建Payment对象,并调用其构造器。
因此,当我们在绘制UML交互图时,就是在决定职责的分配。
下一篇文章就关于使用GRASP的对象设计给出一个示例