DDD领域驱动设计---战略设计(包括四⾊原型建模)
相当于策略设计,从宏观⾓度着眼于领域的分析设计,属于系统分析阶段,注重如何从有界上下⽂中寻领域模型,战略模式由有界上下⽂、⽆所不在的语⾔和上下⽂映射组成。
在战略设计前⾸先要了解下领域知识、业务策略、业务规划。
1、有界上下⽂:是指再空间或时间上有边界的⼀段环境背景,它确定了每个模型的适⽤范围,模型体现了这个范围内的逻辑⼀致性。福特论坛
2、统⼀语⾔:统⼀语⾔必须在领域模型中表达出来,主要体现在领域模型中的名称上。不应只由业务专家或是其他单⼀职位定义,⽽应团队⼈员共同商定。
3、上下⽂映射组成(上下⽂关系):
a、共享内核(例如两个团队共享⼀份类库)此种⽅式很少⽤,耦合度太⾼。
b、开发主机服务也就是上下游关系映射或API调⽤,⼀个服务通过RPC等同步⽅式调⽤另⼀个上下⽂的API,这种⽬前⽐较普及。
c、发布\订阅模式:⼀个发布,⼀个订阅,只依赖事件或消息,使得两者之间最⼤化松耦合。
d、发布语⾔(Published Language):两个有界上下⽂中的模型沟通的语⾔表达⽅式。例如XML,JSON
康威第⼀定理(Conways Law):组织性质决定架构。即系统架构代表实现系统的组织的沟通结构,对于软件中的每个模块,都对应有⼀个组织单元;组织单元之间存在沟通依赖,软件中对应的模块之间同样存在依赖关系。
在领域(独⽴的产品或是项⽬)中划分{核⼼⼦域(业务策略和业务规则重点实施地),⽀持(辅助)⼦域,通⽤⼦域。}(具体的项⽬)每个域确定上下⽂(领域边界)
最佳实践:⼀个有界上下⽂对应⼀个⼦域,对应⼀个团队,对应⼀个微服务。
DDD建模基本上只需要三种UML图:⽤例图(表达需求⽤例)、序列图(模拟领域中的逻辑流程,能够记录和验证逻辑)、类图(表达类与结构关系)。
划清领域上下⽂的⽅法:
1、通过领域故事(Domain Storytelling)的⽅式,专注于领域知识,通过领域语⾔来探索和理解⽤户流程、⼯作程序和整体业务流程和规则。
例如:问:“你的⼯作做什么的?”
答:“进⾏货运计划调度”
问:“具体怎么回事?”
答:“举个例⼦,客户需要托运⼀批货物,然后需要让路线⼩组规划路线,机场⼩组再分配计划,最后指定机位。”
这⾥“客户需要托运⼀批货物”主语是“客户”,谓语动词“托运”,宾语是“货物”。可以使⽤不同颜⾊表⽰他们:黄⾊是主语,粉红⾊表谓语,蓝⾊表⽰宾语,具体颜⾊取决⾃⼰,也可参考下⾯的四⾊原型。
2、还有填写表格法和事件风暴会议发现有界上下⽂。
本环节最主要的就是划清领域上下⽂。也是整个领域驱动设计的难点。
领域事件:事件代表过去发⽣完成的事,它既是业务架构概念也是技术架构概念,以事件为驱动的编程技术模型称为事件驱动架构(EDA)。领域事件强调其业务概念。事件即指已经发⽣的事情,可以从动词完成时理解。
命令:命令表⽰事件的触发器。命令是请求,⽽事件是完成。命令相当于页⾯(UI)点击的按钮来触发⼀个需要完成的任务,这个完成的任务既是指⼀个事件。
命令命名和事件命名,命令命名相当于动词结尾的ing,事件命名相当于结尾的ed。
关键事件:即指识别状态机状态之间转换的事件,关键事件是领域边界划分的重要指标。
还有事件建模头脑风暴法,这个也是⼯作中会使⽤的⽅法,但是这种⽅法⼀定要确定会议各阶段⽬标,要不效率太低。
例如:⾸先,确定探索⼦域。
2、确定探索有节上下⽂。
3、确定⽤户⾓⾊,那些⾓⾊发出那些命令,完成那些事件。
4、确定关键测试场景。
可参考四⾊原型建模:
1、moment-interval(某个时刻(moment)或⼀段很短时间(interval)内. 意味在某个时刻发⽣的事情因为业务要求或合法性原因需要跟踪;或者过⼀段时间以后,应该是很短的时间,可以帮助我们寻到它。)
卖东西是在某个时刻发⽣的,它有发⽣⽇期和时间。租赁⾏为是在⼀段时间内发⽣,从开始出租和归还所租物品;预定也是持续⼀段时间,什么时候预定;什么时候过期等。
  这些我们都使⽤moment-interval原型来表达。Moment-intervals经常封装的是最关键的⽅法,为让其显⽬,moment-interval的UML图我们使⽤粉红颜⾊表⽰
2、role(⾓⾊原型⽐较容易理解,任何⼀个系统都需要⼈或某个组织介⼊运⾏,例如论坛系统需要注册者⾓⾊发⾔;销售订单需要业务员⾓⾊制定,等等。)
这⾥有⼀个Party原型定义:它表⽰⼀个可标识、可定位的单元,这个单元有⾃⼰正常的状态并且能够⾃主控制⾃⼰的⼀些⾏为,通常情况下,⼈或组织是⼀种Party,但象护照,⾝份证等注册性标志等都可以作为Party。
Role⾓⾊是Party扮演的(a role that a Party plays),Party是⾓⾊Role的扮演者(role-player)。⾓⾊原型在UML中是使⽤黄颜⾊标识的。⾓⾊模型是第⼆重要的原型,所以使⽤黄⾊。
3、description archetype
⽐如你的红⾊福克斯是福特⽣产的⼀辆轿车,它有车牌号、购买⽇期、颜⾊和⾥程表等,这些代表Thing原型,那么作为轿车这个种类来说,它有⼀些种类属性,例如:⽣产⼚家、⽣产批号、适⽤颜⾊
等,这些属性是轿车这类所有车辆都共有的。
在设计模式这个实现级别,我们通常使⽤来实现种类原型。Description原型在UML中使⽤蓝⾊表达。
4、party, place or thing
party place或thing都可以成为⾓⾊原型,注意到⾓⾊原型中的UML图,party图是以绿⾊表达。