接触到DDD到现在已经有8个月份了,目前所维护的项目也是基于DDD的思想开发的,从一开始的无从下手,到现在游刃有余,学到不少东西,但是都是一些关键字和零散的知识,同时我也感受到了是因为我对项目越来越熟悉,熟能生巧导致我现在在做需求的时候根本不用过多的去思考,就能很好的完成业务需求,我慢慢的意识到,学习DDD是非常有必要的。

在传统的开发模式中,产品经理在跟业务专家沟通业务需求后,对其进行抽象并将结果通过口头或者项目管理工具传达到开发人员,开发人员根据产品经理传递的业务需求机械式地进行功能开发,这样的模式使开发人员没有真正的理解业务原理,开发出来的功能就很难达到业务方的要求,即使达到要求也难以应对未来的业务变化。

如果大家都运用DDD的思想进行开发,就能很好的传递业务知识,因为DDD倡导开发人员、产品经理、领域专业一起讨论、消化业务知识,彻底理解业务原理。

以下是我在学习DDD时做的一些笔记,并整理成思维导图的形式,这样就能很好的形成结构化的思维,希望能让大家对DDD有一个更深的理解。

以下内容部分摘自 《领域驱动设计》和根据自己的理解整理而成。

1.1 有效建模的要素

模型和现实绑定

开发人员与产品经理在讨论需求的时候,都会画一些草图和对草图做一些文字说明,这其实就是最初的模型。最初的原型虽然简陋,但它在模型与与实现之间建立了早期链接,而且在所有的后续迭代中我们一直在维护该链接。

建立一种基于模型的语言

  1. 起初领域专家不得不向开发人员解释业务知识
  2. 开发人员也必需向领域专家解释类图的含义
  3. 随着项目的进展,双方都能够使用模型中的术语,并将它们组织成符合模型结构的语句 ,而且可以无需翻译就能互相理解要表达的意思

领域专家专注业务领域,开发人员专注开发,两个不同领域的人在没有形成统一语言的前提下是很难沟通的,比如电商领域专家抛出订单履约的概念的时候,不得不在解释什么是订单履约时,还得向开发人员翻译里面的各种名词,如果领域专家和开发人员知识对等,就能互相理解各自要表达的意思。

开发一个蕴含丰富知识的模型

  1. 对象具有行和为强制性的规定
  2. 模型并不仅仅是一种数据模型
  3. 模型应包含各种类型的知识

提炼模型

在模型日趋完整的过程中,要提炼模型,要将新的概念添加到模型中,同时将不再使用的或者不重要的概念从模型中移除。

头脑风暴和实验

  1. 语言和草图,再加上头脑风暴,将我们的讨论变成“模型实验室”在这些讨论中可以演示、尝试和判断上百种变化
  2. 当团队走查场景时,口头表达本身就可以作为所提议模型的可行性测试,因为人们听到口头表达后,就能立即分辨出它是表达得清楚、简洁还是表达的笨拙

1.2 消化知识

高效的领域建模人员是知识的消化者

建模人员需要从大量的信息中寻找有有的部分,然后不断的尝试各种信息组织方式,努力寻找对大量信息有意义的知识。

知识消化并非一项孤立的活动

  1. 一般由开发人员领导下,由开发人员与领域专家组成团队来共同协作。
  2. 共同收集信息,并通过消化而将它们组织为有用的形式
  3. 信息的原始资源来自领域专家头脑中的知识、现有用户、以及技术团队在相关遗留系统或者同领域其他项目中积累的经验

传统瀑布模式的不足

业务专家与分析员(产品经理)进行讨论,分析员消化理解这些业务知识后,对其进行抽象并将结果传递给程序员,再由程序员编写软件代码。

  1. 这种方法完全没有反馈(程序员没有提供自己的想法)
  2. 分析员全权负责创建模型,但他们创建的模型只是基于业务专家的建议
  3. 分析员没有向程序员学习,得不到早期版本的经验
  4. 知识只是朝一个方向流动,不会累积

领域专家与开发人同一起消化理解模型的好处

