摘要:随着数字化世界的持续演进,软件架构设计思想在碰撞中不断优化。云原生时代的到来,加速了行业对于领域驱动设计理念(Domain-Driven Design)的实践落地诉求。

本文分享自华为云社区《云原生时代,领域驱动设计思想(DDD)如何落地?》,作者:敏捷的小智 。

随着数字化世界的持续演进,软件架构设计思想在碰撞中不断优化。云原生时代的到来,加速了行业对于领域驱动设计理念(Domain-Driven Design)的实践落地诉求。

在刚刚结束的DDDChina2021领域驱动设计峰会上,华为云数据建模架构师凌云分享了自己对领域驱动设计理念的理解和实践。

软件架构的演进

近些年随着经济和科技的迅猛发展,各行各业或多或少都有软件系统的应用,电商、银行等行业的迅速发展带来的业务复杂度提升、访问并发量提高,都对软件的可靠性、稳定性提出了更高的要求。因此软件架构在近些年经历了从单体架构、到分布式架构、再到目前比较主流的微服务架构,以及逐渐兴起的Serverless架构的演进过程。

什么是领域驱动设计思想(DDD)呢?

DDD的全称为Domain-Driven Design,即领域驱动设计,是在一定领域内,发现问题,抽象共性不变的流程,进而提供问题解决方案的过程。它的方法是通过一个统一语言领域建模、领域划分等一系列手段来降低复杂度,并基于面向对象分析(OOP)技术进行了分层规划,对软件开发全生命周期使用语言进行统一,并强调业务与技术相结合的一种过程。

-为什么要建模?

建模通过可视化的模型,让懂业务的人和懂技术的人可以互相交流沟通。同时,我们做了一个模型之后可以很方便的复用传播,在其它项目中进行改造,最后还可以对做出的决策进行文档化。

-什么是“领域”模型?

领域的逻辑就是显性的专业知识。比如现在需要开发一款法务人员使用的软件系统,那么就会存在这样的问题:法务人员不懂软件开发,开发人员不懂法律条文信息,而在开发过程中二者又需要进行不断的沟通和确认,法律领域的模型就是连接二者的一个桥梁,领域模型主要倾向于将领域的知识给描述出来,管理合规性。

-领域建模和软件架构的关系

DDD如何落地

下面通过一个具体的数据建模软件的案例来给大家说明一下如何落地DDD。

以一款数据建模软件开发为例,逻辑模型和物理模型如下图:

逻辑模型

物理模型

我们可以通过如下步骤实现DDD的落地:

1、与领域专家交流

与领域专家交流是整个流程的重中之重,在该过程中业务建模人员需要对概念、操作、行为、约束等较为熟悉,因此,领域建模的第一步,是明确业务边界,将系统的所有行为收缩到可视化建模子领域以内。其次需要理解数据变化的逻辑,在可视化建模的概念-逻辑-物理正向设计过程中,概念驱动逻辑,逻辑驱动物理,针对不同角色的用户,所关注的阶段并不同。从业务角度看,实体变更将驱动表变化;从用户角度看,业务逻辑变更要求系统演变适配。最后与领域专家验证需求,正向推送逻辑:实体变更审核通过,则驱动对应表发生变化。此变化在物理模型上,开发者应根据表的变更,修改软件系统的实现。

2、实现对应的领域模型

合理规划业务对象的关系、继承,实体包含属性、表包含字段、表包含索引、关系关联两个实体、ER图包含实体、关系等。确定聚合关系,实体头信息和属性列表构成实体、表头信息和字段列表+索引列表构成表、版本状态与流程构成版本化。接下来需要确定值对象,如字段类型、索引类型、操作动作类型等,最后领域模型验证需求,通过以上的流程我们实现了一个领域模型,如下图:

根据建立的领域模型,把通用部分抽象出来,相应的UML图也进行了一些修改,领域模型就已经创建完成了。

