标题：use case
定义
Use Case（用例）是一个UML中非常重要的概念，在使用UML的整个软件开发过程中，Use Case处于一个中心地位。  Use Case 举例在UML的文档中，Use Case的定义是：在不展现一个系统或子系统内部结构的情况下，对系统或子系统的某个连贯的功能单元的定义和描述。其实Use Case就是对系统功能的描述而已，不过一个Use Case描述的是整个系统功能的一部分，这一部分一定要是在逻辑上相对完整的功能流程。在使用UML的开发过程中，需求是用Use Case来表达的，界面是在Use Case的辅助下设计的，很多类是根据Use Case来发现的，测试实例是根据Use Case来生成的，包括整个开发的管理和任务分配，也是依据Use Case来组织的。  UML设计软件对于每个Actor来说，他都要使用系统的某项功能，所以我们识别和分析Use Case时，要对于每个Actor来逐个进行。对于ToDo User，我们可以轻易的识别出两个Use Case：Add Task 和 Remove Task。ToDo User主动使用这两个Use Case所描述的系统功能，所以在我们的Use Case图上，ToDo User和这两个Use Case的关系是用从ToDo User发出的箭来表示的。对于FileSystem，我们识别出的也是同样的两个Use Case，不过这次箭头从Use Case指向FileSystem，表示FileSystem是被动的。
描述
Use Case可以用很多方式来描述，我们可以用自然语言（英语，汉语，随您的便），可以用形式化语言（哇！太酷了吧！），也可以用各种图示。在UML中，通常用两种图来描述Use Case，它们就是顺序图（Sequence Diagram）和协作图（Collaboration Diagram） 
Use Case 由以下元素组成：

