用例是什么?
简单的理解:
直接理解就是使用的例子。
错误的理解:
用例就是功能的划分和描述, 认为一个用例就是一个功能点。
在这种理解下, 用例变成了仅仅是较早前需求中功能框图的翻版, 很多人用用例来划分子系统,功能模块和功能点。 如果这样, 用例根本没有存在的必要。
把用例解释为某个参与者(actor) 要做的一件事可能更为合适。
这件事情有以下几个特征:
1.这件事情相对独立。
也就是说这件事从“功能” 上说是完备的。
2.这件事的执行结果对参与者来说是可观测的和有意义的。
例如,系统会监控参与者在系统里的操作, 并在参与者删除数据之前备份。 虽然它是系统的一个必需组成部分, 但它在需求阶段却不应该作为用例出现。 因为这是一个后台进程, 对参与者来说是不可观测的, 它应该在系统用例分析阶段定义。 又比如说,登录系统是一个有效的用例, 但输入密码却不是。 这是因为登录系统对参与者是有意义的, 这样他可以获得身份认证和授权, 但输入密码却是没有意义的, 输入完了呢? 有什么结果吗? 这件事要对参与者有价值。
3.这件事必须由一个参与者发起。
不存在没有参与者的用例, 用例不应该自动启动, 也不应该主动启动另一个用例。 用例总是由一个参与者发起, 并且满足特征二。 例如从 ATM 取钱是一个有效的用例, ATM 吐钞却不是。 因为 ATM 是不会无缘无故吐钞的, 否则,我从此天天守在 ATM 旁, 生活无忧矣。
4.这件事必然是以动宾短语形式出现。
这件事必须有一个动作和动作的受体。 例如, 喝水是一个有效的用例, 而“喝” 和“水”却不是。 虽然生活常识告诉我们, 在没有水的情况下人是不会做出喝这个动作的, 水也必然是喝进去的, 而不是滑进去的, 但是笔者所见的很多用例中类似“计算”,“统计”,“报表”, “输出”, “保存”之类的并不在少数。
5.用例是以参与者为中心。
首先, 用例的背后是一种需求方法论。 其核心是以参与者为中心(区别于以计算机系统为中心), 从参与者的角度来描述他要做的日常工作(区别于以业务流程描述的方式), 并分析这些日常工作之间是如何交互的(区别于数据流的描述方式)。 换句话说, 用例分析的首要目标不是要弄清楚某项业务是如何一步一步完成的, 而是要弄清楚有多少参与者? 每个参与者都做什么? 业务流程分析则是后续的工作了。 其次, 用例简直就是为 OO 而的, 其思想完美的符合 OO。 用例分析方法试图找到问题领域内所有相对独立的参与者和事件, 并把业务流程当成是这些参与者和事件之间交互结果(在 UML 用活动图或序列图来描述)。
如果你的分析习惯是在调研需求时最先弄清楚有多少业务流程, 先画出业务流程图,然后顺藤摸瓜, 找出业务流程中每一步骤的参与部门或岗位, 弄清楚在这一步参与者所做的事情和填写表单的结果, 并关心用户是如何把这份表单传给到下一个环节的。 那么很不幸, 你还在做面向过程的事情。
如果你的分析习惯是在调研需求时最先弄清楚有多少部门, 多少岗位,然后找到每一个岗位的业务代表,问他们类似的问题: 你平时都做什么? 这件事是谁交办的? 做完了你需要通知或传达给谁吗? 做这件事情你都需要填写些什么表格吗?.... 那么恭喜你, 你已经 OO 啦!
用例分析是 OO 的第一步。 如果用例分析本身出了问题, 对业务架构, 软件架构的影响是很大的, 将大大削弱 OO 的优势--复用、 扩展。 笔者认为
软件复用可以分为三个层次:
(1).最低层次的复用是代码级复用,这是由 OO 语言特性提供支持的, 例如继承, 聚合,多态;
(2). 较高层次的复用是组件级复用, 这是由设计模式提供支持的, 例如 Factory 模式,Builder 模式;
(3).最高层次的复用则是服务级复用, 这在很大程度上是由应用服务器和通讯协议来提供支持的, 例如最近炒得火热的 SOA(面向服务的应用) 架构。 用例分析的好坏也许对代码级和组件级的复用影响不太大, 但对服务级的复用影响却是巨大的。 笔者认为服务级复用是 OO 的最高境界, 而结构良好的用例分析则是达到这一境界的基础。
参考:
OO_Road coffeewoo