(2)服务设计
如果某个类的对象必须要存储起来,则在类中应增加一个属性和服务用于完成存储自身的操作,这种属性和服务可以定义在对应类的构造和函数中,这样相应类的对象就知道怎么存储自己的属性和服务,在数据管理子系统和问题域管理子系统之间的自动架构必要的桥梁,不同数据存储管理系统的服务设计要点如下:
①文件管理系统:被存储的对象需要知道打开那些文件,在文件中如何定位、如何检索出旧值及如何更新它们,还需要定义一个Objectserver类,并通过该类对象提供下列服务,通知对象保存自己、检索已存储的对象(查找、读取值、创建并初始化对象等)以便由其他子系统使用这些对象。
②关系数据库管理系统:对象必须确定访问那些数据库表,如何检索到所需的元组,如何检索出旧值及如何更新它们,为此也需要定义一个Objectserver类,并通过该类对象提供下列服务,告知对象如何存储自己,检索已存储的对象(查找、读取值、创建并初始化对象等)以便由其他系统使用这些对象。
③面向对象数据库管理系统:对于在关系数据库上扩充的面向对象数据库管理系统,其使用方法与关系数据库管理系统的使用方法类似。对于由于面向对象编程语言扩充的面向对象数据库管理系统,无需增加服务,这种数据库管理系统已经给每个对象提供了存储自己的行为,只需要长期保存的对象加个标记,这类对象提供了存储和恢复即可由面向对象数据库管理系统负责万完成;对于新设计的面向对象数据库管理系统,系统本身就包含了相关的服务。
11.3服务、关联与聚合关系设计
面向对象分析的模型,通常不详细描述类中的服务及类之间的关联关系,面向对象设计则是扩充,完善和细化模型的过程。设计和细化类中的服务,关联关系是设计阶段的一项主要工作。
11.3.1服务设计
面向对象设计中的服务的设计可以分为两个步骤;确定类中应有的服务,设计实现服务的方法。
1、确定类中应有的服务
当开发进行到分析与设计阶段后,需要综合考虑分析阶段的4种模型才能正确确定类中应有的服务,设计者需要把动态模型中对象的行为和用例模型中的用例(数据处理)转换成由适当的类所提供的服务。
(1)从对象模型中引入服务:分析阶段对象模型中包含的服务可直接对应到设计阶段的服务,只是需要比分析阶段更详细地定义这些服务。
(2)从动态模型中确定服务:一般一张状态图描绘类对象的生存周期,图中的状态转换就是执行对象服务的结果,对象接收到事件请求后会驱动对象执行服务,对象的动作既与对象的状态有关,如果一个对象在不同状态可以接收同样的事件。而且在不同状态接收到同样事件时其行为不同,则实现服务的算法需要有一个依赖于状态的多分支控制结构来实现服务的算法。
(3)从用例模型中确定服务
用例图中的用表达了数据的加工处理过程,这些加工处理可能与对象提供的服务相对应,因此需要先确定操作的目标对象,然后再该对象所属的类中定义相应的服务。
2、设计实现服务的方法
(1)选择数据结构:在面向对象设计中,则需要选择能够方便有效实现算法的物理数据结构,多数面向对象程序员设计语言都提供了基本的数据结构方便用户选择使用。
(2)定义内部类和内部操作:基于分析阶段的模型,在设计时需要添加一些在需求陈述中没有提到的类,这些新增加的类主要用来存放在执行服务操作过程中的中间结果,分解复杂服务和操作时常常需要引入一些新的低层操作,这些都属于需要重新定义的内部类和内部操作。
(3)设计实现服务的算法
①算法复杂度:选用复杂度较低(效率较高)的算法,应以能满足用户需求为准。
②容易理解与实现:需要权衡利弊,找一个折中点,选择适当的算法。
③易修改和易维护:尽可能预测将来可能做的修改和维护,并在设计时提前做些准备。
11.3.2关联设计
对象模型中,关联是连接不同的对象的细节,指定对象相互之间的联系路径,分析阶段给出的关联,可能是笼统的关联关系,在设计阶段就需要对关联关系进行细化的分析和设计,先要做的是确定优先级,分析关联是单向关联还是双向关联,然后命名,标注关联中的限定符。uml中对象关联的一般表示如图11.7所示在对象图上。
关联用一条把对象连接在一起的实现表示,一个关联只是有两个关联端,每个关联端连接到一个类,关联端是由顺序的,关联系旁可以标出关联的名字,线旁的小实心三角箭头表示关联的方向。从源对象类指向目标对象类,关联的方向也可以在关联端加上箭头表示。
(1)单向关联与双向关联:单关联可以分为单向关联与双向关联。若无方向箭头,则表示双向关联。箭头表示关联的指向,图11.8和图11.9分别给出了两个对象类之间的单向关联和双向关联。
UML表示对单向孤立,类A为关联的源类,类B关联的目标类,表示类A的属性中包含了一个或多个类B的属性,对于双向关联则类A属性和类B属性中分别包含了对方的一个或多个属性。