先说说业务规则。笔者习惯将业务规则分为三种。

一种是全局规则,这种规则一般与所有用例都相关而不是与特定用例相关,例如actor要操作用例必须获得相应的授权,用例的操作与授权级别相关,或者用户在系统中的所有操作都要被记录下来等等。这类规则笔者习惯于,并且也建议将它们写到用例的补充规约里面去,因为它们一般与具体的业务功能性要求没有直接关系。有时候,这类规则也被写到软件架构文档中。关于用例补充规约以后再讨论。

第二种是交互规则。这种规则产生于用例场景当中,例如当提交一份定单时,哪些数据是必须填写的,用户身份是否合法。当然也包括一般理解上的业务流程流转规则等,例如金额大于一万元的定单被定为VIP定单进入特殊流程等。这类规则一般要写到用例规约中。交互规则实际上还有两个是比较特殊的,一个入口条件,也称为前置条件,即actor满足什么条件才能启动用例;另一个是出口条件,也称为后置条件,即用例结束后会产生哪些后果。稍后参看示例。

第三种是内禀规则。所谓内禀规则是指业务实体本身具备的规则,并且不因为外部的交互而变化的规则。例如,每张定单至少要有一件商品,同一类商品数量不能大于5件等。同时也包括大家所熟悉的数据效验规则,例如身份证号必须是15或18位,邮编必须是6位等等。这类规则是业务实体的内在规则,因此应该写到领域模型文档中,稍后参看示例。

读者或许对把规则这么分类有不同的习惯和理解,可能会觉得麻烦。但是笔者这么做有充分的理由。首先,全局规则与具体用例无关,它实际是系统应该具备的特性,这些规则把它分出来目的就是为了让系统去负责这些特性的实现。读者可以结合实际考虑一下,通常授权,事务,备份等特性都是由系统框架去实现的,具体的功能中并不去实现它们。如果读者有过基于某个框架开发应用的经历的话一定会认同笔者的话。其次,交互规则是在用例场景当中产生的,它们规定了满足什么条件后业务将如何反应。通常,这部分规则是最复杂,也最不稳定,最容易变化的。大家所说的需求经常变更相信绝大部分就来自于此。因此将这些规则单独列出来并给予关注和管理是很有必要的。同时这部分规则通常在系统中以Control类去实现,MVC模式如此,SOA架构中的BPEL也是如此。如果需求无可避免的要变更,那么,将交互规则单独提取出来,并设计成为扩展性很强的结构就是一种有效的应对手段。第三,内禀规则与外部交互无关,不论谁,在什么情况下提交定单,必须有至少有一件商品;不论你在哪个国家,在什么公路上开车,刹车都是必不可少的。这种内在的性质让你想到了什么?面向对象的封装原则对吗?这类规则应该实现到你的实体类中去,不论你的业务实体是EntityBean,JavaBean,POJO还是COM+,根据面向对象的封装原则,内禀的逻辑一定不要让它暴露到外部去。

这么分类以后,对软件成熟度比较高的组织来说,提供了很好的Level Reference。如果你是架构师,应该关注的是全局规则;如果你是设计师,应该关注的是交互规则;如果你是程序员,应该关注的是内禀规则。

在这里笔者想说点题外话:)。笔者曾经看过一篇《架构师已死》的文章(很抱歉已经记不起出处和作者,如有冒犯之处请海涵),作者的观点认为架构设计完成后,通常到最后改得面目全非,既然一开始不可能考虑到所有可能,何不如在开发过程中持续总结,重构,最后架构会自然而然出来的,如果这样,架构师有何用处呢?笔者认为这个说法是有一定道理的,不过要看软件组织架构和软件过程的定义,不可一概而论。《架》一文的作者是XP的fans,对XP软件过程来说,本来就不需要架构师这个角色,甚至连设计都不需要,开发,测试,改进,重构...,当然,从一开始就没打算按照一个stable的方法去做,架构师也就没有存在的必要。架构师在XP中已死,不过在RUP中还活着:)。软件界一直对XP和RUP有着争论,笔者无意在本文中界入这个争执,只是话已经到此,就顺便表达一下笔者观点。XP和RUP都是非常优秀的软件方法,只是它们各有各的适应范围。对于中小型公司和中小型软件来说,XP是非常有效的管理方法,它能大大降低管理、开发成本和技术风险。不过要是对于大公司和大型项目来说,XP就不适用了,这时RUP却非常适合。你能想象洛克希德·马丁公司用XP的方法来开发F-35战斗机会是一个什么情形吗?没有人清楚的知道将来的飞机整体是什么样,反正先造一架出来,摔了找找原因,改进改进,重构一下,再造一架....再摔了,没关系,咱们拥抱变更,再造就是了。呵呵,那XP什么情况下适用呢?如果你是一个杂货店的老板,不知道什么样的商品受欢迎,没关系,先各进一小批货,卖上一段时间,受欢迎的货品多进,不受欢迎的不进,跟顾客多交流,顾客喜欢什么商品咱就进什么,不断改进,最后一定会顾客盈门的。这时如果这个老板先做商业分析,客户关系分析,消费曲线分析....还没开业呢,估计就破产了。另外,RUP和XP也不是非此即彼的关系,在造F-35的过程中,对整体飞机来说,用RUP是适合的,具体到发动机的提供商,倒是大可XP一把,最终只要提供合格的发动机就OK了。

