大家好,我是霸戈,这周学习了一些关于领域驱动设计的知识 ,对比较深刻的地方做了不少笔记,分享给大家。

在日常需求讨论的时候,经常会碰到一个需求会议开了一个多小时还没有达成共识。作为业务方(领域专家)明明表达的很清楚,但是开发人员却始终无法理解透彻,很明显的原因就是由于双方的知识体系不一致 ,没有形成一种双方互相都能理解的语言。

语言的鸿沟

虽然领域专家对软件开的技术所知有限,但他们熟悉使用自己的领域术语——可能还具有各种不同的风格。另一方面,开发人员可能会用一些描述性的,功能性的术语来理解和讨论系统,而这些术语并不具备领域专家的语言所要传达的意思。

开发人员可能会创建一些用于支持设计的抽象,但领域专家无法理解这些抽象。负责处理不同部分的开发人员可能会开发出各自不同的设计概念以及描述领域的方式。

由于语言上存在鸿沟,领域专家们只能模糊地描述他们想要的东西。开发人员虽然努力的理解一个自己不熟悉的领域,但也只能形成模糊的认识。

虽然少数团队成员会高法掌握这两种语言,但他们会变成信息流的瓶颈,并且他们的翻译也不准确。

相互翻译使模型变得混淆

在一个没有公共语言的项目上,开发人员不得不为领域专家做翻译。而领域专家要充当开发人员与其他领域专家之间的翻译。

这些翻译使模型概念变得混淆,而这会导致有害的代码重构。这种间接的沟通掩盖了分裂的形成——不同的团队成员使用不同的术语而尚不自知。

由于软件各个部分不能够浑然一体,因此这就导致无法开发出可靠的软件。翻译工作导致各类促进深入理解的知识和想法无法结合在一起。

不同语言产生的后果

如果语言支离破碎,项目必将遭遇严重的问题。领域专家使用他们自己的术语,而技术团队使用的语言则经过调整,以便从设计角度讨论领域。

日常讨论所使用的术语与代码中使用的术语不一致。甚至同一个人在讲话和写东西时使用的语言也不一致,这导致的后果是,对领域的深刻表述常常稍纵即逝,根本无法记录到代码或者文档 中。

翻译使得沟通不畅,并削弱了知识消化。 然而任何一方的语言都不能成为公共语言,因为它们无法满足所有的需求。

让领域模型成为公共语言

所有的程序的开销,连带着误解的风险,成本实在太高了。项目需要一种公共语言,这种语言要比所有的语言的最小公分母健壮得多。通过团队的一致努力,领域模型可以成为这种公共语言的核心,同时将团队沟通与软件实现紧密联系在一起。该语言将存在于团队工作中的方方面面。

最小公分母: 就是两个分母的最小公倍数,比如说2和3的最小公倍数是6,那么最小公分母就是6。

通用语言的词汇

通用语言的词汇包括类和主要的操作名称。语言中的术语,有些是用来讨论模型中已经明确的规则,还有些则来自施加于模型的的高级组织原则如:限界上下文、上下文映射图。

基于模型的语言

开发人员应该使用基于模型的语言来描述系统中的工件、任务和功能。这个模型应该为开发人员和领域专家提供一种用于相互交流的语言,而且领域专家还应该使用这种语言来讨论需求、开发计划和特性。语言使用得越普遍,理解进行得就越顺畅。

将模型作为语言的支柱。确保团队在内部的所有交流中以及代码中坚持使用这种语言,在画图、写东西、特别是讲话时也要使用这种语言。

领域专家应该抵制不合适或无法充分表达领域理解的术语或结构,开发人员应该密切关注那些将会妨碍设计的有歧义和不一致的地方 。

总结

在DDD的世界里,不管是作为领域专业还是开发人员,大家在讨论业务的时候都应该使用双方都能理解的语言。尽管在初期这种语言是晦涩难懂的,但随着项目的发展会慢慢渐入佳境。

空有通用语言其实不够,使用口头交流的方式,容易造成知识的丢失,也不利于项目未来的发展。应当建立模型,所有的讨论都是基于模型的,任何的的变更都要反映到模型上面。

推荐

