当前位置: 首页 > news >正文

DDD - 理论到落地从统一语言开始

1. 什么是统一语言

DDD 战略设计的第一步就是统一语言,也叫通用语言(UBIQUITOUS LANGUAGE),用于定义上下文的含义。

  • 定义:提炼领域知识的产出物,体现在两个方面:① 统一的领域术语;②领域行为描述。

  • 如何获取:统一语言就是需求分析的过程,也是团队中各个角色就系统目标、范围与具体功能达成一致的过程。

  • 强调统一:无论是与领域专家的讨论,还是最终的实现代码,都使用相同的术语。

  • 强调约束:既要有内涵也要有外延。

在这里插入图片描述

定义上下文的含义:在事件风暴中,通过团队交流达成共识的,能简单清晰准确地描述业务含义和规则的言语就是通用语言。

注意:通用语言贯穿 DDD 的整个设计过程。作为项目团队沟通和协商形成的统一语言,在说某通用语言时,必须要限定在某个上下文内,以确保每个上下文含义在它特定的边界内都有唯一的含义。

2. 通用语言从哪里来

如果我们长期处于某个领域的话,肯定会有一些俗语,俗话,术语,常用语,技术用语,活动概念。如果在领域专家和开发人员之间也能建立一种语言,是不是就可以让他们使用这种语言进行交流,进而解决沟通不顺畅的问题。

3. 通用语言与DSL

定义:领域特定语言(英语:domain-specific language、DSL)指的是专注于某个应用程序领域的计算机语言。又译作领域专用语言。 源自 Martin Fowler 大神的著作《领域特定语言》。

2.2 通用语言与DSL的关系

通用语言其实跟DSL有相通之处,都是着重表达某个领域的业务名词,术语。只是通用语言更偏向于业务分析建模。而DSL则偏向于使用计算机技术将通用语言进行落地,进行模块化,自动化,让计算机通过一定的规则实现通用语言所表达的业务代码生成。

2.3 参考文档

DSL的概念

前端DSL

百度百科

领域特定语言

3. 通用语言实例

下面列举一些领域的通用语言和术语,供大家参考:

3.1 电商领域

在这里插入图片描述

3.2 四色建模的通用语言

在这里插入图片描述

4. 小结

如果我们长期处于某个领域的话肯定会有一些术语,专用词,俗语来表达某个场景或者业务活动,或者人事物。这样的话我们需要通过这些通用语言来探索更深层次的业务语义。

通用语言需要做到:

  • 表意明确,不用过多解释就知道一个名词、一段话表达了什么样的业务语义且无歧义
  • 认知统一,使用通用语言的所有人都对该语言有一个统一的标准
  • 简单易学,学习成本不能太高,毕竟是为业务服务的

这种通用语言基于领域模型,领域模型其实是领域专家头脑中对该领域的一个整体认知,并不是一些图形化和文本化的东西,那些只是用来辅助理解的。

通过团队交流达成共识的能够简单清晰准确传递业务规则的语言(可以是文字、图片等)即可称为通用语言。

通用语言包含术语和用例场景,且能够直接反映在代码中。

基于通用语言,开发人员能够开发出可读性更好的代码,从而将业务需求准确转化为代码设计。达到DDD的目标代码即设计,设计即代码。通俗的讲,也就是开发人员写的代码领域专家也能看懂。

相关文章:

  • 【LeetCode 48】旋转图像
  • 计算机网络.第五节课.笔记.以太网、CSMA/CD、VLAN
  • 运行时数据区域
  • 机器学习----k-means聚类
  • 姿态分析开源工具箱MMPose使用示例:人体姿势估计
  • 如何安装虚拟机
  • ICP问题 SVD方法推导(Markdown版)
  • java基于ssm+vue+elementui的水果生鲜销售购物商城
  • kafka知识点总结
  • 【vue3】06. 跟着官网学习vue3
  • 任务十一 BERT
  • MyBatis实现多层级collection嵌套查询
  • Containerd【轻量级容器管理工具】
  • 计算机毕业设计ssm+vue基本微信小程序的图书馆座位管理系统
  • 腾讯核心高级架构师汇总Java全栈知识点笔记,“吃透”后成功上岸!
  • php的引用
  • [iOS]Core Data浅析一 -- 启用Core Data
  • 10个确保微服务与容器安全的最佳实践
  • CentOS 7 修改主机名
  • JAVA 学习IO流
  • Javascripit类型转换比较那点事儿,双等号(==)
  • JavaScript HTML DOM
  • Selenium实战教程系列(二)---元素定位
  • SpringCloud集成分布式事务LCN (一)
  • windows下mongoDB的环境配置
  • 从tcpdump抓包看TCP/IP协议
  • 反思总结然后整装待发
  • 如何用vue打造一个移动端音乐播放器
  • nb
  • hi-nginx-1.3.4编译安装
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (二)正点原子I.MX6ULL u-boot移植
  • (十六)Flask之蓝图
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • *1 计算机基础和操作系统基础及几大协议
  • ./configure,make,make install的作用(转)
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .describe() python_Python-Win32com-Excel
  • .NET Core 版本不支持的问题
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .NetCore部署微服务(二)
  • ::
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • [ 蓝桥杯Web真题 ]-Markdown 文档解析
  • []T 还是 []*T, 这是一个问题
  • [android] 天气app布局练习
  • [Android]RecyclerView添加HeaderView出现宽度问题
  • [BT]小迪安全2023学习笔记(第15天:PHP开发-登录验证)
  • [C++从入门到精通] 14.虚函数、纯虚函数和虚析构(virtual)
  • [codeforces] 25E Test || hash
  • [codevs] 1029 遍历问题
  • [Django 0-1] Core.Checks 模块
  • [docker] Docker的数据卷、数据卷容器,容器互联