题外话说了不少,书归正传。业务规则分类以后,就应该按分类去调研了。

全局规则很难从用户处调研得来,通常这方面是用户的盲点。这主要是由有经验的系统分析员,或架构师以及客户方的IT部门(如果有的话),从业务特点、应用环境、行业规定、法律规章等等方面去总结,再求得客户方的认可。

交互规则从用例场景而来,每一个场景,场景中每一个交互的过程可能都隐含着规则。这就需要与客户多讨论。请参考本系列文章的第3篇关于涉众的讨论,交互规则最主要的来源是业务提出者和业务管理者,最好不要去找业务执行者。

内禀规则是针对业务实体的,因此要对每个业务实体的属性进行罗列,并找出它们的规则。内禀规则最主要的来源是业务执行者,需求人员应该更多的去与他们交流。

现在来谈谈业务实体的属性。业务实体的属性在这个阶段应该用业务术语来描述,而非计算机术语。调研范围是上一篇模型中得到的领域模型中的每一个实体,而属性的原始来源是客户的各类实际表单,以及在交流过程中客户提出的各种要求。如果业务实体有状态,并且是比较复杂的,那么在建模的时候应该有一个状态图来说明。请参看本系统文章提供的建模实例中'图书'业务实体下面的状态图。请读者注意,在本文后面提供的例子中,业务实体描述看上去象是一张数据表,但它绝对不是数据表。它是对业务中实体属性的业务角度描述。系统分析不是做设计,脑子里不要有任何关于设计或实现方法的想法,这些想法会误导你做出不适合的决定。你的职责是通过一个合理的模型完整的将业务描述出来,并求得客户方的认可。任何替客户和架构师,设计师甚至程序员“着想”的方法其实都是不恰当的。

最后本文提供一个用例规约的例子,每个用例都应该写一份用例规约。本文提供的这个例子基本上来自RUP提供的模板,不过在实际工作中笔者做了些修改,供读者参考。这个例子的蓝本还是本系统文章一直在使用的网上图书馆的实例。点这里下载用例规约例子,点这里下载建模实例。

到这里,需求过程差不多也该结束了。但是我们的确还有一些工作要做。如果读者所工作的组织是用RUP来做需求的,而客户方或者监理方未必会对这种需求文档表示满意。他们会以国标来要求你。同时,到目前为止,我们产生的成果都是一些分离的图形和文档,对于客户来说,这的确是不好的文档结构。难道客户的采购清单里还需要包括Rational Rose,这样才能阅读你提供的需求文档吗?显然这是不可能的,所以,给用户提供的文档还是以传统的《需求规格说明书》为好。下一篇就讨论一下如何将我们的分析成本集成到《需求规格说明书》中。顺带讨论一下用例补充规约和系统原型的产生以及它的作用。敬请期待。

