文档章节

(2) 基于领域分析设计的尝试-领域分析基础

不知道自己什么不知道
 不知道自己什么不知道
发布于 07/09 15:08
字数 1555
阅读 604
收藏 8

本系列目录:

  1. 改变与优势
  2. 领域分析基础
  3. 读写隔离
  4. 充血模型之实体
  5. 充血模型之Service
  6. 关于重构与落地

由于整个架构规范很大程度上是基于领域驱动设计(Domain Driven Design,DDD)的思维,所以,有必要在这里和大家先介绍一下DDD的一些概念。

领域聚合

让我们用一个相对简单的小电商系统来举例,来说明几个概念,这个电商系统的大概需求如下

  • 我们主营的商品是甜品,计划让用户能过通过微信小程序来完成下单到支付的整个流程
  • 用户能够在我们的小程序主页选择甜品主食,然后选择详细的一些辅料搭配,最终下单,(为了简化,暂不考虑购物车,也就是一单只有一个甜品)
  • 目前只允许堂食,不考虑配送
  • 对了,我们偶尔还会需要派发一些优惠券,用户能在支付的时候输入优惠券进行抵扣(一次最多用一张)
  • 我们想能够记录好每个用户从下单,支付,到制作完成的整个流程记录

然后,我们能够很快得出这样一个模型图

模型图1

简单来说就是:

  • 一个用户可以创建多个订单,当然也可以不下单
  • 一个订单会产生至少一条订单变更记录(从创建开始)
  • 一个订单只对应一种商品,假定商品的“辅料搭配”只作为一个“备注”属性存储到商品
  • 一个订单最多使用一张优惠券,而优惠券,当时可以一直不被使用

如果这个时候问你 你觉得那两个模型类的相互关系是最紧密的呢? 相信几乎大家对这个答案没有异议

订单聚合

可能你这时说不上来原因,但至少从直觉来看,大家都会这么选择,而且确实也是如此

因为这是一个聚合——订单聚合。

他们的关系很紧密,有多紧密?如果一定要挑一个最重要的因素来说,就是:订单变更记录不能离开订单而单独存在。对,他们必须在一起,而且订单是中心,变更记录是它的旁支。如果订单不存在了,或者不指定某一个订单,那么这个变更记录则毫无意义。

其中,Order被称之为聚合根(Aggregate Root),或者根实体(Root Entity)。所有的行为都从订单出发,而类似订单变更记录这种非根实体,则不直接与外界打交道。

那优惠券呢?优惠券不也只能用于订单吗?它不应该属于"订单的优惠券”吗?

并不会,因为优惠券可以停留在不被使用的状态,在那时,它是脱离订单而存在的,而且我们可以在不需要外界任何其他领域的情况下,直接对优惠券进行一些设置修改,这也说明了,它是一个独立的领域,或者说独立的聚合存在

至于分析出来的目的,在充血模型一章我们再详细说明。

分层模型

下图为《领域驱动设计》中所提到的分层架构

分层架构

关于原书对四层的介绍,我在这里先不原文复述了,我以我的理解(或疑问),分别挑选重点进行介绍:

用户界面层

其实这里有些困惑,我不知道作者是否将前端应用也包含进来。如果没有,那么这里可能就类似我们说的网关,或者路由配置层之类。不过总之,这里并不是领域分析的重点。

应用层

这是一个和领域层的界限相对模糊的一层。在原书中,这一层的描述是这样:

定义软件可以完成的工作....它不包含处理业务规则或知识,只是给下一层中相互协作的领域对象协调任务、委托工作。

“定义软件可以完成的工作”,我们可以理解这是一个应用服务的入口,一个功能单元,一个API,那么,以SpringMVC为例,那么我们开发时入口是什么?自然是@Controller,如果需要事务支持,就在这里加上@Transactional也没问题,千万不要认为事务不加在@Service上就感觉怪怪的,没什么好奇怪的,要摆脱这种思维惯性。

