方法论 | 领域驱动设计 · 引子

发布于 2021-01-02 13:01

阳光下的梦 崔健 - 光冻
总第003篇
撰文王咚咚
出品王咚咚编辑部

朋友们新年快乐!

上一篇推送开启了一个新话题:微服务。

谈起微服务实践,最先要研究的就是服务的拆分策略。

谈起服务拆分策略,就不得不提到【领域驱动设计】。

于是,我决定先暂停微服务的话题更新,开启一个新话题:方法论。

在这个话题中,我们将探讨一些软件工程的具体实践方法,我们会首先讨论【领域驱动设计】,接着会聊聊【敏捷模式】、【DevOps】。

【领域驱动设计】内容较多,预计会分多次进行推送。

该系列结束后将继续更新微服务话题。

    新坑越开越多了呢

软件工程领域的知识谱系,是典型的网状结构,无论我们走深度优先还是广度优先的遍历方式,最终都会殊途同归。

                                                                                                         

"Wir mussen wissen. Wir werden wissen.(我们必须知道我们必将知道。)"

—— 戴维·希尔伯特(David Hilbert,1862~1943,德国著名数学家)




DDD是什么?

领域驱动设计(Domain-driven design,缩写 DDD来自于 Evic Evans 在2003年出版的著作《Domain-Driven Design : Tackling Complexity in the Heart of Software(领域驱动设计:软件核心复杂性应对之道)领域驱动设计自诞生至今,已有了十余年的光阴。
领域驱动设计是一种软件设计方法论,它通过多种具体的方法,将业务进行领域化建模,以领域模型驱动架构设计,使得代码架构能够随业务持续演进,以解决业务的高复杂度带来的各种难题,实现软件的高质量目标

1

荐读 

大家如果想要深入了解DDD,有两本书是绕不开的,它们分别是《领域驱动设计:软件核心复杂性应对之道(Domain-Driven Design : Tackling Complexity in the Heart of Software)》和《实现领域驱动设计(Implementing Domain-Driven Design)》。前者是DDD理论的开山经典之作,后者更侧重于对理论的诠释与实践。


 Evic Evans 的理论很有前瞻性,在领域驱动设计诞生后的十多年中,行业内软件设计复杂度普遍化地持续提升,如今已经成为一个很有代表性的技术管理难题。

我们常常说,这是一个 “VUCA” 的时代。

“VUCA” 指的是突出的四大特征:Volatility(易变性)Uncertainty(不确定性)Complexity(复杂性) Ambiguity(模糊性)

传统企业的 数字化转型 已经不是新鲜,企业强调 “数字化转型” 或 “数字化建设” 的持续性、常态化。前几年我们热衷于讨论的一些热词, “跨界打击” 也好“降维打击”  也罢,现在已经越来越少看到
因为我们都已经习惯:唯一不变的,就是变化本身。

复杂度与灵活性相加,是个很要命的问题。
相关具体内容,朋友们可以参考上一期推送:灰犀牛 · 大泥球架构》
微服务 | 灰犀牛 · 大泥球架构

我们有两类具体的措施来应对这个难题。

一是从技术架构的角度看,我们可以选择服务化的演进策略。二是从流程管理的角度看,我们可以选择实施敏捷模式或DevOps。但是这两类措施的具体实践,归结到设计层面,都要依赖于一个共同的基础,那就是一套完备的务模型,它在DDD中被称之为 “领域模型”。

运用领域模型

所谓 “模型” ,就是对特定的现实世界的事物的一种抽象与归纳,把与解决问题相关的方面提取出来,忽略无关的东西。每个软件程序是为了执行用户的某项具体业务,或是满足用户的某种需求。这些业务或需求的覆盖范围或知识体系,就是软件的 “领域” 。

从本质上来说,软件开发过程就是从 “问题空间” 到 “解决方案空间” 的一个映射转化。“问题空间” 包括了需求与业务分析,“解决方案空间” 包括了模型、组件、架构、设计与实现方案。领域模型就是 “解决方案空间” 的抽象结构化的归纳。

领域模型能帮助我们做什么?

(1)为了创建真正能为用户业务所用的软件,开发团队必须掌握一整套具体的业务知识体系。所需知识的广度可能令人望而生畏,庞大而复杂的信息也可能超乎想象。开发人员常常对业务知识不感兴趣,抵触情绪让他们难以潜心深入学习,另外时间和效率方面也不会允许。而领域模型对业务知识进行了选择性的简化和有意的结构化正是解决此类信息超载问题的工具

(2)领域模型是业务描述的严格且规范的抽象,绝不是主观且随意的。领域模型有助于帮助业务专家和需求分析人员进行高效沟通,通过建立 “通用语言”(在业务层面与技术层面均可以无歧义使用的共同术语),搭建起贯通需求方到开发者的一致性的交流基础,帮助双方识别并保证业务需求的逻辑性、准确性、简洁性。

(3)领域模型伴随代码持续演进,系统的维护和功能扩展都依赖于领域模型。团队新加入的开发人员可以通过领域模型快速理解业务与代码,当用户提出新的需求后,我们也可以基于领域模型进行识别与反馈。

分而治之

      

DDD 指导下的软件设计主要分为2个部分:战略设计和战术设计。

战略设计层面主要实现了业务的领域划分,DDD 提出了域、子域、限界上下文、通用语言等重要概念;术设计层面主要实现了业务的领域建模,DDD 提出了实体、值对象、领域服务、领域事件、聚合、工厂、资源库等重要概念。

DDD通过战略设计和战术设计两个层面,将传统的独立模型的方式进行拆解,为每一个子域定义单独的领域模型,采取分而治之的思想,将复杂问题进行有序拆分,各个击破。

在此基础之上,开发过程和代码分析不再是以数据模型为起点,而是以领域模型为起点,这是符合面向对象思想的。一个反面例子是,传统的J2EE的开发模式仅仅面向于数据模型,对象只是数据的载体,缺乏行为和动作的定义,大量的getter和setter淹没了面向对象的本质。这种对象在DDD中被称为贫血领域对象(Anemic Domain Object)。

       DDD分而治之的思想与微服务模式不谋而合,在中台建设中也能提供足够标准化的理论指导,这也是DDD近几年火起来的重要原因。

立足小城,侧耳听风

2021年,陪你聊聊云原生、交互设计、技术管理

本文来自网络或网友投稿,如有侵犯您的权益,请发邮件至:aisoutu@outlook.com 我们将第一时间删除。

相关素材