学习 DDD - 通用语言的模式的更多相关文章

  1. 1 DDD理论学习1 通用语言

    通用语言就是将事情描述清楚的语言 达到DDD的目标代码即设计,设计即代码.通俗的讲,也就是开发人员写的代码领域专家也能看懂. ddd模式跟传统模式的一个区别在于 传统先创建数据库表 再根据表创建类.而 ...

  2. DDD理论学习系列(1)-- 通用语言

    1.引言 在开始之前,我想我们有必要先了解以下DDD的主要参与者.因为毕竟语言是人说的吗,就像我们面向对象编程一样,那通用语言面向的是? DDD的主要参与者:领域专家+开发人员 领域专家:精通业务的任 ...

  3. DDD中限界上下文与通用语言的作用

    什么是通用语言 通用语言, 最主要的目的就是减少交流中信息丢失, 在实际开发中, 可能关联很多人, 例如有业务层面的业务细节制定者.领域专家.产品经理.项目经理 .架构师.开发经理.测试经理等等, 即 ...

  4. 学习 DDD 之消化知识!

    接触到DDD到现在已经有8个月份了,目前所维护的项目也是基于DDD的思想开发的,从一开始的无从下手,到现在游刃有余,学到不少东西,但是都是一些关键字和零散的知识,同时我也感受到了是因为我对项目越来越熟 ...

  5. 值得学习的C语言开源项目

    值得学习的C语言开源项目   - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工 ...

  6. 【C/C++开发】值得学习的C语言开源项目

    值得学习的C语言开源项目 - 1. Webbench Webbench是一个在Linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的 ...

  7. IOS学习笔记06---C语言函数

    IOS学习笔记06---C语言函数 --------------------------------------------  qq交流群:创梦技术交流群:251572072              ...

  8. 基于STM32的学习型通用红外遥控设备的设计实现(三)

    CPU: STM32 调试平台: STM32F103ZET和STM32F103VBT 软件平台: Keil uVision4 电路设计: Altium Designer v6.9 http://blo ...

  9. c语言学习书籍推荐《C语言学习路线图•C语言必须知道的300个问题》下载

    下载地址:点我 <C语言学习路线图•C语言必须知道的300个问题>以基础知识为框架,介绍了c语言各部分知识所对应的常见开发疑难问题,并作了透彻地解析.<C语言学习路线图•C语言必须知 ...

随机推荐

  1. gdal3.1.0+VS2017+geos+kml编译总结

    1.简介 gdal3.1.0编译过程中必须依赖proj,编译gdal必须要编译proj,proj的编译需要sqlite3,因此想要编译gdal3.1.0需要先编译proj和sqlite3 2.关于sq ...

  2. Linux C语言链表你学会了吗?

    链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用.链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入节 ...

  3. 矩形覆盖 牛客网 剑指Offer

    矩形覆盖 牛客网 剑指Offer 题目描述 我们可以用21的小矩形横着或者竖着去覆盖更大的矩形.请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? class Solution: ...

  4. Labview一个循环中放两个事件结构会导致前面板锁定的问题

    建议在同一个循环中,只放置一个事件结构.此时,当一个事件发生时,事件结构将对事件进行处理,然后继续循环,事件结构再等待下一个事件发生. 如在同一个循环中放置两个事件结构,只有在两个事件结构都处理了事件 ...

  5. 『动善时』JMeter基础 — 57、Linux系统中运行JMeter脚本

    目录 1.Linux系统中安装Java环境 (1)解压Java安装包 (2)配置Java环境变量 (3)验证Java环境是否配置成功 2.Linux系统中安装JMeter (1)下载JMeter (2 ...

  6. Socket `accept queue is full ` 但是一个连接需要从SYN->ACCEPT

    由于标题长度有限制,我把想要描述的问题再次描述下: 内核通常会为每一个LISTEN状态的Socket维护两个队列: 1 accept队列: listen()函数第二个参数BACKLOG指定,表示已完成 ...

  7. robot_framewok自动化测试--(3)测试项目与测试套件的概念

    测试项目与测试套件的概念 如果你查看当前所创建的项目会发现,"test_project"是一个目录: "test_suit"则是一个 txt 文件: " ...

  8. 一款吊炸天的AI图片增强工具!

    背景 如果你工作中需要制作文档,PPT,或者给文章配图,或者需要制作视频.一定会有在网上寻找图片素材的经历. 但网上的图质量参差不一,有时候找到了喜欢的图,但是质量不行,分辨率太低. 有的人就忍了,但 ...

  9. 反射的妙用:C#通过反射动态生成类型继承接口并实现

    起因 最近想自己鼓捣个RPC,想着简化RPC调用方式,直接申明接口,然后根据接口的属性去配置RPC调用的相关信息.有一种说法叫申明式调用. 简单来说就是,申明一个interface,动态继承并实例化, ...

  10. Part 33 Angular nested scopes and controller as syntax

    Working with nested scopes using $scope object : The following code creates 3 controllers  - country ...