学习 DDD 之消化知识!
接触到DDD到现在已经有8个月份了,目前所维护的项目也是基于DDD的思想开发的,从一开始的无从下手,到现在游刃有余,学到不少东西,但是都是一些关键字和零散的知识,同时我也感受到了是因为我对项目越来越熟悉,熟能生巧导致我现在在做需求的时候根本不用过多的去思考,就能很好的完成业务需求,我慢慢的意识到,学习DDD是非常有必要的。
在传统的开发模式中,产品经理在跟业务专家沟通业务需求后,对其进行抽象并将结果通过口头或者项目管理工具传达到开发人员,开发人员根据产品经理传递的业务需求机械式地进行功能开发,这样的模式使开发人员没有真正的理解业务原理,开发出来的功能就很难达到业务方的要求,即使达到要求也难以应对未来的业务变化。
如果大家都运用DDD的思想进行开发,就能很好的传递业务知识,因为DDD倡导开发人员、产品经理、领域专业一起讨论、消化业务知识,彻底理解业务原理。
以下是我在学习DDD时做的一些笔记,并整理成思维导图的形式,这样就能很好的形成结构化的思维,希望能让大家对DDD有一个更深的理解。
以下内容部分摘自 《领域驱动设计》和根据自己的理解整理而成。
1.1 有效建模的要素
模型和现实绑定
开发人员与产品经理在讨论需求的时候,都会画一些草图和对草图做一些文字说明,这其实就是最初的模型。最初的原型虽然简陋,但它在模型与与实现之间建立了早期链接,而且在所有的后续迭代中我们一直在维护该链接。
建立一种基于模型的语言
- 起初领域专家不得不向开发人员解释业务知识
- 开发人员也必需向领域专家解释类图的含义
- 随着项目的进展,双方都能够使用模型中的术语,并将它们组织成符合模型结构的语句 ,而且可以无需翻译就能互相理解要表达的意思
领域专家专注业务领域,开发人员专注开发,两个不同领域的人在没有形成统一语言的前提下是很难沟通的,比如电商领域专家抛出订单履约的概念的时候,不得不在解释什么是订单履约时,还得向开发人员翻译里面的各种名词,如果领域专家和开发人员知识对等,就能互相理解各自要表达的意思。
开发一个蕴含丰富知识的模型
- 对象具有行和为强制性的规定
- 模型并不仅仅是一种数据模型
- 模型应包含各种类型的知识
提炼模型
在模型日趋完整的过程中,要提炼模型,要将新的概念添加到模型中,同时将不再使用的或者不重要的概念从模型中移除。
头脑风暴和实验
- 语言和草图,再加上头脑风暴,将我们的讨论变成“模型实验室”在这些讨论中可以演示、尝试和判断上百种变化
- 当团队走查场景时,口头表达本身就可以作为所提议模型的可行性测试,因为人们听到口头表达后,就能立即分辨出它是表达得清楚、简洁还是表达的笨拙
1.2 消化知识
高效的领域建模人员是知识的消化者
建模人员需要从大量的信息中寻找有有的部分,然后不断的尝试各种信息组织方式,努力寻找对大量信息有意义的知识。
知识消化并非一项孤立的活动
- 一般由开发人员领导下,由开发人员与领域专家组成团队来共同协作。
- 共同收集信息,并通过消化而将它们组织为有用的形式
- 信息的原始资源来自领域专家头脑中的知识、现有用户、以及技术团队在相关遗留系统或者同领域其他项目中积累的经验
传统瀑布模式的不足
业务专家与分析员(产品经理)进行讨论,分析员消化理解这些业务知识后,对其进行抽象并将结果传递给程序员,再由程序员编写软件代码。
- 这种方法完全没有反馈(程序员没有提供自己的想法)
- 分析员全权负责创建模型,但他们创建的模型只是基于业务专家的建议
- 分析员没有向程序员学习,得不到早期版本的经验
- 知识只是朝一个方向流动,不会累积
领域专家与开发人同一起消化理解模型的好处
在团队所有成员一起消化理解模型的过程中,他们之间的交互也会发生变化。
- 领域模型的不断精化迫使开发人员学习重要的业务原理,而不是机械地进行功能开发
- 领域专家被迫提炼自己已知道的重要知识的过程往往也是完善其自身理解的过程,而且他们会渐渐理解软件项目所必需的概念严谨性。
小结
开发人员、分析员、领域专家,都应该将自己的知识输入到模型中,这样模型的组织更严密,抽象也更为整洁。
模型不断改进的同时 ,也成为组织项目信息流的工具。模型聚焦于需求分析,它与编码和设计紧密交互。
1.3 持续学习
当开始编写软件时,其实我们所知甚少
项目知识零散地分散在很多人和文档中,其中夹杂着其他一些无用的信息,因此我们甚至不知道哪些知识是真正需要的知识。
看起来没有什么技术难度的领域很可能是一种错觉 -- 我们并没有意识到不知道的东西究竟有多少。这种无知往往会导致我们做出错误的判断。
所有的项目都会丢失知识
- 已经学到了一些知识的人可能去干别的事了
- 团队由于重组而被拆散,这导致知识又被重新分散开
- 被外包出去的关键子系统可能只交回了代码,而不会将知识传递回来
当使用典型的设计方法时,代码和文档不会以一种有用的形式表示出这些来之不易的知识。因此一但由于某些原因团队成员没有口头传递知识,那么知识就会丢失。
高效率的团队需要有意识地积累知识,并持续学习
对于开发人员来说, 这意味着既要完善技术知识,也要培养一般的领域建模技巧。但这也包括认真学习他们正在正在从事的特定领域知识。
那些善于自学的团队成员会成为团队的中坚力量,涉及最关键领域的开发任务要靠他们来攻克。这个核心团队头脑中积累的知识使他们成为更高效的知识消化者。
1.4 知识丰富的设计
业务活动和规则如同所涉及的实体一样,但是领域的核心,任何领域都有各种类别的概念。
知识消化所产生的模式,能够反映出对知识的深层理解。
在模型发生改变的同时,开发人员对实现进行重构,以便反映出模型的变化,这样,新知道就被合并到应用程序中了
1.5 深层模型
有用的模式很少停留在表面上, 随着对领域和应用程序需求的理解逐步加深,我们往往会丢最初看起来很重要的表面元素,或者切换它们的角度。这时,一些开始不可能发现的巧妙抽象就会渐渐的浮出水面, 而它们恰恰切中问题的要害。
推荐
- 分享一套家庭理财系统(附源码)
- 推荐一套开源通用后台管理系统(附源码)
- 推荐一个酷炫的监控系统
- 从朋友那里搞了 20 个实战项目,速领!
- 推荐一个完善的停车管理系统,物联网项目springboot,附源码
- 推荐一个互联网企业级别的开源支付系统
- 一款神仙接私活儿软件,吊到不行!
- 推荐 10 款超实用的企业级开源应用!
- 开放平台 SDK 设计实践!
- “淘宝” 开放平台接口设计思路
- Spring中经典的9种设计模式
学习 DDD 之消化知识!的更多相关文章
- 学习DDD之路--勇于纠正自己的错误
写这篇文章主要是之前三篇对DDD的介绍算是自己学习的一次试水,也希望能够有更多的人能帮我发现其中的问题.昨天继续阅读了DDD书,发现了自己之前的例子存在了一些问题,早上也和园友进行了一些讨论.最后整理 ...
- 如何学习FPGA?FPGA学习必备的基础知识
如何学习FPGA?FPGA学习必备的基础知识 时间:2013-08-12 来源:eepw 作者: 关键字:FPGA 基础知识 FPGA已成为现今的技术热点之一,无论学生还是工程师都希望 ...
- TestNG学习-001-基础理论知识
此 文主要讲述用 TestNG 的基础理论知识,TestNG 的特定,编写测试过程三步骤,与 JUnit4+ 的差异,以此使亲对 TestNG 测试框架能够有一个简单的认知. 希望能对初学 TestN ...
- MyBatis:学习笔记(1)——基础知识
MyBatis:学习笔记(1)--基础知识 引入MyBatis JDBC编程的问题及解决设想 ☐ 数据库连接使用时创建,不使用时就释放,频繁开启和关闭,造成数据库资源浪费,影响数据库性能. ☐ 使用数 ...
- Android开发学习必备的java知识
Android开发学习必备的java知识本讲内容:对象.标识符.关键字.变量.常量.字面值.基本数据类型.整数.浮点数.布尔型.字符型.赋值.注释 Java作为一门语言,必然有他的语法规则.学习编程语 ...
- C#学习笔记(基础知识回顾)之值类型与引用类型转换(装箱和拆箱)
一:值类型和引用类型的含义参考前一篇文章 C#学习笔记(基础知识回顾)之值类型和引用类型 1.1,C#数据类型分为在栈上分配内存的值类型和在托管堆上分配内存的引用类型.如果int只不过是栈上的一个4字 ...
- C#学习笔记(基础知识回顾)之值传递和引用传递
一:要了解值传递和引用传递,先要知道这两种类型含义,可以参考上一篇 C#学习笔记(基础知识回顾)之值类型和引用类型 二:给方法传递参数分为值传递和引用传递. 2.1在变量通过引用传递给方法时,被调用的 ...
- C#学习笔记(基础知识回顾)之值类型和引用类型
一:C#把数据类型分为值类型和引用类型 1.1:从概念上来看,其区别是值类型直接存储值,而引用类型存储对值的引用. 1.2:这两种类型在内存的不同地方,值类型存储在堆栈中,而引用类型存储在托管对上.存 ...
- 3 学习UML图 学习DDD的基本概念
今天在学习DDD的过程中看到了大神 圣杰的博文 个人觉得非常经典 强烈推荐 在此提供url链接: UML类图10分钟快速入门 关于聚合 的理解 :一类没有紧密相关的东西聚在一起 ,分开了也可以独立存 ...
随机推荐
- python json中的 dumps loads函数
一.概念理解 1.json.dumps()和json.loads()是json格式处理函数(可以这么理解,json是字符串) (1)json.dumps()函数是将一个Python数据类型列表进行js ...
- [源码解析] PyTorch如何实现前向传播(3) --- 具体实现
[源码解析] PyTorch如何实现前向传播(3) --- 具体实现 目录 [源码解析] PyTorch如何实现前向传播(3) --- 具体实现 0x00 摘要 0x01 计算图 1.1 图的相关类 ...
- tomcat内存马原理解析及实现
内存马 简介 Webshell内存马,是在内存中写入恶意后门和木马并执行,达到远程控制Web服务器的一类内存马,其瞄准了企业的对外窗口:网站.应用.但传统的Webshell都是基于文件类型的,黑客 ...
- 第二次Alpha Scrum Meeting
本次会议为Alpha阶段第二次Scrum Meeting会议 会议概要 会议时间:2021年4月24日 会议地点:线上会议 会议时长:30min 会议内容简介:本次会议主要由每个人展示自己目前完成的工 ...
- 第四次Scrum Metting
日期:2021年4月29日 会议主要内容概述:交代近两日工作,进一步细化上次讨论细节,代码合并. 一.进度情况## 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 徐宇龙 后端 ...
- [no code][scrum meeting] Beta 1
$( "#cnblogs_post_body" ).catalog() 会议纪要 会议在微信群进行:集体反思alpha阶段博客分数尤其是scrum博客分数低的问题,讨论beta阶段 ...
- CSS 奇技淫巧 | 巧妙实现文字二次加粗再加边框
本文将通过一个实际的业务需求,讲解如何实现 极端场景下文字加粗加边框效果 文字多重边框的效果 需求背景 - 文字的二次加粗 今天遇到这样一个有意思的问题: 在文字展示的时候,利用了 font-weig ...
- hdu 5055 Bob and math problem (很简单贪心)
给N个数字(0-9),让你组成一个数. 要求:1.这个数是奇数 2.这个数没有前导0 问这个数最大是多少. 思路&解法: N个数字从大到小排序,将最小的奇数与最后一位交换,把剩下前N-1位从大 ...
- Openeuler安装完整man手册
Openeuler安装完整man手册 在 Debian 和 Ubuntu 中安装了Shell 前端软件包管理器apt(Advanced Packaging Tool),可以通过如下方式安装. ...
- 记一次线上环境 ES 主分片为分配故障
故障前提 ElasticSearch 版本:5.2 集群节点数:5 索引主分片数:5 索引分片副本数:1 线上环境ES存储的数据量很大,当天由于存储故障,导致一时间 5个节点的 ES 集群,同时有两个 ...