3、设计原型界面和交互逻辑

实现对应的一个领域模型,接下来设计原型界面和交互逻辑,交互逻辑可以理解为这个领域模型的各种事件、事件驱动。

4、领域模型自动生成结构框架代码

通过领域模型构建的UML图可直接生成项目框架代码,在框架代码中会生成相应的实体类,以及各种事件也生成了相应的event代码。

UML图自动生成框架代码

5、在框架中进行细化和优化

代码框架可以直接使用,如果还需要扩展其它的内容,比如除了增删改以外,还希望具有查询历史版本的功能,这种event在领域图上难以表达,或者是表达了之后生成的也不一定准确,所以这种情况的代码需要软件开发者来编写。但是已经不需要再关注那些框架性的接口或者服务层的问题了,只需要在相应的地方,对特性能力进行增强即可。

通过以上步骤完成的建模软件系统落地, 既能自动生成代码又能做好看护,保持架构与DDD模型的一致性。

通过以上讲解,您对领域驱动设计(DDD)理念有初步的了解了吗?任何理念的应用都需要深入的体会和反复的实践,希望本文能给大家一些启发和帮助。

点击关注,第一时间了解华为云新鲜技术~

云原生时代,领域驱动设计思想(DDD)如何落地?的更多相关文章

  1. 领域驱动设计(DDD)的实践经验分享之ORM的思考

    原文:领域驱动设计(DDD)的实践经验分享之ORM的思考 最近一直对DDD(Domain Driven Design)很感兴趣,于是去网上找了一些文章来看看,发现它确实是个好东西.于是我去买了两本关于 ...

  2. 领域驱动设计(DDD)的实践经验分享之持久化透明

    原文:领域驱动设计(DDD)的实践经验分享之持久化透明 前一篇文章中,我谈到了领域驱动设计中,关于ORM工具该如何使用的问题.谈了很多我心里的想法,大家也对我的观点做了一些回复,或多或少让我深深感觉到 ...

  3. 领域驱动设计(DDD)部分核心概念的个人理解

    领域驱动设计(DDD)是一种基于模型驱动的软件设计方式.它以领域为核心,分析领域中的问题,通过建立一个领域模型来有效的解决领域中的核心的复杂问题.Eric Ivans为领域驱动设计提出了大量的最佳实践 ...

  4. 一次领域驱动设计(DDD)的实际应用

    笔者先前参与了一个有关汽车信息的网站开发,用于显示不同品牌的汽车的信息,包括车型,发动机型号,车身尺寸和汽车报价等信息.在建模时,我们只需要创建名为Car的实体(Entity)对象.其他的信息,比如车 ...

  5. 领域驱动设计(DDD)部分核心概念的个人理解(转)

    领域驱动设计(DDD)是一种基于模型驱动的软件设计方式.它以领域为核心,分析领域中的问题,通过建立一个领域模型来有效的解决领域中的核心的复杂问题.Eric Ivans为领域驱动设计提出了大量的最佳实践 ...

  6. 领域驱动设计(DDD)的实际应用

    领域驱动设计(DDD)的实际应用   笔者先前参与了一个有关汽车信息的网站开发,用于显示不同品牌的汽车的信息,包括车型,发动机型号,车身尺寸和汽车报价等信息.在建模时,我们只需要创建名为Car的实体( ...

  7. 【DDD】使用领域驱动设计思想实现业务系统

    最近新接了一个业务系统——社区服务系统,为了快速熟悉和梳理老系统的业务逻辑和代码,同时对老系统代码做一些优化,于是打算花上一个月时间不间断地对老系统服务进行重构.同时,考虑到社区业务的复杂性,想起了之 ...

  8. .NET领域驱动设计—看DDD是如何运用设计模式颠覆传统架构

    阅读目录: 1.开篇介绍 2.简单了解缘由(本文的前期事宜) 3.DomainModel扩展性(运用设计模式设计模型变化点) 3.1.模型扩展性 3.2.设计模式的使用(苦心专研的设计模式.设计思想可 ...

  9. 基于“事件”驱动的领域驱动设计(DDD)框架分析

    摘抄自 从去年10月份开始,学了几个月的领域驱动设计(Domain Driven Design,简称DDD).主要是学习领域驱动设计之父Eric Evans的名著:<Domain-driven ...

  10. [转] .NET领域驱动设计—看DDD是如何运用设计模式颠覆传统架构

    阅读目录: 1.开篇介绍 2.简单了解缘由(本文的前期事宜) 3.DomainModel扩展性(运用设计模式设计模型变化点) 3.1.模型扩展性 3.2.设计模式的使用(苦心专研的设计模式.设计思想可 ...

随机推荐

  1. [论文研读]空天地一体化(SAGIN)的网络安全_A_Survey_on_Space-Air-Ground-Sea_Integrated_Network_Security_in_6G

    ------------恢复内容开始------------ 空天地一体化(SAGIN)的网络安全 目前关注的方面: 集中在安全通信.入侵检测.侧通道攻击.GPS欺骗攻击.网络窃听.消息修改/注入等方 ...

  2. 从零开始搭建antd4.x + react16 + redux4 + webpack4 + react-router5基础框架解析

    以上是2020年10月份的版本,后来,我将xmind进行了完善,文档也写的差不多了,可是,电脑坏了,硬盘换了,文件都没有了.这已经是第三次写这个文档了,思维导图就不更新了,按照几个重点进行说明. 这个 ...

  3. Acwing127周赛第三题 构造矩阵 (套路)

    题目链接:构造矩阵 题目描述 我们希望构造一个 n×m 的整数矩阵. 构造出的矩阵需满足: 每一行上的所有元素之积均等于 k. 每一列上的所有元素之积均等于 k. 保证 k 为 1 或 −1. 请你计 ...

  4. Promise规范与原理解析

    摘要 Promise对象用于清晰的处理异步任务的完成,返回最终的结果值,本次分享主要介绍Promise的基本属性以及Promise内部的基础实现,能够帮我们更明确使用场景.更快速定位问题. Promi ...

  5. Linux-目录层次标准

    版权声明:原创作品,谢绝转载!否则将追究法律责任. ----- 作者:kirin 根目录(/) 根目录是整个系统最重要的一个目录,因为不但所有的目录都是由根目录衍生出来的,同时根目录也与开机.还原.系 ...

  6. 校园社团活动管理系统(适合小白)基础javaweb前端项目实战【包含增删改查,mysql】一

    校园社团活动管理系统(20分) 1.项目需求: 校园社团作为高校课外活动的重要组成部分,发展十分迅速,也受到越来越多学生的欢迎,社团规模.数量等都在日益增长,社团活动也更为多样和丰富.然而,大多数高校 ...

  7. Vs code创建项目教程

    1.首先,vscode本身没有新建项目的选项,所以要先创建一个空的文件夹. 2.然后打开vscode,再在vscode里面打开文件夹,这样才可以创建项目. 3.选择一个空文件夹. 4.Ctrl+shi ...

  8. springMvc_快速入门

    概念:是一种基于Java实现mvc模型的轻量级web框架 优点:使用简单,开发便捷    灵活性强 总体来说springMvc就是来替代servlet的一种工具 快速入门: 1.创建maven-web ...

  9. 如何 使 Java、C# md5 加密的值保持一致

    Java C# md5 加密值保持一致,一般是编码不一致造成的值不同 JAVA (加密:123456) C#(加密:123456) UTF-8 e10adc3949ba59abbe56e057f20f ...

  10. 一个ssh无法远程登录的问题跟踪解决

    用户反馈龙芯服务器系统loongnix-server使用root用户ssh远程登录,有时候可以有时候又无法登录,频繁出现错误:Permission denied,please try again.我分 ...