清楚的确定系统的boundary
简单来说,系统的boundary就像一个加了标签的盒子,actor在盒子外,而Use Case在盒子内。我们称之为系统的这个盒子究竟是什么呢?一个
计算机系统?一个应用系统?或一个完整的企业?…Use Case 可以用来合理地描述任意系统。但一次只能用来描述一个系统,在一个系统中恰当定义的actor和Use Case用于另一个不同的系统中就会出现错误。
使用标准模板书写Use Case 说明书
Use Case 图形符号已经被标准化并作为对象管理小组UML的一部分,但自然语言的Use Case 说明书还没有被标准化。为了成功书写Use Case 说明书,我们需要一个标准模板来保证Use Case 的一致性。
关注actor的真正目的,从actor的观点而不是系统观点来命名Use Case
面向Use Case 的需求与传统的功能性系统需求之间最显著的区别在于actor ,以面向Use Case的观点,系统存在是由于actors 要通过该系统实现某些目标,actor与系统进行交互来实现其目标,我们将这些交互行为定义为Use Case 。
不要将Use Case 说明书与用户接口设计相混淆
现在有一种很流行的观点:由于Use Case 是actors 与系统之间的交互,所以将所有的用户接口设计图放在Use Case说明书中是一个好办法。初看时,这的确很有用,因为它将在说明书中描述的actor/系统之间的交互行为以图的形式表示出来,非常直观。但是这样做的负面影响却远远大于其好处,用户接口设计可能会随着时间而改变,我们不应该让系统需求依赖于用户接口设计,相反地,用户接口设计应该满足Use Case 需求。如果我们将用户接口设计置于Use Case 说明书中,当需求需要被认可和定为基线时,很自然地,这些设计元素可能仍然在改变,这就使得用户接口设计成为不完整的、不正确的和/或不一致的。
将用户接口设计置于Use Case 说明书还会出现另一个问题,为了在Use Case 之间和接口之间建立一对一的通信,我们会选择反映用户接口的Use Case块而不是反映用户目标的Use Case 块,这样,为了表达一个完整的用户目标,我们使用交互Use Case 关系,将不同的、基于用户接口的Use Case 联接起来,结果在Use Case 模型中,我们得到了一幅类似蜘蛛网的关系图。实际上,这副图是用户接口说明图,虽然它在系统文档中是很重要的一部分,但他属于用户接口设计文档,而不是Use Case 需求文档。
实现用户接口和Use Case 交互之间的松散耦合 松散耦合是比较合适的,低逼真度的用户接口图有助于理解Use Case ,但要注意不要过度的将基本交互与用户界面机制相连,用户界面很有可能会改变。在功能说明书中,要注意actor做些什么(如"提交请求")而不是交互是怎样完成的(如"双击提交按钮")。
不要在Use Case 和用户接口之间建立通信
试图在Use Case 和用户接口之间建立通信可能会存在潜在的、不正确的功能操作。Use Case 不仅与只能访问某个接口的actor相联,而且与那些能够更新该接口的actors相连(这可能是例外流),结果就造成了不正确的功能操作。我们应该在基于实际用户目标和功能操作的基础上拆分Use Case ,而不是在基于用户接口的基础上组合Use Case ,只有这样才能得到正确的Use Case 模型。
回顾Use Case 模型和Use Case 说明书,如果你不能防止所有的误区,你应该尽早认识问题并确定问题
这个观点并不是什么新东西,有关代码检查的经典算法已有大约25年历史了,但怎样将其应用于Use Case 呢? 首先,回顾Use Case 模型,回顾一下Use Case 的简单说明(Use Case 名称、目标、简单描述)。这项工作应在绘制草图时尽早执行,并在写详细的Use Case 说明书之前完成。接着是回顾Use Case 草图,保证图是正确的,并且详细的Use Case说明书是完整的。最后是正式回顾最终的Use Case 图和Use Case 说明书。
我们发现这种三阶段式回顾比单一的"宇宙大爆炸"式回顾有效,在我们花大量的时间写说明书之前,Use Case图中存在的许多实质性问题可以被发现,这种方法减少了当需求改变时需要做的重复工作。
Use Cases应用当中的复杂性和危险 主要行为者(Actor)和Use Case之间没有连结
一些情况下,从Use Case中取值的行为者(Actor)和积极参与这个Use Case的行为者(Actor)之间没有清晰的连结。如:
财务主管能成为“发票确认”的行为者(Actor),但他未必是创建发票的人。这不是什么问题,这个Use Case仍然是正确的,它正说明行为者取值和设计的系统的范围外的Use Case发生的初始化之间的关系。主要行为者是有用的,因为这个人扮演的角色是当你说明Use Case时需要跟他说的人。
情节步骤不需要连续
情节中步骤顺序的情况是没问题的,这里有一些机制去突出可能的并行步骤。在UML中活动图是首选的机制,通过非正式地看Use Case的情节你可以注意到可能的平行步骤;可以看Use Case内一些邻近的步骤;也可以有相同的行为者(Actor)对步骤负责。之前我们举过的例子里,确认数量和确认信用额可能是平行的。有时候在Use Case的说明文档中标记这些可能的平行步骤是有用的。
Use Cases的大小
当开始做Use Cases的时候有个很显然的危险就是它要么有很多步骤要么就很少步骤。如果在Use Case中有超过15个步骤,它可能包含一些实现明细。如果它只有非常少的步骤则检查它的目标是否是达到一个没有很多分支的活动的单一线索。
较少的人类行为者(Actor)
如果Use Case有较少的人类行为者,而大多数行为者是其它系统,通常的做法是修改这个Use Case。寻找系统必须做出反映或公认的事件胜过会见这些行为者。
需求捕获和系统复杂性
总而言之,这些情节捕获到系统复杂度的同时行为者:目标语句对容许大的系统以相对压缩的格式说明。Use Case的格式的作用是用户和开发者能标志出行为者,然后确认这些行为者工作职责对应(或不对应)的目标,代替一个大的很难读的功能规格说明书。
仅仅这样,用户和开发者就有足够的兴趣进而研究那些情节的细节。
系统不仅仅有应得的功能性需求
一些Use Cases并没有捕获所有的客观需求,仅仅是捕获了系统怎么用的那些功能性需求。然而还有许多方面的需求需要去捕获的。其中有的非功能性需求使用关联以至于也能隶属于个别的Use Case,如性能需求和系统容量的需求。另外的一些不是关联的而是要单独地去捕获,它们是以下的需求:
· 系统范围
· 系统用户的目标
· 用户界面原型
· 一般规则
· 约束
· 算法
运行时期和建立时期的需求比较
一个重要的因数要记住,就是系统的赞助者是大过用户团体的。系统中有许多的风险承担者,Use Cases仅仅捕获其中一些风险承担者的需要,具体说,Use Cases仅仅捕获系统运行时期的需求而忽略做为系统开发组织的风险承担者的需求,开发组织最有兴趣的是对建立时期需求的描述。
运行时期需求包括:系统范围、用户组织对产品的期望和目标、Use Cases、其它非功能性需求。
建立时期需求包括:减少
开发成本、较少的变更处理、现存组件的重用。
建立时期的需求可以部分的由Use Cases把握。但许多方面是需要由开发组织的处理的。
· 项目范围和目标:项目必须提交什么。(和系统范围的区别是它提交的是所有项目的东西)
· 增长性和
变更请求:这些可以在捕获为常规Use Cases格式中的“Change Cases”
· 开发负责人的约束:包括标准、习惯、工具、品质度量标准、品质保证原则、及品质保证的习惯。