图中考核管理员和执法人员代表的是两个完全不同的角色,但他们在这个图中体现的是一些共有的特性,即对这堆报表的查询,因此被绘制成继承自普通用户。继承是参与者间的关系,代表继承者拥有被继承者所有的功能与权限。除了参与者以外,用例与用例直接也存在着一些类型的关系,这我们在后面详细讲述。
  在绘制用例图时一个值得思考的细节是,用例是怎样通过分析获得的。这个问题,在一些客户对信息化管理比较有经验的项目中不存在问题,因为在客户提供给我们的需求文档中清晰地划分出了一项一项的功能。这些功能可能会在日后的需求分析工作中有所调整,但它从整体上形成了一个雏形,成为我们进行用例分析进而形成用例的依据。
  但当我们面对的是一些对信息化管理没有经验的客户,情况有些不妙了。在这种情况下,通常客户只能给我们一些管理目标、基本想法,其它的调研工作需要我们自己去做了。这时,我给大家的建议是,首先从组织机构上划分清楚系统涉及哪些部门、哪些科室,然后在这个基础上划分出来这些部门这各个科室的人员都扮演哪些不同职能的角色,以及完成哪些业务操作。系统中的一个功能,在一般情况下是组织机构中某个(或多个)角色,为该机构某项业务流程完成的某个操作,并且这个操作应当有某个确定的结果(即产出物)。而这个功能是我们需要提取出来的用例。虽然功能角色分析在整个需求分析过程中可能会随着认识的深入而不断调整,但分析过程大体是这样进行的。
  有人说,我们绘制的用例图拿给客户看不懂。这样一个清晰明了的用例图,辅之以我们对图形的描述,客户怎么会看不懂呢?关键问题在于,我们没有将用例图的精髓弄明白,再加上出现一些常见问题,使得用例图画得不伦不类,客户当然看不明白了。现在我们看看用例绘制都有些什么常见问题。
  1. 没有正确理解用例图的视角。前面我反复强调了,用例图的视角是用户,也是说,站在用户的角度来观察的我们需要设计的系统。从这个视角,用户看到的系统是什么呢?当然是一项一项的功能,这些功能是客户能够理解的、具体的、对客户存在价值的功能。从这个意义上说,那些技术性的功能不应当出现在这里,或者应当描述为用户可以理解的文字,比如“自动考核”。而那些应当绘制的用例,在取名时也应当站在用户角度去取名。举个简单的例子,一个员工档案信息系统,以往我们总爱将用例取名为“添加员工信息”、“更新员工信息”、“删除员工信息”,这是典型的技术人员编写的用例。“添加员工信息”对于用户来讲应当是做什么呢——填写新员工资料;“更新员工信息”对于用户来讲又是做什么呢——更改员工资料;“删除员工信息”又是什么呢——员工注销。不论是“填写新员工资料”、“更改员工资料”,还是“员工注销”,对于客户都是日常工作中需要完成的操作,将用例命名为这些名字必然为用户所理解。同时,每一个用例对于用户来说应当是有价值的,也是说,用户使用这个功能是要完成一项操作,或获得什么信息。比如上图的“自动考核”会产生一批考核结果,执行“预警监控单项查询”可以获得预警监控结果数据。
  2. 图形绘制杂乱无章。一个系统,特别是一个大型系统,提供给用户的功能是繁杂的。如果你想将所有的功能,不管粗的细的,都试图绘制在一个用例图中,几乎没人看得懂。我们之所以将分析设计图形化,是因为图形能给人形象立体的感官,使人立即明白了其中的意思,但前提是,这个图形是主题清晰的、形象生动的。因此,我们绘制用例图要学会拆分,由粗到细地一个一个绘制。先整体的绘制,再划分成各个模块一个一个详细绘制,再进一步细化。所以,描述一个系统应当有许许多多的用例图。
  3. 用例是一个场景。在现实世界中,我们常常面对的是一个个长而复杂的操作流程,但在软件世界里,我们要将它们拆分成一个个的用例,怎样拆分?一个用例必须有一个场景,也是时间相近、地点单一的一系列操作,并且这些操作终应当有一个明确的结果。

  如上所示这个用例图,“申辩申请”是过错责任人填写了一张申辩申请单,终的结果是将申辩申请单提交给考核管理员;“申辩受理”是考核管理员接收了过错责任人的申辩申请单并予以受理,当然另一个结果是对其不予受理,该申请单被退回给过错责任人。每个用例都有确定的场景,明确的目的和结果。
  功能角色分析是对系统宏观的、整体的需求分析,它用简短的图形绘制出了一个系统的整体轮廓。但仅仅进行功能角色分析是远远不够的,我们还需要在它的基础上做更加详尽的分析。