领域驱动设计在资讯设计分析中的初步探索
领域驱动设计采用面向对象的思想,在更高的位置采取更广的视角,对业务领域进行分析。通过对实际业务抽象映射为固定的设计概念,并对他们按照一定的业务联系和边界进行划分,形成业务领域相对清晰的边界及相互关系,以此来形成设计模型。
领域驱动设计在引入概念时,对软件设计过程进行了拆解分析。分析中提出,领域专家与软件开发人员要在需求实施的过程中,进行充分地反复地沟通,通过不断地沟通交流达成对需求的一致认识与对业务模型的构建。这个过程中,如果双方能够构建并采用通用语言(Ubiquitous Language)进行交流,能够大大减少沟通的成本。如果软件设计人员能够掌握领域驱动设计的概念,那么在沟通过程中,就能够引导业务专家对领域知识定向进行解释,向领域驱动设计所采用的概念进行靠拢,从而在最后能够形成对业务领域模型化构建,方便地指导后续的开发。
几个主要概念
领域驱动设计在具体分析过程中有几个主要的概念,主要包括:
实体:实体对应业务领域中的一个业务对象的描述,实体在整个业务周期内具有唯一性的特点,其一旦生成便应该具有一个唯一的id标识其自身。
值对象:与实体类似,但值对象不同之处在于值对象没有唯一的id标识。更多表示一组属性的集合。
聚合:聚合表示一组实体或值对象的集合,在业务上他们之间有相互之间的联系,共同构成了一个比较内聚的业务范畴。
聚合根:聚合根表示一组聚合中位于最根部位置的实体,该实体是在该业务范畴内处于最核心位置的业务表达。
服务:服务表示对外界输出的一个或多个功能,表现形式通常为对外的接口。
限界上下文:上述的实体、值对象、聚合、服务,当形成一个相互联系较为紧密的业务联系集合时,便可以将该联系集合称作是一个限界上下文。
模块:通常在划分形成限界上下文后,由一组限界上下文可以构成一个模块,该模块面向一定的业务场景提供对外的服务。例如对客服务模块,管理端模块,第三方接入模块等等。
限界上下文划分
如何划分限界上下文,是领域驱动设计的关键。由于业务领域各有特点,应用场景互不相同,在限界上下文的划分上,没有明确或者固定的原则可以直接采用。但是,限界上下文的划分可以遵循一个相对固定的流程来完成:
首先设计人员需要对所分析的业务领域内的实体、值对象进行列举,并且找到他们之间的聚合关系;其次,根据一组聚合关系,需要找到这组聚合中的核心实体,将其定位为聚合根,在这组聚合内,业务必然围绕着这个聚合根进行展开; 然后,需要对聚合对外所提供的服务进行逐个识别并定义;最后,在得到聚合、实体、值对象、服务这些关键构成要素之后,实际上已经形成了一个相对独立的业务领域,该业务领域就可以认为是一个限界上下文。
读者浏览文章限界上下文的分析
采用DDD的分析方法,对资讯进行分析,粗略的可以划分出对读者服务模块,对作者服务模块以及对管理员审核模块等若干模块。选取对读者模块中文章浏览的场景进行分析。
该场景下,有如下要素(仅考虑部分功能):
实体:文章、读者、作者、渠道、分类
值对象:读者与文章的浏览关系
聚合:文章、渠道、作者、分类构成一组聚合,该聚合的聚合根为文章;读者、渠道构成一组聚合,该聚合的聚合根为读者;
服务:文章列表类服务,文章点赞服务,文章收藏服务,阅读文章详情服务
详细构成如下图:
采用DDD进行分析对于资讯的几个启发
- 文章实体的定义在不同限界上下文中不同
采用DDD的方法进行分析设计的过程中,发现在读者阅读文章这个上下文与作者及管理员对文章进行审核编辑这个上下文中,文章这一实体关注的属性要点有所不同。例如,在读者阅读文章的上下文里面,不需要关注文章在工作流中的流转状态;而在作者编辑文章这个上下文中,不需要关注文章的阅读量、点赞量等等这些信息。因此,基于在限界上下文划分中实体不应该体现与此上下文无关的信息这一原则,文章这一实体在不同的上下文中有不同的定义。而基于不同的定义可以发现,可以将文章在存储上的设计进行划分,在文章被审核完成前后可以分表存储,这样将低频与高频的交易从存储上进行了拆分,从而从最底层进行了数据的解耦,便于后续各自的业务扩展,降低互相带来的影响。
- 读者浏览文章动作的记录(浏览过、点过赞)
在分析过程中,发现了读者与作者的浏览关系这一值对象。这一值对象主要由读者是否浏览过、点赞过或者收藏过一篇文章这些属性构成。由此可以发现,读者的各项动作,对文章及读者两个实体的状态都产生了变化。那么,应该对这种状态的变化都加以记录,基于这些记录可以进行进一步的业务探索。例如:当前的实现中,并未实现“我的浏览足迹”这一功能,也并未在在展示上体现是否阅读过这篇文章的区别。
- 读者信息未留存(在阅读领域内)
在分析过程中,识别出了读者这一实体。在服务化的整体架构模式下,读者仅是用户在特殊业务领域的表现形式,理应由用户中心实现管理,这是目前资讯所采取的方式,即未对读者信息进行留存。但是,采用领域驱动设计分析的方法来进行分析后发现,读者这一实体在阅读限界上下文中是一个比较重要的实体,处在聚合根的位置。从业务的角度进行考虑,读者在阅读文章这一场景下产生的特殊属性,应该进行记录,并且基于这些记录,可以拓展服务。例如:读者一段时间内的浏览量,读者的点赞比,读者的累计转发数等等数据。