级别: 初级 Allen Holub (allen@holub.com), 首席技术官, NetReliance
2001 年 3 月 01 日 在我的上一篇专栏文章中,我介绍了正式的用例呈示的观念。本专栏文章的后续几个部分将涉及一些用例。它们涉及一个复杂的主题并涵盖很多资料,因此我们要拿出时间彻底地考虑这些问题。本月我们关注的是:如何决定该用哪些用例,以及在计划用例时应该考虑的其它事项。
创建用例
让我们再来看看上个月对
用例的定义:
用例是由系统的最终用户执行的具有一些有用结果的单一任务。
看着前几个月的 Allen银行问题陈述清单,几个用例浮现在我的脑海中:
- 小孩将钱存入帐户
- 小孩从帐户提取钱
- 小孩或家长查看存折
- 家长开户(opening account)
- 家长更改帐户
- 家长关闭帐户(closing account)
- 银行贷款给小孩(将在版本 2 中完成)
在本阶段,此列表只是一种猜想。随着过程的深入,肯定将会发现其它用例。此外,有些用例可能会过大,以至于必须要分解成小块。(通常,在进行到实现级别(implementation-level)设计时,用例的实现不应超过一个月。事实上,对于粗略估计而言,每个用例一个人月是一个不错的经验法则。有些方法? 如 Kent Beck 的 XP ?需要的是能在两周内实现的较小用例。)请注意我们没有列出低层的原子操作?如计算利息,因为它们不是独立的用例。但是这些用例几乎都会成为子例。
现在既然我已经写了
一些东西,那么就可以开始设计了。看着前面的列表,我有几个想法。首先,我不能肯定“存款”和“取款”是否为能分割开的用例。替代方法可能是类似于“完成交易”的用例,其中“交易”是存款或取款操作。具有相同工作流的两个用例当然是等价的,但我还不知道我的问题是否属于这种情况。目前,我将把两个用例都保留下来,因为在用户看来,它们显得不同,并且它们的外观结果显然也不同。(存款
增加余额而取款则
减少余额。“完成交易”用例
修改余额。)
当着眼于“查看存折”时,我根本不能确定它是否为一个用例。它没有特别的结果而且存折很可能是在其它用例的过程中被显示。经过考虑,我把这个用例改成“做假设分析(what-if)游戏”,它的确有一个结果:了解财务计划。
接下来,我考虑开户、关闭和更改帐户。同样的,尽管在用户看来结果肯定明显不同,但我可以设想“开户”和“关闭帐户”用例的工作流将是相同的。UI当然将是相同的 ?只是在开户时某些字段可能会是空白。这些细微差别可以在工作流中用简单的条件分支(“如果帐户是新的,则...”)处理。
我决定把“关闭帐户”作为一个真正的(尽管是琐碎的)用例,因为它的UI 将与开启/更改用例的 UI 不同。我不会象一般的银行那样当余额恰好为0.00美元时就自动关闭帐户,因为很容易想象小孩会将他们的帐户余额变为零,而在这种情况下我不想重做设置。
最后,我决定抛开“贷款”用例。它是版本 2的一个不错的特性,但现在不需要。
请注意在作这些决定时,我正在设想实现的细节(UI)。毕竟我在设计一个计算机程序,所以需要事先考虑它的实现。但是,我还是试着同时尽可能长时间地将思想集中到问题领域。我正在设想着实现以帮助理解域级(domain-level)问题,但我不是在设计实现,我也不是专门做这个的。UI就是一种帮助我理清关于域级问题的辅助设计工具。这种方法和 AlanCooper 推荐的 VB 风格的方法有很大不同,后者是 UI设计驱动程序设计过程。这里,程序将从概念模型中产生,而 UI仅仅只是开发那个概念模型的便利工具。
象“备份”、“保存”这样的事情不是用例,因为它们不是发生在问题领域。然而这也告诉我们一些有关程序应该如何工作的事情。退出
任何程序以前,不一定要显式地“保存”,本用例尤其如此。如果存款,那就是存款。需要一个象保存这样的额外操作才能意识到存款事务是不自然的。我保证十岁左右的小孩在退出前不会考虑什么保存。要是您考虑它,那么我可以告诉您,要求“保存”操作和使“放弃我的所有工作”成为程序缺省行为是同一回事?那并不是特别好的缺省行为。“备份”也是一样。要么象更改帐户状态的副作用那样,程序应该自动备份;要么程序必须维护一个审计跟踪以便撤销更改。“
任何不出现在域级的操作都应该出现在 UI中”的情况是很少见的。可能出现的例外也许包括“帮助”,但如果 UI十分直观就不需要帮助了。您可能会争论说程序应当通过留意您的行为来觉察到您需要帮助,并在那时提供帮助给您。大多数配置选项从来不被用户更改,所以用这种意义不大的东西使UI混乱是不明智的。(当然也有例外,象出现在问题领域的配置问题,如货币表示符号,当然它也可以通过检测当前语言环境来自动完成。)
暂定的用例列表如下所示。
- 小孩将钱存入帐户
- 小孩从帐户提取钱
- 做假设分析游戏
- 家长开户或更改帐户
- 家长关闭帐户
在后面的两篇专栏文章中,我将通过深入详细地说明“存款”用例来继续这个练习。我将为您展示用例规范本身和有关正在做什么的详尽注释。
参考资料
- 您可以参阅本文在 developerWorks 全球站点上的
英文原文.
- 请参阅我编写的关于 OO 设计过程系列文章的前五个部分:
-
- Kent Beck 的 XP 方法希望用例小到能在两周内实现。请在
Extreme Planning
wiki阅读相关内容。
- Alan Cooper 建议 UI 设计驱动程序设计过程。请在 uidesign.net 的
interview
中了解更多 Alan Cooper 的思想。
- 工作流程图(连同 UML 的剩下部分一起)在 Martin Fowler 和
Kendall Scott 合著的
UML Distilled, 2nd Ed一书中有详尽的描述。
关于作者  | |  |
Allen Holub 是 NetReliance 的
CTO,这是一家位于美国旧金山的公司,它们为可信的网上商业交易的管理建立安全的全球基础设施。(是的,我们在招聘。)他从
1979 起就一直在计算机领域工作,并出版过多篇文章。Allen 已经写了
八本书,包括他最新的
Taming Java Threads,它涉及 Java 线程的陷阱和缺陷。
他自己也不记得从事 OO 软件设计和构建的时间有多长了(使用 C++ 和
Java)。他从 1982 年起在美国加州大学伯克莱分校函授学院讲授 OO
设计和 Java。可以通过
allen@holub.com或
allen.holub@net-reliance.com
与 Allen 联系。Allen
还是作家,艺术家和可以做仪器导航飞行(instrument-rated)的商业飞行员。他拥有加州大学伯克莱分校中世纪史和计算机科学的学士学位。
|
对本文的评价
|