在团队所有成员一起消化理解模型的过程中,他们之间的交互也会发生变化。

  1. 领域模型的不断精化迫使开发人员学习重要的业务原理,而不是机械地进行功能开发
  2. 领域专家被迫提炼自己已知道的重要知识的过程往往也是完善其自身理解的过程,而且他们会渐渐理解软件项目所必需的概念严谨性。

小结

开发人员、分析员、领域专家,都应该将自己的知识输入到模型中,这样模型的组织更严密,抽象也更为整洁。

模型不断改进的同时 ,也成为组织项目信息流的工具。模型聚焦于需求分析,它与编码和设计紧密交互。

1.3 持续学习

当开始编写软件时,其实我们所知甚少

项目知识零散地分散在很多人和文档中,其中夹杂着其他一些无用的信息,因此我们甚至不知道哪些知识是真正需要的知识。

看起来没有什么技术难度的领域很可能是一种错觉 -- 我们并没有意识到不知道的东西究竟有多少。这种无知往往会导致我们做出错误的判断。

所有的项目都会丢失知识

  1. 已经学到了一些知识的人可能去干别的事了
  2. 团队由于重组而被拆散,这导致知识又被重新分散开
  3. 被外包出去的关键子系统可能只交回了代码,而不会将知识传递回来

当使用典型的设计方法时,代码和文档不会以一种有用的形式表示出这些来之不易的知识。因此一但由于某些原因团队成员没有口头传递知识,那么知识就会丢失。

高效率的团队需要有意识地积累知识,并持续学习

对于开发人员来说, 这意味着既要完善技术知识,也要培养一般的领域建模技巧。但这也包括认真学习他们正在正在从事的特定领域知识。

那些善于自学的团队成员会成为团队的中坚力量,涉及最关键领域的开发任务要靠他们来攻克。这个核心团队头脑中积累的知识使他们成为更高效的知识消化者。

1.4 知识丰富的设计

  1. 业务活动和规则如同所涉及的实体一样,但是领域的核心,任何领域都有各种类别的概念。

  2. 知识消化所产生的模式,能够反映出对知识的深层理解。

  3. 在模型发生改变的同时,开发人员对实现进行重构,以便反映出模型的变化,这样,新知道就被合并到应用程序中了

1.5 深层模型

有用的模式很少停留在表面上, 随着对领域和应用程序需求的理解逐步加深,我们往往会丢最初看起来很重要的表面元素,或者切换它们的角度。这时,一些开始不可能发现的巧妙抽象就会渐渐的浮出水面, 而它们恰恰切中问题的要害。

推荐

学习 DDD 之消化知识!的更多相关文章

  1. 学习DDD之路--勇于纠正自己的错误

    写这篇文章主要是之前三篇对DDD的介绍算是自己学习的一次试水,也希望能够有更多的人能帮我发现其中的问题.昨天继续阅读了DDD书,发现了自己之前的例子存在了一些问题,早上也和园友进行了一些讨论.最后整理 ...

  2. 如何学习FPGA?FPGA学习必备的基础知识

    如何学习FPGA?FPGA学习必备的基础知识 时间:2013-08-12 来源:eepw 作者: 关键字:FPGA   基础知识       FPGA已成为现今的技术热点之一,无论学生还是工程师都希望 ...

  3. TestNG学习-001-基础理论知识

    此 文主要讲述用 TestNG 的基础理论知识,TestNG 的特定,编写测试过程三步骤,与 JUnit4+ 的差异,以此使亲对 TestNG 测试框架能够有一个简单的认知. 希望能对初学 TestN ...

  4. MyBatis:学习笔记(1)——基础知识

    MyBatis:学习笔记(1)--基础知识 引入MyBatis JDBC编程的问题及解决设想 ☐ 数据库连接使用时创建,不使用时就释放,频繁开启和关闭,造成数据库资源浪费,影响数据库性能. ☐ 使用数 ...

  5. Android开发学习必备的java知识

    Android开发学习必备的java知识本讲内容:对象.标识符.关键字.变量.常量.字面值.基本数据类型.整数.浮点数.布尔型.字符型.赋值.注释 Java作为一门语言,必然有他的语法规则.学习编程语 ...

  6. C#学习笔记(基础知识回顾)之值类型与引用类型转换(装箱和拆箱)

    一:值类型和引用类型的含义参考前一篇文章 C#学习笔记(基础知识回顾)之值类型和引用类型 1.1,C#数据类型分为在栈上分配内存的值类型和在托管堆上分配内存的引用类型.如果int只不过是栈上的一个4字 ...

  7. C#学习笔记(基础知识回顾)之值传递和引用传递

    一:要了解值传递和引用传递,先要知道这两种类型含义,可以参考上一篇 C#学习笔记(基础知识回顾)之值类型和引用类型 二:给方法传递参数分为值传递和引用传递. 2.1在变量通过引用传递给方法时,被调用的 ...

  8. C#学习笔记(基础知识回顾)之值类型和引用类型

    一:C#把数据类型分为值类型和引用类型 1.1:从概念上来看,其区别是值类型直接存储值,而引用类型存储对值的引用. 1.2:这两种类型在内存的不同地方,值类型存储在堆栈中,而引用类型存储在托管对上.存 ...

  9. 3 学习UML图 学习DDD的基本概念

    今天在学习DDD的过程中看到了大神 圣杰的博文 个人觉得非常经典 强烈推荐  在此提供url链接: UML类图10分钟快速入门 关于聚合 的理解 :一类没有紧密相关的东西聚在一起 ,分开了也可以独立存 ...

