简化的酒店系统有顾客屏幕,职员屏幕,订房,入住,离店,订单和房间7个组件,箭头标示了组件间的依赖关系.这是软件开发中用组件化来划分复杂系统,隔离复杂度到各个组件里的标准姿势.
姑且把系统外对系统的关注点(Concern)称为痛点,下图2显示订房间,登记入住和结单离店3个痛点分别缠绕若干个组件,同时有些组件内部也同时分散着多个痛点的部分.
倘若渴望的目标是清楚地分离各个痛点,从用例,需求,分析,到设计,实现,再到测试都是严格的分开,软件开发要来得容易多了.
在痛点与组件实现类之间架一座桥,叫做用例.这里所说的用例是用来对系统行为建模,一个用例的定义是某个系统进行的一系列活动,产出可观测到的结果,并且这个结果对一个或者多个系统相关的人或物是有价值的.
用例与类清单如下所示,订房,入住和离店3个用例,顾客屏幕,职员屏幕,订房,入住,离店,订单和房间7个类.
以类为横坐标,用例作纵坐标,模块化设计系统的可选方式有两种,OO(Object-Oriented)为代表的纵向切割系统,每个组件一个类,另一种是横向切割,AO(Aspect-Oriented)是代表,每一组横向切片打包合称为用例片断(Use Case Slice).
任何一个用例,如订房,在软件开发过程中用例,分析,设计,实现,测试阶段都分别有对应的用例片断.把一个用例对应的所有用例片断合在一起,称为用例模块(Use Case Module).比如分析建模或设计建模的用例片断会囊括该用例的所有类,一些类里相关的部分成员(变量或方法)称为Aspect,还包括交互图,通讯图和类图这些描述用例实现的协作.
用例的表示有3个场景:最简洁的是一个椭圆+名字,矩形同时显示用例名和它所含的活动序列(基本序列,备选序列,和子序列),还有一种就是在系统中和其它用例的关系结构.订房用例的图示,在系统关系图中,为订房用例归纳抽象出设施预定的用例,订房用例继承它,同时抽取3个用例共同部分检查房间情况的子用例,然后分别包含,在没有合适的房间时,为订房扩展新的排队列表用例.用例间的关系就这3种:归纳抽象,包含和扩展.
关于用例间的归纳,包含关系和OO里类间继承,包含类似,扩展的概念不是很好对应,这个主题也内容也比较多,可参阅"Aspect-Oriented Software Development with Use Cases"一书.此文有意回避这部分,可简单粗暴地理解为订房用例把排队完全外包给另一个用例了.
用例就像硬币,从系统外部看有一个相关方actor连着一个命名的实线椭圆就够了,从系统内部看去,用一个命名的虚线椭圆再连上与它关联的所有类或类的部分,这两个视角分别称为用例和用例的实现.
描述订房用例实现的交互图,用例片断图,以及用例片断间的抽象归纳,包含和扩展关系.
开发过程中用例的迭代建模过程如下:细化用例阶段更新用例模型,分析阶段更新分析模型,设计阶段更新设计模型,实现阶段更新实现模型.而测试设计片段覆盖前3个,测试实现片断覆盖测试设计和用例的实现