接触到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. 从网络通信的演进过程彻底搞懂Redis高性能通信的原理(全网最详细,建议收藏)

    我们一直说Redis的性能很快,那为什么快?Redis为了达到性能最大化,做了哪些方面的优化呢? 在深度解析Redis的数据结构 这篇文章中,其实从数据结构上分析了Redis性能高的一方面原因. 在目 ...

  2. 对epoll机制的学习理解v1

    epoll机制 wrk用非阻塞多路复用IO技术创造出大量的连接,从而达到很好的压力测试效果.epoll就是实现IO多路复用的关键. 本节是对epoll的本质的学习总结,进一步的参考资料为: <深 ...

  3. Intellij IDEA使用姿势

    Intellij IDEA 智能补全的 10 个姿势,太牛逼了.. Intellij Idea非常6的10个姿势

  4. python filter lambda 的使用

    lambda 匿名函数的使用 >>> a=lambda x : x in "1234567890.," >>> a("asd" ...

  5. javascript-原生-结构

    1.获取用户输入内容的方法 window.prompt("提示信息","默认值"); 获取用户输入内容(字符串类型),返回用户输入内容. 2.顺序结构:所有语句 ...

  6. UltraSoft - Alpha - Postmortem 事后分析

    Alpha阶段 Postmortem会议 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 主要是解决DDL提醒功能的问题,定义的比较清楚,对典型用户和典 ...

  7. 模拟赛18 T1 施工 题解

    前言: 真的是不容易啊.这个题在考场上想到了最关键的性质,但是没写出来. 后来写出来,一直调,小错不断. 没想到改的最后一个错误是两个int 乘起来爆了int 其实最后我还是觉得复杂度很假.\(n^2 ...

  8. 2021.9.7考试总结[NOIP模拟49]

    T1 Reverse $BFS$暴力$O(n^2)$ 过程中重复枚举了很多点,考虑用链表记录当前点后面可到达的第一个未更新点. 搜索时枚举翻转子串的左端点,之后便可以算出翻转后$1$的位置. $cod ...

  9. JavaScript中的this对象指向理解

    在JavaScript中,this不是固定不变的,它的指向取决于上下文环境,一般的,认为this指向使用它时所在的对象.主要有以下几类指向: 在方法中,this 表示该方法所属的对象. 如果单独使用, ...

  10. DDD领域驱动设计架构模式:防腐层(Anti-corruption layer)

    在微服务(Microservices)架构实践中,架构设计借用了DDD中的一些概念和技术,比如一个微服务对应DDD中的一个限界上下文(Bounded Context):在微服务设计中应该首先识别出DD ...