【面向对象分析流程】
面向对象分析过程分为以下几步:
- 获取需求
- 整理需求
- 建立模型
- 需求规格说明书
- 复审
在获取需求阶段,可以通过以下方法来获取需求:
- 与用户交谈,向用户提问题
- 参观用户的工作流程,观察用户的操作
- 向用户群体发调查问卷
- 与同行、专家交谈,听取他们的意见
- 分析已经存在的同类软件产品,提取需求
- 从行业标准、规则中提取需求
在整理需求阶段,需要书写需求陈述,需求陈述内容包括问题范围、功能需求、性能需求、应用环境及假设条件。
面向对象分析模型由三个独立模型组成:
- 对象模型:描述静态结构,用类图和对象图表示
- 动态模型:描述交互过程,用状态图和顺序图表示
- 功能模型:指明系统数据之间的依赖关系,有关数据处理的功能,用数据流图表示
【对象模型】
概述
大型系统的对象模型通常由:主题层、类与对象层、结构层、属性层和服务层,这 5 个层次组成
这 5 个层次对应着在面向对象分析过程中建立对象模型的 5 项主要活动:划分主题、确定类与对象、识别结构、确定属性、确定服务。
划分主题
主题是把一组具有较强联系的类组织在一起而得到的类的集合
对于小系统来说,不需引入主题;对于中等系统来说,需要标识类及对象和关联,从而划分主题;对于大系统,先粗略识别对象和关联初步划分主题,通过分析,进一步修改和精炼主题
主题的划分有以下两种方式:
- 自底向上,先建立对象类,然后把对象类中关系较密切的类组织为一个主题。如果主题数量仍然很多,则可进一步将联系较强的小主题组织为大主题,直到系统中最上层主题数不超过 7 个,适用于小型系统或中型系统
- 自顶向下,先分析系统,确定几个大的主题,每个主题相当于一个子系统,将这些子系统再分别进行面向对象分析,建立各个子系统中的对象类,最终可将各个子系统合并为一个大的子系统,适用于大型系统
在划分主题时,可以利用以下技巧来进行划分:
- 把类图中每个结构作为一个主题
- 通过实例连接互相联系的类可划分到一个主题
- 不属于任何结构,也没有实例连接的类作为一个主题
上述的主题划分的最终结果能够形成一个完整的对象类图和一个主题图
主题图一般有如下表示方式:
- 展开方式:将关系较密切的对象类画在一个框内,框的每个角标上主题号,框内是详细的对象类图,标出每个类的属性和服务以及类之间的详细关系
- 压缩方式:将每个主题号及主题名分别写在一个框内
- 半展开方式:将每个框内主题号、主题名及该主题中所含的对象类全部列出
主题图的展开方式是为了表明系统的详细情况,压缩方式是为了表明系统的总体情况,半展开方式是两者的结合。
确定类与对象
建立对象模型首先要确定对象、类,需要列出所有候选类和对象,然后从候选类与对象中筛选掉不正确的或不必要的
识别类与对象的技巧有:
- 建立候选类列表
- 结合需求陈述中的名词确定
- 根据用例确定(边界类、控制类)
而筛选类与对象的依据有:
- 冗余:去除重复的描述,保留一个,例如,储户与用户,现金兑换卡与磁卡及副本等
- 无关:去除与本系统无关的对象,将密切相关类放进目标系统,例如,街道、营业厅等
- 笼统:去除掉无需记忆的笼统陈述,使其更具明确性,例如,软件、信息、网络等
- 属性:去掉为其它对象属性的名词,例如,现金、支票、余额等
- 操作:既为名词又为动词的,应慎重考虑
- 实现:去除与实现相关的类
识别结构
识别结构,又称确定关联,在经过初步确定关联后,经过筛选,进一步完善
在初步确定中,有如下技巧:
- 直接提取动词与动词短语
- 从需求陈述中寻找隐含的关联
- 与用户及领域专家讨论补充,根据问题域知识得出关联
初步确认后,需要进行筛选,技巧有:
- 在确定类与对象中,若已删除某候选类,那么与这个类有关的关联也应删去
- 删除与问题无关或与实现密切相关的关联
- 删除瞬时事件
- 三个或三个以上对象关联,可分解为二元关联或限定关联
在筛选完成后,需要通过以下步骤来进一步完善:
- 正名:给出容易理解的名字
- 分解补充:将一个综合功能的事务分解为两个单一功能的事务
- 标明阶数:标明这个对象或类跟多少个其它对象或类有关联
确定属性
属性是对象的数据特性,确定属性的过程分为分析与选择两个阶段
在分析阶段中,可根据需求陈述中的名词和形容词、借助领域知识和常识、问题域、目标系统的任务来确定属性
在选择阶段中,需要筛出不重要的或者不正确的属性,筛选的原则有以下几个:
- 该属性是否提供了系统中有用的信息
- 该属性是否描述这个对象本身的特征
- 该属性是否破坏了对象特征的原子性
- 该属性是否可以通过继承得到
- 是否可以从其它属性直接导出该属性
标识一个属性的启发性准则如下:
- 按一般常识这个对象应该有哪些属性
- 在当前的问题域中,对象应该有哪些属性
- 根据系统责任的要求,对象应具有哪些属性
- 建立对象是为了保存和管理哪些信息
- 对象为了在服务中实现其功能,需要增设哪些属性
- 对象有哪些需要区别的状态,是否需要增加一个属性来区别这些状态
确定服务
对象,是由描述其属性的数据以及可以对这些数据施加的操作(方法或服务),封装在一起构成的独立单元
因此,为建立完整的对象模型,既要确定类中应该定义的属性,又要确定类中应该定义的服务
但是,需要等到建立了动态模型和功能模型之后,才能最终确定类中应有的服务,因为这两个模型更明确地描述了每个类中应该提供哪些服务
实际上,在确定类中应有的服务时,既要考虑该类实体的常规行为,又要考虑在本系统中特殊需要的服务
【动态模型】
动态模型的建立可分为三步:
- 编写典型交互行为脚本
- 从脚本中提取事件及相关对象,用 UML 顺序图表达
- 确定对象状态及状态间转换关系,用状态图描绘
在建立动态模型过程中,脚本是系统执行某个功能的一系列事件,脚本描述用户与目标系统之间的一个或多个典型的交互过程,以便对目标系统的行为有更具体的认识
编写脚本是为保证不遗漏系统功能中重要的交互步骤,有助于确保整个交互过程的正确性和清晰性
脚本通常起始于一个系统外部的输入事件,结束于一个系统外部的输 出事件,它可以包括发生在这个期间的系统所有的内部事件,包括正常情况脚本、异常情况脚本、错误情况脚本
在脚本编写完成后,从脚本提取所有外部事件,以确定每类事件发送和接收对象,并针对系统中的典型功能,画出 UML 顺序图
此后,利用一张状态图描绘类的行为,集中考虑具有交互行为类
【功能模型】
功能模型表明了系统中数据之间的依赖关系,以及有关的数据处理 功能,它由一组数据流图组成。数据流图中的处理对应于状态图中的活动或动作,数据流对应于对象图中的对象或属性
建立功能模型的步骤如下:
- 确定输入和输出
- 画数据流图
- 定义服务
一般来说,数据流图中的输入和输出值是系统与外部之间进行交互的事件的参数。
在面向对象方法中,数据源往往是主动对象,它通过生成或使用数据来驱动数据流;数据终点接收数据的输出流;数据流图中的数据存储是被动对象,本身不产生任何操作,只响应存储和访问数据的要求;输入箭头表示增加、更改或删除所存储的数据;输出箭头表示从数据存储中查找信息。
类的服务与对象模型中的属性和关联的查询有关,与动态模型中的事件、功能模型的处理有关
通过分析,可以把这些服务添加到对象模型中去,类的服务有以下几种:
- 对象模型中的服务
- 从事件导出的服务
- 来自状态动作和活动的服务
- 与数据流图中处理框对应的操作