用例与架构

需求描述了软件系统是什么,架构则提供了系统的低成本实现方案,回答了软件系统如何做的问题。架构依赖需求,需求驱动架构。

目前,用例是大多数项目描述需求的方法,软件分析设计活动(包括架构)的输入就是用例需求规约或者其衍生品(用户故事)。作为架构或者开发人员,我们需要懂得如何从这些规约和故事中获取有用信息,驱动我们的分析设计。

这里根据自己的学习理解,结合以往的实践,总结了几点如何从用例开始架构设计的方法。

从用例开始推导系统结构

系统结构是指系统由哪些组件构成,这些组件的职责以及它们之间的关系。

系统结构是我们通过架构活动创造出来的,没有一个简单、直接、通用的套路得到结构中的组件,但是用例可以启发我们的探索。

用例是从用户和涉众角度对系统的描述,它天然就是对系统的一种划分:每个用例代表了系统的一部分需求,代表了涉众/参与者使用系统的一类场景,从场景的层面看,用例之间没有交集。而在用例内部,场景、业务规则等元素共同定义了一组强耦合的功能需求。

如果我们继续把用例按照参与者进行分组,每个用例组对应一个或若干个类似的参与者。由于参与者是业务领域中的由人或者其它系统扮演的角色,相似的角色意味着它们提出的功能被组织在一起可能是合理的。

每个用例组我们引入一个组件(可能是子系统、也可能是模块),它们实现了用例组包含的用例,这些组件构成了系统。这个时候得到的系统结构实际上就是所谓的“功能架构”,经常出现在系统的售前和宣传文档中。但是我们要认识到,由于“功能架构”没有考虑重用和非功能属性,它不是最终的,可以用于指导开发架构。

但是从用例组得到的“功能架构”在系统划分上有一定的合理性,我们把它作为架构设计的出发点,逐步演进。比如:我们选择一个功能组件(某个子系统或者模块),从对应的用例组中找到若干个用例,分析它们的功能需求和非功能需求,引入新的组件实现公共的功能需求;引入新的组件或者精化已有组件实现非功能需求。

从用例推导领域模型

我之前参加过UMLChina潘加宇的“软件方法”培训,里面介绍了由用例建模的方法。这里简单介绍下。

我们要明确这里的领域模型只描述领域概念,不考虑具体的技术要素(比如:并发、事务等)。

从用例可以推导出边界类、控制类和多个实体类,它们之间的关系如下:


用例领域建模相关类.png

这些类之间的协作如下:


用例领域建模类协作.png

为用例定义控制类

一个用例最多一个控制类,一个控制类只关联一个用例,负责接收所在用例对应的业务事件,协调内部的处理。是业务用例的调用入口。

这个控制类不是必须的,如果发现不需要协调,所有逻辑可以由实体类完成,可以不需要这个控制类。

从业务实体、业务处理功能和业务约束条件推导实体类

用例和实体类之间是多对多的关系。从用例中获得实体类的方法这里不展开了,直接由业务实体映射可以作为一个起点。但是要得到高质量的领域模型,还需要在这个基础上进行抽象和挖掘,这个过程我总结不出,不过这里给大家推荐几本书:

  • 软件方法(下)(潘加宇)
  • 彩色UML建模(Perter Coad)
  • Domain driven design(Eric Evans)

另外,还可以参考一下别人在分析和概念层面总结的领域设计模式。

为参与者定义边界类

边界类对应用例的参与者。

从我自己的体会来看,有必要为每一个辅助参与者(Supporting Actor)建立一个边界类,这个边界类的职责是和系统依赖的外部系统通信,比如:发送通知、调用某个功能等。

对于主动参与者,只有这个参与者是由时间系统承担的角色时,为这个角色建立一个边界类才是有价值的。

从用例推导设计

当我们用具体的语言/框架去实现之前推导出的领域模型时,必须考虑具体的技术问题,包括:并发、事务、性能等,实际上这些就是用例的质量属性。

如何实现这些非功能需求呢?肯定有很多方法。我个人比较倾向于通过增加一些新的类/组件,在不修改之前的的领域实体类的前提下实现。实际上在目前的领域驱动设计的相关书籍里,有很大一部分就是介绍如何在技术层面实现领域模型,帮助领域模型落地。

比如:我们要实现数据库的访问,不是在领域实体类增加类似查询、保存的方法,而是增加一个形如:xxxRepository的类。

再比如:某个功能需要可伸缩,这个时候可以在架构层面引入新的组件负责该功能,组件支持多实例部署,组件内部仍然使用原有的相关领域模型。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351

推荐阅读更多精彩内容