什么是DDD

DDD是领域驱动设计(Domain-driven design) 的缩写,我们需要关注的是为什么要用它,谁来用它,后面将要学到什么样的概念和知识来运用它?

引言

软件是用来解决问题的。支付软件解决支付动作与资金流向问题,电商购物软件解决购物及订单问题,音视频软件解决音视频播放问题。如果软件脱离了它解决问题的领域,就称不上是软件了。
那么软件既然是用来解决一些领域当中的问题的,就要关注怎么去用软件技术来更好地解决领域,当然对领域进行必要的了解十分重要(技术方案也很重要)。
DDD可以帮助我们对领域建模,用这种建模手段来驱动我们的设计开发等一系列工作,能提高我们的工作效率

谁来使用DDD?

领域专家+开发人员

  • 领域专家是精通特定领域的人员,他在该领域是专业的。如证券领域的专家对证券行业的专业术语很了解并深知其含义,他们关注的是业务带来的价值。
  • 开发人员是掌握软件设计/开发/测试/部署/维护技术的人或整个团队。他们关注的是如何用技术手段保障自己的软件足够健壮和好用。

想象一个场景:

  • 证券公司想雇一批开发人员来为他们公司开发一款证券软件,功能可能是买卖证券等,证券公司代表A和开发人员代表团队B在一起开会:
  • A在讲业务需求时,包含这样一些词 开盘价、反弹、配股、空头市场、利好
  • B在讲实现方案时,包含这样一些词 架构、抽象、类、封装、设计模式
  • 这样的沟通会议毫无意义,开一天也没办法研究出这个软件究竟应该如何实现

通用语言(UBIQUITOUS LANGUAGE)

英语作为世界通用语言,不论你是哪国人,出国在外会一些基本的英语应该可以与其他国家的人进行交流。
同样,我们如果在领域专家和开发人员之间也能建立一种语言,让他们使用这种语言进行交流,这样可以来解决沟通不顺畅的问题。

UBIQUITOUS LANGUAGE(通用语言)的词汇包括类和主要操作的名称。语言中的术语,有些用来讨论模型中已经明确的规则,还有一些则来自施加于模型上的高级组织原则。
上面是通用语言的一种定义解释,简单来说,通用语言需要做到:

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

这种通用语言基于领域模型,领域模型其实是领域专家头脑中对该领域的一个整体认知,并不是一些图形化和文本化的东西,那些只是用来辅助理解的。
通过团队交流达成共识的能够简单清晰准确传递业务规则的语言(可以是文字、图片等)即可称为通用语言。

通用语言包含术语和用例场景,且能够直接反映在代码中。
基于通用语言,开发人员能够开发出可读性更好的代码,从而将业务需求准确转化为代码设计。达到DDD的目标代码即设计,设计即代码。通俗的讲,也就是开发人员写的代码领域专家也能看懂。

通用语言的代表表述

既然开发人员也要基于通用语言进行代码开发,那代码如何体现通用语言呢?
在《实现领域驱动设计》书中有一个简单的例子(P238),我们一起来看一下:

系统必须对User进行认证,并且只有当Tenant(租户)处于激活状态时才能对User进行认证。
上面这个用例就是基于通用语言的用例,简单清楚的说明了业务规则。
我们先看第一种代码实现:

bool anthentic = false;
User user = _userRepository().FindUserByTenantIdAndUserName(tenantId, userName);if(user!=null)
{authentic = user.IsAuthentic(password);
}return authentic;

这段代码完全不能反应通用语言,主要存在以下问题:

  • 这段代码先查找user,再对user进行密码匹配来完成认证。其中user.IsAuthentic(password);表示的是“用户是否被认证”的意思,而没有表达出“认证”这个过程,即“对用户进行认证”。
  • 未体现“检查Tenant是否处于激活状态”这个前提条件。

知道问题后,我们可以讲代码略做改动:

bool anthentic = false;
Tenant tenant = _tenantRepository.FindTenantById(tenantId);
//检查租户是否激活
if(tenant!=null&&tenant.IsActive){User user = _userRepository.FindUserByTenantIdAndUserName(tenantId, userName);if(user!=null)
{authentic = tenant.Authenticate(user, password);//租户对用户进行认证
}
}
return authentic;