“它不包含处理业务规则或知识”,并非完全“和业务无关”。广义上来说,连一个商业项目的整个架构都是为业务来服务,就算是遵循了“开闭原则”,保证了“扩展性”,依旧是以业务方向做主导。所以,应用层也会涉及业务,但是却非“核心逻辑”。那如何界定?我目前也没有想到一个可以简单描述出来的说法,只是做了一些相对简单粗暴的规定:如果这个功能要求用到一些公共的组件,诸如文件上传下载,EXCEL/WORD等文件解析等明显是工具型做法,一般来说都能放在这一层。

领域层

核心业务逻辑,之后我们讨论的主要内容都在这一层。

基础设施层

持久化读写,公共组件如上面提到的文件下载工具等,还有比如RPC的框架组件等等,都属于此层。这一层可以被上面的任何一层直接调用

所有层允许调用下方层,反之则不然

下一篇:读写隔离

© 著作权归作者所有

不知道自己什么不知道
粉丝 27
博文 6
码字总数 11878
作品 0
长沙
高级程序员
私信 提问
《算法设计与分析基础原书第3版》.PDF

简介 作者基于丰富的教学经验,开发了一套全新的算法分类方法。该分类法站在通用问题求解策略的高度,对现有大多数算法准确分类,从而引领读者沿着一条清晰、一致、连贯的思路来探索算法设计...

jackmk
2017/12/05
0
0
书单 | 数据挖掘,你不应该错过的六本书

     不久前我们推出的《推荐算法不够精准?让知识图谱来解决》以及《如何将知识图谱特征学习应用到推荐系统?》系列文章受到了同学们的广泛欢迎。大家对推荐系统以及与之相关的、底层的...

微软亚洲研究院
2018/06/15
0
0
代码等静态分析(Clang/LLVM,Hades)

> Clang/LLVM 针对 C/Objective-C 主流的静态分析开源项目包括:Static Analyzer、Infer、OCLint 等。 对于 C/Objective-C 而言,主流编译器是 Clang/LLVM(Low Level Virtual Machine)的,...

desaco
2018/11/25
0
0
想做数据工程师?从零开始系统规划大数据学习之路

大数据的领域非常广泛,往往使想要开始学习大数据及相关技术的人望而生畏。大数据技术的种类众多,这同样使得初学者难以选择从何处下手。   这正是我想要撰写本文的原因。本文将为你开始学...

董黎明
2018/07/15
0
0
产生式编程(Generative Programming)方法介绍

软件业对软件工程期望之高,涉及高度的复杂性,高效的生产效率和质量,以及便于有效地维护和改进。但是,当前的软件工程并不能满足这些目标,现在很多开发更像手工作坊的“一种一个”的解决方...

技术小胖子
2017/11/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

拥有有趣灵魂的程序员们,程序员访谈(一)

点击上方关注我们,让小care关爱你! 程序员群体一直都是低调多金的代表,而近段时间以来,程序员在网络上除了高薪之外,总是会和屌丝、苦逼、格子衫、没情趣...联系在一起。黑程序员的段子也...

ITCare
56分钟前
12
0
Linux输入法fcitx的安装问题

Fcitx 总共要安装的包如下 fcitxfcitx-binfcitx-config-commonfcitx-config-gtk | fcitx-config-gtk2fcitx-datafcitx-frontend-allfcitx-frontend-gtk2fcitx-frontend-gtk3......

CHONGCHEN
今天
8
0
网络基础

前言: 最近整理一些以前的学习笔记(有部分缺失,会有些乱,日后再补)。 过去都是存储在本地,此次传到网络留待备用。 计算机网络的功能: 1.数据通信; 2.资源共享; 3.增加数据可靠性; 4....

迷失De挣扎
今天
7
0
spring boot升级到spring cloud

1、先升级spring boot 版本到2.1.3 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.1.3.RELEAS......

moon888
今天
12
0
从蓝鲸视角谈DevOps

DevOps源于Development和Operations的组合 常见的定义 DevOps是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。透过自动化“软件交付”和“架构变...

嘉为科技
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部