随机推荐

  1. Nginx安装及核心配置解析

    安装 使用yum进行安装 yum install -y nginx 查看nginx的安装位置 whereis nginx 启动测试 nginx 核心配置文件结构 读取Nginx自带的Nginx配置文件 ...

  2. GIS应用|快速开发REST数据服务

    随着计算机的快速发展,GIS已经在各大领域得到应用,和我们的生活息息相关, 但是基于GIS几大厂商搭建服务,都会有一定的门槛,尤其是需要server,成本高,难度大,这里介绍一种在线GIS云平台,帮你 ...

  3. 文本域textarea的一个小细节

    文本域代码在编写时,最好写在一行上,就像: 如果没写在一行上,如: 那么就会在后续生成的页面上输入的时候就会产生一段空白无法删除: 这是写文本框的时候的一个小细节

  4. docker内服务访问宿主机服务

    目录 1. 场景 2. 解决 4. 参考 1. 场景 使用windows, wsl2 进行日常开发测试工作. 但是wsl2经常会遇到网络问题.比如今天在测试一个项目,核心功能是将postgres 的数 ...

  5. Golang通脉之函数

    函数是组织好的.可重复使用的.用于执行指定任务的代码块. Go语言中支持函数.匿名函数和闭包,并且函数在Go语言中属于"一等公民". 函数定义 Go语言中定义函数使用func关键字 ...

  6. java---String 和 StringBuffer

    Java-String和StringBuffer类 Java String 类 字符串在Java中属于对象,Java提供String类来创建和操作字符串. 创建字符串 创建字符串常用的方法如下: ​ ...

  7. mac无坑安装nginx

    mac无坑安装nginx 首先需要mac下有一个缺失的软件包的管理器------->homebrew 1.打开终端输入 brew update 说明homebrew已经安装好了 2.继续执行以下 ...

  8. SharkCTF2021 easy_phpserialize题记

    ***先说教训: (1)不要看到正则就走不动路:有些正则不一定能绕. (2)__wakeup()漏洞在php5.6以上就被修复了: 本地复现各种题目时要注意环境. -------- 扫描,得到inde ...

  9. 【c++ Prime 学习笔记】第14章 重载运算与类型转换

    14.1 基本概念 重载的运算符是特殊的函数:名字由关键字operator后接要定义的算符共同组成,也有返回类型.参数列表.函数体. 重载运算符函数的参数量与该算符作用的运算对象数量一样多 除重载调用 ...

  10. Golang通脉之错误处理

    在实际工程项目中,总是通过程序的错误信息快速定位问题,但是又不希望错误处理代码写的冗余而又啰嗦.Go语言没有提供像Java.C#语言中的try...catch异常处理方式,而是通过函数返回值逐层往上抛 ...