USE CASE的来历
Ivar Jacobson在1967年定义爱立信AXE系统的构架时开始书写使用场境usage scenarios。
二十世纪八十年代中期Jacobson花了很多精力来思考过去十多年的工作方法。他造了一个术语anvendningsfall，大意是“使用情况”（situation of usage）或用况（usage case）。但当用英文出版的时候，他发现“useage case”在英语里说不通，所以写作用例“use case”
创建USE CASE的原则
用例是短文
用例可以是一个场景，包括动作和互交。
用例可以是一组场景，描述不同场景下的行为。这种书写格式可以在任何时候描述有变体的行为，例如黑盒需求，业务流程，系统设计说明。
用例里不要有系统设计
用例里不要有界面设计
用例里不要有特性列表
用例里不要有测试
用例应该描述行为需求
用例的主场景不要超过九步。可以在适当的层次上得到子目标和移除设计说明。
用例的最大价值不在于主场景，而是在于备选行为。主场景可能只占用例长度的四分之一到十分之一。
Use Case 事件流
Use Case具有一个基本事件流（可称为"理想路径"）、多个例外流，包括：
基本变化
特殊情况
处理错误情况的异常事件流
Use Case 说明书
Use Case 说明书应包括以下内容：
　功能描述
可用性
可靠性
性能
可支持性
设计约束
Use Cases将做成多大？
试图决定Use Case的大小是一个很有趣的话题，处理这件事的一个方法是将Use Case的大小跟它的意图和范围关联起来，对于一个真正大的范围来说，一个Use Case并不要在一个系统中处理那么多，但这些系统都用于同一商业领域，称为Business Use Case，它把整个公司看作一个黑盒和Actor关于公司目标的说明。这些Business Use Case的场景不允许假定任何公司内部的结构，一个客户将向公司下一个定单而不是客户服务部门。 
对于系统发展而言，Use Case的范围限制一个单一的系统，这是Use Cases最通常的形式，我们称之为System Use Case，它把整个系统看作是一个黑盒，它不指定任何内部结构并且仅受限于问题域的语言描述。
Use Cases的另一范围是设计子系统和系统内部组件的，称为Implementation Use Cases，它把组件看作一个黑盒，并且这些Actors是区分它的成员。例如：可能会用Implementation Use Cases去说明应用系统中email组件的需求。 
给出了这些分类，关于Use Case的大小话题变得容易了，设计这些项的范围来调整整个大小。帮助系统设计者，每个Use Case只描述没有大的分支的行为的单个线索。违背这个规定，Use Case看起来通常是不准确的或含糊的，作为测试说明的资源和参考，它也是很难使用的。
Use Cases的说明
Use Cases的好处是一些情节能用不同程度的正规化的文字说明。每个情节涉及Use Cases中单一的途径，细节是条件组。 
不正规的文本描述也能使用，不过当条件较多和可能失败的情况下它们很难跟随下去。开始试图理解需求时，不正规的叙述风格也是非常有用的，然而随着Use Cases的进展，使用更加正规的机制去说明Use Cases才是有用的。 
下面是客户对Use Case“下定单”的粗略概略： 
　“确定客户，找出需要的并且仓库里还有的物品并检查客户信用额是否够用” 
结构化叙述的格式已经被证明是非常有效的。这个格式所做的事是描述每一个情节的行为者：目标语句对顺序的叙述。在这个顺序中，每一个行为者：目标的语句对都假设前一个的目标是成功的，右面是一个简单的范例： 
Use Cases认为我们正在设计的系统是一个单一的黑盒，根本没有任何内部结构被记录下来，并且它被认为是一个情节产生的目的及对应单一的行为者（Actor）。这些Use Cases没有表示任何关于系统内部的东东，只是表示系统将达到什么样的目标及由什么（人或其它系统）操作和负责。
Use Cases使需求有利于回顾
Use Cases已经得到越来越广泛的应用，它与其它需求捕获技术相比，它成功的原因在于：
1 　Use Cases把系统当作一个黑盒 
2 　Use Case 使在需求中看到实现的决定变得更加容易 
最后一点源于第一点的补充，一个Use Case没有指定任何这些需求相关的系统的内部结构，所以说，如果这个Use Case中陈述了"提交改变到定单数据库"、"显示结果到Web页面"等的话，那么内部结构是显而易见的，并造成对设计的潜在约束。 
为什么这些需求不指定内部结构的原因是，说明的内部结构给设计者带来了额外的约束，没有这些约束设计者们能更自由地建立一个正确实现客观可见行为的系统，并存在出现突破方案的可能性。
Use Cases的图形符号
这里是Use Cases的图形符号描述，UML中一个单一的"Stick-Man"符号标示角色（Actor），用椭圆标示Use Cases，如
（图一）所示。这些图对于你想看到Use Cases之间如何关联的"大图"和获得系统上下文的大体描述来说是非常重要的。
Use Cases图没有显示不同的场景，它们的意图是显示角色和Use Cases之间的关系。所以Use Cases图需求用结构化叙述文本来补充。UML提供一些可供选择的图来显示不同的场景，这些常规的图形有交互图、活动图、顺序图、状态图等（本文暂不讨论这些图）。使用这些图的主要缺点是它们不象文本一样是紧密的，但它们能用于给出Use Case的整体感觉。
Use Case 的评价标准
是否每个Use Case 都包括至少一个actor？
是否每个Use Case 都独立于其他Use Case？
是否每个Use Case 都有一个简单的行为或事件流？
是否每个Use Case 都有一个唯一的、直观的、可扩展的名称，使它不至于在后期被混淆。
用户是否容易理解Use Case 的名称和描述。
Use Case 模型的评价标准
Use Case模型显示系统中的Use Case与Actor 及其相互关系。其评价标准有：
Use Case 模型是可理解的吗？
通过对Use Case 模型的研究是否能对系统功能有一个清晰的概念。
所有的actor都定义了吗？所有的功能需求都满足了吗？
Use Case 模型是否存在多余的行为。
从模型到Use Case包的划分是否是恰当的。
使用Use Case 的误区
由于具有简单的图形符号、易理解的自然语言说明书，Use Case在文档系统和软件需求领域成为一 项越来越受欢迎的技术。Use Case对开发小组极具吸引力，即使小组成员对正式的需求文档没有经验，但这些简单性却具有欺骗性，即使项目小组在开始使用Use Case 时没有任何麻烦，当他们将其应用于大项目时常常会遇到许多同样的问题。
使用 use case 十大误区
　1． 系统的boundary 没有定义或经常改变；
2． 从系统观点而不是actor观点来定义Use Case；
3． Actor的名称不一致；
4． Use Case 定义过多；
5． Use Case 和actor之间的关系象蜘蛛网一样错综复杂；
6． Use Case的说明太长；
7． Use Case的说明不清楚；
8． Use Case没有正确的描述功能需求；
9． 用户无法理解Use Case；
10． Use Case 无法正常结束。
如何避免以上问题
清楚的确定系统的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” 
· 开发负责人的约束：包括标准、习惯、工具、品质度量标准、品质保证原则、及品质保证的习惯。
Use Cases的适用性
Use Cases首先用于需要响应客观事件的系统。它们能用于提供了一个有很容易理解的目标的清楚的行为者的环境。当结果不可定义或不清晰时不能用Use Cases。意思是如果目标成功或目标失败不能有一个明确的定义，那么Use Cases不能用来捕获需求。 
然而说到这，现在大部分对象方法都使用Use Cases。因为Use Cases被证明是捕获需求的非常有效的机制。
Use Cases的模板
以上讲的是UML中的Use Cases。事实上，当人们在开发软件需求时也常常采用表格的形式来写usecase
下面就是软件需求文档中一种常用的 Use Case模板：
1.Brief Description（描述）
Briefly introduce the use case here.
2.Actor（角色）
List actor of the use case here. 
3.Pre-Condition（前置条件）
List pre-condition and assumption of this use case here. 
4.Trigger（触发/包含）
List trigger of this use case here. 
5.Flow of Events（流程）
5.1 Basic Flow（正常流程）
Step1......
Step2......
Step3......
Step4......
5.2 Alternative Flows（可选流程）
3a. Alternative flow1 of step3 condition here. 
3a1. Alternative flow1 detail step1 here. 
3a2. Alternative flow1 detail step2 here. 
3b. Alternative flow2 of step3 condition here 
3b1. Alternative flow2 detail step1 here. 
3b2. Alternative flow2 detail step2 here. 
……
5.3 Exception Flows（异常流程）
4a. Exception flow of step4 condition here. 
4a1. Exception flow detail step1 here. 
……
6. Special Requirements（特殊要求）
7. Post-Condition（后置条件）
8. Extension（备注）
此外可以添加上
9.（用例的标号）
10.（用例的名字）
11.auther（创建作者）
12.time（创建时间）
13.suppose（假设条件）
小结
Use Case 是系统提供的功能块，换句话来说Use Case演示了人们如何使用系统。通过Use Case观察系统，能够将系统实现与系统目标分开，有助于了解最重要的部分――满足用户要求和期望，而不会沉浸于实现细节。通过Use Case 用户可以看到系统提供的功能，先确定系统范围再深入开展项目工作。