这篇我本来不想写这个子篇的,原打算直接找个博文,链接过去引用个教程就行了,但搜索了很多文章,我才发现目前的软件开发人员,对用例图有这么大的误会。一个网友这样写到,“用例图中的边界没有什么用,平时不会用到,这里就不介绍边界了”,我看到这段论述真是又气又笑,觉得很有必要写下这个入门教程,科普下怎么使用用例图。
用例图的概念和定义我这里就不说了,它仅仅是个工具,我只谈这个工具适合用来表达什么。之所以我们有UML语言这中说法,是因为UML可以理解和汉语、英语一样的一种语言,它是用来表达和传递一种信息的语言。用例图适合用来表达,组织或者系统能为谁提供什么样的服务。
用例分为两种,业务用例和系统用例,业务用例用来表达组织能为业务执行人,提供怎样的服务。系统用例用来表达系统能为业务执行人,提供怎样的服务。
【业务用例】
以下图为例,用例图包含了3种元素,为了避免翻译不当照成的误会,3中元素的命名备注上了原先的英文命名,三种元素含义分别如下:
业务执行人:可以理解为向组织或者系统发起服务人或物。此例子为人。
业务用例:可以理解为某种服务,服务必须满足3个条件,一是服务是业务执行人期望从组织和系统获取的,二是服务是组织向业务执行人承诺的,三是服务对业务执行人有价值。
边界:提供服务的组织或系统的边界,用来划清组织/系统内部和外部的界限,此例子为组织的边界。
以上用例图,表达这样的含义:员工期望休年假(业务执行者期望获取一个有价值的服务),在Z公司的能力范围之内,Z公司向员工提供休年假这种福利。(组织向业务执行人,提供能力边界内并能承诺满足的服务,超出它能力边界且无法承诺的服务,组织是提供不了的,比如Z公司不提供B公司才敢向员工承诺的每年15天高温假)。
谈到这里,有人可能会说,“不对啊,平时我都是跟我的部门经理申请休假了,为什么边界不是我上司”。其实仔细一推敲,你会发现,休年假是公司按照国家规定,给予员工的福利,但公司对休假会加上一些条款,避免额外的经济损失,比如连续请10天假,要提前一个月申请,以便用人部门提交工作交接,避免员工突然休假照成更大的经济损失。员工的上司只是具备核实员工休假是否满足公司休假条款的权利,上司并不承诺为员工提供休年假的福利。
扯了这么多,识别业务用例有什么用?识别业务用例,是帮忙我们聚焦要做业务分析和流程改进的问题域。如果不明白这段话的含义,请看我系列文章的主线文章“业务现状分析”。
【业务用例之业务工人(case worker)】
看完上文的阐述,有人会想,如果部门经理也参与到这个问题域,并且审批员工的年假,用例图是不是应该这样画。
答案是错的,大错特错。审批年假,对部门经理没什么价值。部门经理是做为一个业务工人参与进来。从休年假这个业务流程中,获取价值的是员工,部门经理一个被动响应请求,并且处理请求的业务工人,公司要求部门经理在员工发起休假申请的时候,有责任和义务帮公司审核员工的请假申请,以避免因员工休假给公司带来过大的经济损失。业务工人可以这样理解:
业务工人:按组织的要求,在业务流程中有责任和义务处理指向自己的请求的人或物。
如果想在用例图表达业务工人,可以这样画图。
【业务用例之一个用例一个流程】
如果经理和普通员工,同样有休年假的福利。用例图是不是可以这样画?
这还真的未必,这个用例还需要具体问题具体分析。如果部门经理的休年假业务流程,跟普通员工的不一样,比如部门经理需要事业部经理审批才能休年假,普通员工只需要经理审批就行了。虽然用例的名字是一样,但背后的业务流程并不一样,这实际上是两个不同的用例,如果这样定义用例,可能会导致只分析了一个业务流程。需求分析人员,切忌在业务分析阶段,就对业务进行抽象。做业务分析的思路,跟做系统设计的思路刚好相反,业务分析是把抽象问题具体化,系统设计是将具体问题抽象化。
如果实际情况,是像上文的假设,普通员工和部门经理休假流程不一样,用例应该这样画。
【系统用例】
系统用例和业务用例有什么区别?
在开发一个考勤休假系统之前,员工向公司发起个休年假的请求,公司的年假处理流程是这样子的。
(这个图不是什么标准的画法,只是辅助我表达清楚一个意思。)
首先,员工发邮件给人力专员,抄送给部门经理,提出申请年假。邮件内容包括计划休假n天,休假的计划开始时间和计划截至时间,休假的原因。
其次,人力先核实下员工能不能休所请求天数的年假。这个核查挺费尽的,人力专员第一步先查一下员工入职时间,这些信息人力专员记录在excel上面,第二步,人力专员根据员工入职时间,计算出该员工今年可以休多少天年假,第三步,人力再查下该员工今年休了多少年假,这个信息也记录在excel上面,如果申请的天数不超过了剩余可休的天数,请求才得以通过。第四步人力,回复审核意见邮件给部门经理,抄送给员工。
最后,部门经理根据人力的反馈,再根据实际工作情况,通过邮件反馈审批结果给员工。
(以上其实是一种“土法”的改进前业务流程描述)
在开发一个考勤休假系统之后,年假处理流程变成以下情况:
首先,员工通过系统,填写年假申请,并保存到系统。系统在员工提交申请之前,自动计算员工今年能申请多少天年假,今年已经休了多少年假,还可以申请多少天,如果超过申请天数,压根不给提交申请。
其次,部门经理收到系统的消息通知,打开消息之后,可以看到员工的申请信息,根据时间工作情况,决定是否同意休年假。
最后,以上员工和部门经理在系统处理的信息,都会呈现给人力专员看,人力专业可以随时调用查看。
(以上其实是一种“土法”的改进后业务流程描述)
以上所描述的场景,虽然改进前和改进的业务流程,和参与进来的实体并不一样,但业务用例都是同一个,既员工休年假的业务用例。边界是Z公司。业务用例的边界,一般我们要研究和要改进的组织,即使我们对组织的业务流程进行了重组和改造,组织提供的价值也没有变化,既业务用例也不会变化。
系统用例跟业务用例的区别呢?
以下图中,绿色框内的用例图,就是系统用例图。系统用例的边界,是我们设计开发系统。系统执行者,是向系统发起请求的人或物。如下图的系统用例图,表达这样的意思:员工向系统请求保存休假申请,部门经理向系统请求保存审批休假结果,人力专员向系统请求显示休假记录。
系统用例与业务用例最大的区别是,系统用例的边界是系统,业务用例的边界是组织。系统是组织业务流程流转过程中的一个实体,所以系统用例的边界是小于业务用例的。
这系统用例图的翻译,我用“请求”这两个字,是很有深意的,同时用例的命名,也是有深意的。请看下图,我为什么没有按下图右侧的系统用例图的写法来写?
回到文章开始时对用例图的适合的使用场景的描述,用例图适合用来表达,组织或者系统能为谁提供什么样的服务。然后我们再审视下上图绿色框部分的用例图。
系统为员工,提供了“填写休假申请”申请的服务了吗?仔细一琢磨,填写休假申请,其实是员工通过电脑和键盘,敲字填写申请的,系统可没有帮员工“填写休假申请”,所以这个用例的写法有有错误,系统真正提供的服务,是帮员工把这个申请休假的请求存储起来。那有人说,我用“提交休假申请”总可以了吧,那“提交”指的是员工点击系统“提交”按钮这个动作,还是系统程序执行commit这段语句,这种命名方法边界是很模糊的,所以还是建议用边界比较清晰的措词。
上图左右两边的用例图,用例名称写法很不一样,是因为左边的写法是从系统的角度出发,描述系统会会提供什么,右边的写法是从人的角度出发,描述人的行动。右边的画法是表达不清楚系统要干什么的,因为它关注点是人做了什么,而不是系统要做什么,这违背了我们画系统用例的初衷,我们画系统用例图的目的,是要标明在整个业务流程中,哪些事情是我们系统要做的,是我们要开发的,哪些事情,是交给业务流程中其他实体去做的。
其实以上所谓正确的系统用例例子,我是写简单了,较为完整的系统用例,既系统要提供的服务,不只这些。比如,在员工填写休假申请单时,系统还提供了一个填写模板。一般情况下,系统的设计者都会设计一个工单,比如有申请人、申请休假时间段、申请休假理由等字段,以便方便格式化要收集的信息,如果没有这种格式化数据的需求的话,设计者给个空白的textarea就行了,这相当还有个“提供休假申请单”的用例,员工在填写工单前,系统还帮忙计算员工剩余可休年假的天数,既还有个“计算剩余可休年假天数并回显”的用例,员工填写工单的时候,在填写过程或者提交的时候,系统还提供校验正确性的服务,既还有个“校验工单正确性”的用例,也就是说,员工的系统用例图还要完善成这样:
按照上面的画法,系统要开发什么功能,是不是就比较清晰了。有人就犯难了,那不是拍脑袋来想需要做什么功能吗?漏了一些重点怎么办。不用担心,我们有一套完整方法来找出系统的用例图。可以看我的系列文章“业务现状分析”和“业务流程改进”,从业务用例到系统用例,是有一道完整的工序的,业务用例=》业务现状分析=》业务流程改进=》系统用例,目前还只是开胃小菜。
【系统用例之常见误区】
有人会这样想,我系统模块同多了,用例也挺多,为了方便结构化区分和管理用例,可以分层,分模块表达用例。
上面的左侧,相信大家看起来很熟悉,没错,很多人都这样画,网上大部分教程都是这样画的,用一个宽泛的“管理”这个概念,把说不清道不明的系统要提供什么功能,给抽象表达出来。申请年假管理一系列交互中,有人、有系统等业务实体,系统到底要开发什么功能,根本没表达出来,这相当于既错误又没用的费话。
右图,把用例包在“休假模块”这个边界里面,看起来没什么问题,但犯了个严重的错误,在分析系统用例时,我们关注的系统做什么不做什么,而不是系统的模块怎么划分。这样的做法相当是越俎代庖,你在业务分析阶段,做了架构师或设计师应该做的事情。万一架构师和设计师没有打算独立做一个“休假模块”呢?
上图之所以犯错误,其实是把用例图,当成“功能架构图”来用,任何建模的视图,都有它给设计出来的初衷,用来表达它适合表达的意思,用宝马来耕田,可不比拖拉机强。
网友评论