以上代码虽然也不是最终结果,但至少对通用语言进行了体现。通读代码,就能明白业务用例,体现代码即设计这一思想。

参考来源:
作者:圣杰
链接:https://www.jianshu.com/p/ec729b949a1c
来源:简书

DDD学习(一)——通用语言相关推荐

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

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

  2. [答疑]通用语言(Ubiquitous Language)是伪创新吗?

    软件方法(下)分析和设计第8章分析 之 分析类图--知识篇(20211227更新) 软件方法(下)分析和设计第9章分析 之 分析类图--案例篇(20211228更新) (LEO) 2022-1-6 1 ...

  3. 他们提出了一个大胆的猜想:GWT(深度学习)→通用人工智能

    来源:AI科技评论 编译 :陈彩娴 近日,有一篇发表在arXiv的论文"Deep Learning and the Global Workspace Theory"提出了一个大胆的 ...

  4. 为什么英语能够成为全球通用语言,汉语却不行?

    为什么英语能够成为全球通用语言,汉语却不行? 毫无疑问,全球通用的语言是英语,英语在全球各个角落.不同领域基本处于一种类似流通货币的角色. 有多少人使用英语? 英语发起于英国,近代英语发展于1450期 ...

  5. 课程向:深度学习与人类语言处理 ——李宏毅,2020 (P11)

    Voice Conversion 李宏毅老师2020新课深度学习与人类语言处理课程主页: http://speech.ee.ntu.edu.tw/~tlkagk/courses_DLHLP20.htm ...

  6. DDD学习资料(持续更新)

    文章目录 DDD学习资料(持续更新) DDD图书 DDD概念 DDD代码示例 架构 Bounded Context 工具 Event Storming Event Storming图例 Event S ...

  7. (转载)[python学习笔记]Python语言程序设计(北理工 嵩天)

    作者:九命猫幺 博客出处:http://www.cnblogs.com/yongestcat/ 欢迎转载,转载请标明出处. 如果你觉得本文还不错,对你的学习带来了些许帮助,请帮忙点击右下角的推荐 阅读 ...

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

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

  9. DDD学习笔记 - 进阶篇(Ⅱ)

    09 | 中台:数字转型后到底应该共享什么? 课程链接:https://time.geekbang.org/column/article/159580 中台是数字化转型的一个热门话题.继阿里提出中台概 ...

最新文章

  1. 如何开启匿名访问SharePoint 2010里的Client Object Model
  2. grep与正则表达式基础
  3. 翻译 github上How to be a good programmer
  4. 古天乐、胡歌登上核心期刊,他们的名字被用来命名一个新物种!
  5. vuex中各属性的使用
  6. vue父子组件间传参
  7. [转]C语言如何获得精确到毫秒的时间
  8. [高通MSM8909][Android7.1]电信卡信号优化
  9. 客快物流大数据项目(二十九):下载CDH的安装包
  10. python数据挖掘介绍
  11. vsphere client下载地址
  12. Vim的ZZ、ZQ和Ctrl-Z,提高浏览效率
  13. vue获取tr内td里面所有内容_点击td获取tr的所有值
  14. TypeScript查缺补漏
  15. 阿里云服务器的购买、基本配置、(xshell)远程连接、搭建环境、设置安全组、域名备案、申请ssl证书
  16. ARM联手SMI为Gear VR打造眼球追踪技术
  17. html页面添加遮罩层,在浏览器窗口上添加遮罩层的方法
  18. 梯度下降算法_梯度下降算法的工作原理
  19. Zabbix一键部署
  20. Mac下载SQLServer

热门文章

  1. Swift使用UIImagePickerController 从相册选择图片、从相机选择图片
  2. 常用工具类 (三) : Hutool 常用工具类整理 (全)
  3. java8获取以秒单位的时间戳
  4. Java基于springboot高考填报志愿综合参考系统 vue+elementUI
  5. 拼插机器人课和围棋课_开学第一课和机器人比围棋的人是谁
  6. 微信小程序使用 iconfont 彩色图标(mini-program-iconfont-cli)
  7. owin 怎么部署在云中_从几乎未能在云中部署简单的机器学习模型中学到的教训...
  8. python之Matplotlib
  9. 论文《基于结构光和双目视觉的三维重建系统研究》摘要
  10. 万用表怎么测量电池容量_万用表怎么检测电池容量_电池电量