活动: 用例分析
补充用例说明
在查找分析类以及它们的对象时,仅对每个用例进行说明往往还不足够。一般情况下,客户对有关系统内部情况的信息不感兴趣,因此在用例说明中就可能遗漏了这些信息。在这种情况下,用例说明读起来就象是一份“黑盒”说明,因为说明省略了有关系统响应主角动作的内部详细信息,或者有关说明解释非常粗略。要查找执行用例的对象,您需要有一份从内部角度观察系统响应的“白盒”说明。 示例 在有关自动柜员机 (ATM) 的情况中,该系统的客户很可能会说: “ATM 机用来验证银行客户卡。” 以此说明系统的用户身份验证行为。 虽然以上说明对客户而言可能是足够的,但是它并没有给我们任何具体的说明:ATM 机内部实际发生了什么操作来对卡进行验证。 为了从内部角度说明系统实际工作的方式,并且使说明达到确定各个对象的详细程度,我们可能需要更多的信息。以 ATM 卡确认活动为例,详细的说明如下所示: “ATM 机向 ATM 网络发送要求验证的客户帐号和 PIN。如果客户帐号和 PIN 匹配,ATM 网络返回验证成功,批准客户进行交易;否则 ATM 网络返回验证失败。” 此程度的详细信息为我们提供了一个清晰的概念,即需要什么样的信息(帐号和 PIN)以及由谁负责身份验证(ATM 网络,它是用例模型中的一个主角)。从这一信息中,我们可以确定两个可能存在的对象(即一个具有客户帐号和 PIN 属性的 Customer 对象和一个 ATM 网络接口)以及它们的职责。 检查用例说明以确定系统的内部行为是否已明确定义。系统的内部行为应清晰明白,这样才能明确系统必须做什么。没有必要定义系统内负责执行行为的元素(对象),只要清楚地定义需要做什么即可。 提供此详细程度的信息的人员包括能够帮助确定系统需要执行什么操作的领域专家。在考虑系统的某个特定行为时,可以提出一个针对性很强的问题:“执行此行为对系统意味着什么?”如果没有明确规定系统需要进行什么操作来执行此行为,就无法回答上述问题,因此可能需要发现更多的信息。 以下是补充说明事件流的备选方案:
从用例行为中查找分析类
查找一组备选的分析类是系统从纯粹说明所需行为到具体描述系统工作方式的转换过程中的第一步。在此过程中,分析类用来表示模型元素的“角色”,这些元素提供了满足用例指定的功能性需求以及补充需求指定的非功能性需求的必需行为。当项目的工作中心转移到设计时,这些“角色”就演进为实现用例的一组设计元素。 用例分析中确定的角色主要说明系统最上层的行为 - 应用程序专用行为和领域专用行为。边界类和控制类通常演进为应用程序层的设计元素,而实体类则发展为领域专用的设计元素。较低层设计元素通常从分析机制演进而来,分析机制的使用对象是在这里确定的分析类。 这里说明的技术从三种不同的系统角度来识别备选类。这三种角度分别是系统与其主角之间的边界角度、系统所用信息角度以及系统控制逻辑角度。边界、实体和控制等相应的类构造型都在分析期间使用,而不在设计期间使用。 确定类仅仅表示应对这些类进行标识、命名以及使用几个句子作简短说明。 有关确定分析类的详细信息,请参见指南: 分析类。有关用例实现的详细信息,请参见指南: 用例实现。 将行为分配给分析类对每一个独立的分支流(场景):
用例接收储存项的协作图。 说明职责
职责是要求某个对象执行的事务规定。职责在设计中演进为类的一个操作(但通常是几个);它们按特性可以归纳为:
每一个分析类应当具有几个职责;仅有一个职责的类可能过于简单,但是一个类具有十几个或更多职责则将逼近职责的极限数量,应该将其划分成几个类。 不言而喻,所有的对象都可以创建和删除;无需重申这个显而易见的事实,除非对象在创建或删除时执行某个特殊行为。(存在某些关系时,有些对象就不能被删除。) 查找职责职责是从协作图提供的消息中得到的。对每一条消息,检查向其发送消息的对象所属的类。如果职责尚不存在,则创建一个新的职责以便提供需要的行为。 其他职责将从非功能性需求中得到。创建新的职责时,请检查非功能性需求以确定其中是否有适用的相关需求。要么对职责的说明进行补充,要么创建新的职责来反映非功能性需求。 记录职责用简短的(最多几个单词)职责名称和简短的(最多几个句子)说明记录职责。该说明表述对象实现职责需要执行什么操作,以及调用职责时将返回什么结果。 说明属性和关联关系
为履行职责,类经常依靠其他类来提供必需的行为。关联关系记录了类之间的依赖关系,并帮助理解类的耦合;较好地理解类的耦合,并在可能的情况下减少耦合度,可以帮助我们构建更好的、更有弹性的系统。 以下步骤定义了类的属性以及类之间的关联关系: 确定属性类使用属性来存储信息。具体而言,信息属于以下情况时,需要使用属性:
另一方面,如果信息具有复杂的行为,被两个或更多对象共享,或者在两个或更多对象间“通过引用”传递,此时信息应当作为一个单独的类来构建模型。 属性名称应当是一个名词,它清楚地表述了属性保留的信息。 属性说明应当说明属性中将要存储的信息;如果从属性名称可以很明显地看出所存储的信息,则可以选择该方法。 属性类型就是属性的简单数据类型。示例类型包括字符串、整型、数值型等。 建立分析类之间的关联关系从研究在将行为分配给分析类中产生的协作图内的链接开始。类之间的链接指明两个类的对象需要互相交流,以便执行用例。 开始设计系统后,这些链接可以通过几种途径实现:
然而,在类的“生命”早期时刻就开始做出决定,未免为时太早了:我们还没有作出明智决策所需要的足够信息。因此,在分析中我们创建关联关系和聚合关系以表示(和“传递”)所有必须在两个类的对象之间发送的消息。(聚合关系是关联关系的一种特殊形式,它指明对象参与了一种“整体/部分”的关系(请参见指南:关联关系和指南:聚合关系))。 我们将在活动:类的设计中改进这些关联关系和聚合关系。 为每一个类绘制一个显示它和其他类关联关系的类图: 定单输入系统组成部分的分析类图示例 只需集中考虑实现用例必需的关联关系;不要添加您认为“或许”存在的关联关系,除非根据协作图要求添加这些关联关系。 赋予这些关联关系角色名称和多重性。
编写一份关联关系的简短说明,指明如何使用关联关系,或者关联关系表示了什么关系。 说明分析类之间的事件依赖关系对象有时需要知道事件什么时候在某个“目标”对象中发生,而“目标”对象则不必知道所有这些在事件发生时需要通知的对象。作为表示这种事件通知依赖关系的简写方式,订阅关联关系允许以紧凑简练的方式表示这种依赖关系。 两个对象之间的订阅关联关系指明在被订阅对象中发生某个特定的事件时,将通知订阅对象。订阅关联关系具有一项条件,它定义了使订阅者得到通知的事件。有关详细信息,请参见指南:订阅关联关系。 订阅关联关系的条件应利用抽象特征来表述,而不利用具体的属性或者操作来表述。这样,关联关系对象就可独立于可能经常变更的被关联关系实体对象的内容。 在以下情况下需要订阅关联关系:
“被订阅”对象通常是实体对象。通常,实体对象是信息的被动存储,而且任何行为一般都和它们的信息存储职责有关。很多其他的对象经常需要知道实体对象变更的时间。订阅关联关系则避免了实体对象必须知道所有其他对象的情况发生 - 它们只是“登记”了实体对象中有关信息,并且在实体对象变更时获得通知。 但现在这些实际上都只是一种“分析戏法”:在设计中我们必须确定这种通知的实际执行方式。我们可以购买一个通知框架,或者我们可能需要自己设计和构建一个框架。但对眼前来说,只要指出这种通知存在就足够了。 该关联关系指导说明只有订阅对象知道这两个对象之间的关系。订阅说明全部包含在订阅对象中。而被关联关系的实体对象仍以通常的方式定义,它不必考虑其他对象是否对其活动感兴趣。这也意味着订阅对象可以加入到模型中,或者从模型中删除,而不用改变它所订阅的对象。 限定分析机制
如果分析类使用了一种或几种分析机制,现已得到的有关附加信息将帮助构架设计师和设计人员确定构架设计机制应该具备的性能。分析类的实例数目、它们的大小、访问频率、以及预期的寿命等重要特征可以帮助设计员选择合适的机制。 在分析类使用的每一种分析机制中,限定在选择合适的设计机制与实施机制时必须考虑的相关特征。这些特性因机制类型不同而有差异;根据情况,或者如果存在很大程度的不确定性,则给出一个范围。不同的构架机制具有不同的特征,因此这种信息纯粹是说明性的,只需按照获取和传送信息的需要进行组织即可。在分析过程中,这种信息通常有很大的推测性,但是获得该信息很有价值,因为当更多的信息被揭示后,可以对推测得到的估计进行修正。 无须正式记录类所使用的分析机制以及它们的关联关系特征;在图中加上附注,或者对类的说明进行补充就足以表达这样的信息。此时,在类的演进过程中,特性信息不稳定,具有一定的推测性,因此重点是记录期望值,而不是规范机制的定义。 示例 航班类使用的永久性机制的特征可以限定为:
示例 任务类使用的永久性机制的特征可以限定为:
评估用例分析结果
在研讨班结束和活动: 用例分析完成时同时进行一项非正式的复审。 |
Rational Unified Process |