OO系统分析员之路--用例分析系列(7)--用例规约的编写--业务规则和实体描述[整理重发]...相关推荐

  1. OO系统分析员之路--用例分析系列(7)--用例规约的编写--业务规则和实体描述

    先说说业务规则.笔者习惯将业务规则分为三种. 一种是全局规则,这种规则一般与所有用例都相关而不是与特定用例相关,例如actor要操作用例必须获得相应的授权,用例的操作与授权级别相关,或者用户在系统中的 ...

  2. OO系统分析员之路--用例分析系列(2)--用例的类型与粒度 [整理重发]

    在正式讨论如何获取用例之前,笔者觉得有两个问题还是先解释清楚为好,这对正确获取用例有很大帮助.这两个问题也是初学者最为困惑,也是最难掌握的.一个是各种用例类型之间的区别和用法,另一个是用例的粒度.  ...

  3. OO系统分析员之路--用例分析系列(4)--业务建模一般步骤和方法[整理重发]

    本篇开始之前先扯点闲话,商业应用系统开发经历了三个阶段: 第一个阶段以计算为中心,分析设计围绕程序的运行效率,算法优劣,存贮优化来进行.90年代的大学课程讲的都是这些. 第二阶段以数据为中心,分析设计 ...

  4. OO系统分析员之路--用例分析系列(2)--用例的类型与粒度

    OO系统分析员之路--用例分析系列(2)--用例的类型与粒度 在正式讨论如何获取用例之前,笔者觉得有两个问题还是先解释清楚为好,这对正确获取用例有很大帮助.这两个问题也是初学者最为困惑,也是最难掌握的 ...

  5. 需求用例分析之四:业务规则

    作者:张克强 作者微博:张克强-敏捷307 在雅各布森用例分析方法和科伯恩用例分析方法中用例本身其实都没有"业务规则"的属性.但是业界使用中常常会给用例加上这个属性,这是为什么呢? ...

  6. 《大象:thinking in uml 》(第二版) 11章 系统分析 1-2节 确定系统用例、分析业务规则

    只供参考,喜欢请支持正版图书 11.1 确定系统用例 具体说来,这些方法包括: ■ 映射 映射是最简单最直接的方法,例如值机人员办理登机手续这个备选用例就可以不加修饰地直接被采纳为系统用例. ■ 抽象 ...

  7. Matrix原理分析系列之开篇

    背景 应用性能监控和性能优化一直是老生常谈的话题,很多大厂都有专门的团队在做,腾讯就做了一款性能监控的框架matrix,且已经开源,对于个人而言,这是一次绝佳的学习机会,像如何做到启动耗时的计算,就要 ...

  8. MyBatis 源码分析系列文章合集

    1.简介 我从七月份开始阅读MyBatis源码,并在随后的40天内陆续更新了7篇文章.起初,我只是打算通过博客的形式进行分享.但在写作的过程中,发现要分析的代码太多,以至于文章篇幅特别大.在这7篇文章 ...

  9. Spring IOC 容器源码分析系列文章导读

    1. 简介 前一段时间,我学习了 Spring IOC 容器方面的源码,并写了数篇文章对此进行讲解.在写完 Spring IOC 容器源码分析系列文章中的最后一篇后,没敢懈怠,趁热打铁,花了3天时间阅 ...

最新文章

  1. 数据防泄漏(中文版)
  2. c++输出lpbyte类型_变量类型摸不清脉络?用typeid()试试,用一次就上瘾
  3. 网络编程t-io介绍
  4. 用segnet训练我自己的数据,实验笔记1——改变图片大小
  5. 对数组操作[:,:4]
  6. 浅谈.NET中泛型的基本原理
  7. phpstorm设置背景图片
  8. Linux下NTP服务器配置
  9. 延时消抖c语言,蓝桥杯练习(二)按键的使用和延时消抖
  10. ubuntu上打开md文件_Ubuntu 使用教程.md
  11. 4.7 合成复用原则
  12. 2020读书笔记 《马歇尔传记》
  13. 大数据时代的回收生意经
  14. 亲测-分享最新微信付费进群收费进群系统源码-附带搭建教
  15. HTML及css疑问解答题前端面试题
  16. Revit完整案例教程
  17. 接入alipay-sdk
  18. 抛弃WinSCPnbsp;教你使用CuteFTP传输文件
  19. 量化交易创干货合集送给每一位爱学的宽客qun
  20. 数组排序(中间大两边小)

热门文章

  1. HTML去除横向滚动条
  2. AI已到,普通人的机会在哪里?
  3. 为什么使用三层交换机
  4. 关于lombok中的Builder注解解析
  5. font-family对照表
  6. 月入万元和月入千元,要认清,做自媒体和抖音哪个更适合新手?
  7. ichunqiu CTF 训练 Basic 全解
  8. Linux常用命令——uniq命令
  9. ubuntu系统普通用户忘记密码解决办法
  10. 老庞互联网随想之五 谁能够提供我们想要的资讯,我们就用谁