分享会时间
2018年1月19日下午13:00-14:30。
分享会地点
集团公司三楼会议室。
分享会主要内容
分享会中,大数据事业群产品研发部部长冉茂壕在介绍领域驱动设计的概念和延展应用基础上,针对传统数据驱动和当前领域驱动的不同特点,展开了领域驱动设计(DDD:Domain-Driven Design) 应用机制的深度阐述。分享会最后,冉部长分享了他在领域驱动设计领域的研究成果并详细回答了同事们对该设计模型提出的问题。
大数据事业群产品研发部部长 冉茂壕
概念及背景
领域驱动设计(Domain-Driven Design,简称DDD)概念来源于2004年著名建模专家Eric Evans发表的他最具影响力的书籍:《domain-driven design –tackling complexity in the heart of software》(中文译名:领域驱动设计——软件核心复杂性应对之道)一书。书中首次提出了“领域驱动设计”的概念:DDD是一套综合软件系统分析和设计的面向对象建模方法。
软件开发不是一蹴而就的事情,我们不可能在不了解产品(或行业领域)的前提下进行软件开发,在开发前,通常需要进行大量的业务知识梳理,而后到达软件设计的层面,最后才是开发。而在业务知识梳理的过程中,我们必然会形成某个领域知识,根据领域知识来一步步驱动软件设计,就是领域驱动设计的基本概念。
过去系统分析和系统设计都是分离的,正如我们国家“系统分析师” 和“系统设计师” 两种职称考试一样,这样割裂的结果导致需求分析的结果无法直接进行设计编程,而能够进行编程运行的代码却扭曲需求,造成客户运行软件后发现很多功能无法满足需求。DDD打破了这种隔阂,提出了领域模型概念,统一了分析和设计编程,支持软件能够更灵活快速跟随需求变化。当进入DDD并对某个领域建模的时候,我们会聚焦于业务, 研究所需的任务和行为。数据持久性与业务问题无关,因此它应该扮演支持的角色,而不是去干预领域设计。
分享会现场
part1
领域驱动设计的目的:实现业务价值
目前开发采用的是数据驱动模式,从数据对象入手,在数据对象中提供大量setter 和 getter 方法,但不具有业务含义,因此也被称为贫血模式。而领域驱动设计在代码实践过程中会赋予业务对象具体的业务行为,从而达到代码即是设计。
part2
战略设计
A. 通用语言:在一个限界上下文中创建的领域专用语言,具有通用性,主要便于开发与领域专家进行沟通交流;(注意:通用语言中的同一名词在不同子域意义可能不同)
B. 领域/子域:子域分为3种:核心域、通用子域和支撑子域;
C. 限界上下文:一个单词或是一个句子所出现的环境,反过来会影响它的含义。
part3
战术设计
A. 值对象(Value Object):
它度量或者描述了领域中的一件东西;
它可以作为不变量;
它将不同的相关属性组合成一个概念整体;
它可以和其他值对象进行相等性比较;
当度量和描述发生改变的时候,可以用另一个值对象予以替换。
(e.g.地址、只关注面值的人民币)
B. 实体(Entity):
拥有唯一标识;
具有生命周期;
可变更属性值。在生命周期内,属性状态在不同时间段是可能不同的;
通过唯一标识进行相等性比较。
(e.g.2张面值100的且有唯一编码的人民币)
C. 聚合(Aggregate):
实体和值对象在一致性边界之内组成;
拥有聚合根;
聚合内强一致性;
聚合内除聚合根以外的实体,它们的唯一标识只在聚合内唯一;
通常情况下百分之70的聚合只有一个实体,聚合根就是该实体。
D. 聚合根(Aggregate Root):
对象是否有独立的生命周期;
有一个独立的模块去管理它;
有独立的业务场景会去创建或修改一个对象;
对象有全局唯一的标识。
part4
观点分享
技术上,我们现有的方式使得对象对自己的业务无法明确;(e.g.使用上帝对象(Service)去控制业务对象的行为。)产品上,使用原型来展示交互和操作,但并不能完全代表产品的需求。而如果能实现“代码即设计,设计即代码”的话,就能尽可能避免在修改的时候,牵一发而动全身的情况。
要使用业务规则去限制对象的行为,并在产品和开发中都表示清楚对象与业务的关系,其中一种方式是使用UML图。因为描述性语言太多,会造成记录混乱、难以联系的情况,而UML图重点关注对象的业务模型和唯一标识号,具体描述对象的业务情况和业务对象之间的关系。(注意:UML图只是对象模型的一种表述方式,UML图不等于DDD)如果我们把需求通过文字去记录下来,那么这就是展示出来的效果(见下图),并不能可视化的展示出业务对象之间的关系。
part5
问答互动
Q
A
&
Q:产品研发引入领域驱动设计的方法理念之后会有哪些优势?——张澈
A:其实优势在后端开发环节感受会更明显,我们在跟产品乃至整个团队的沟通上可以使用通用语言进行沟通,从而可以避免在团队中沟通产生的问题。开发的关注点可以从数据如何存储转移到业务对象上,让业务更具价值。这样很多面向对象中的设计模式也将水到渠成地应用到具体开发实践中。另外,在产品原型设计中一般原型图只能传达显式需求的缺陷,而采用领域驱动设计的方法理念的产品设计能让开发更快地了解业务中的对象间关系和规则——冉茂壕
长按下方二维码,
和我们一起成长吧!
版权声明:
领取专属 10元无门槛券
私享最新 技术干货