DDD学习(一)——通用语言
什么是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学习(一)——通用语言相关推荐
- DDD理论学习系列(1)-- 通用语言
1.引言 在开始之前,我想我们有必要先了解以下DDD的主要参与者.因为毕竟语言是人说的吗,就像我们面向对象编程一样,那通用语言面向的是? DDD的主要参与者:领域专家+开发人员 领域专家:精通业务的任 ...
- [答疑]通用语言(Ubiquitous Language)是伪创新吗?
软件方法(下)分析和设计第8章分析 之 分析类图--知识篇(20211227更新) 软件方法(下)分析和设计第9章分析 之 分析类图--案例篇(20211228更新) (LEO) 2022-1-6 1 ...
- 他们提出了一个大胆的猜想:GWT(深度学习)→通用人工智能
来源:AI科技评论 编译 :陈彩娴 近日,有一篇发表在arXiv的论文"Deep Learning and the Global Workspace Theory"提出了一个大胆的 ...
- 为什么英语能够成为全球通用语言,汉语却不行?
为什么英语能够成为全球通用语言,汉语却不行? 毫无疑问,全球通用的语言是英语,英语在全球各个角落.不同领域基本处于一种类似流通货币的角色. 有多少人使用英语? 英语发起于英国,近代英语发展于1450期 ...
- 课程向:深度学习与人类语言处理 ——李宏毅,2020 (P11)
Voice Conversion 李宏毅老师2020新课深度学习与人类语言处理课程主页: http://speech.ee.ntu.edu.tw/~tlkagk/courses_DLHLP20.htm ...
- DDD学习资料(持续更新)
文章目录 DDD学习资料(持续更新) DDD图书 DDD概念 DDD代码示例 架构 Bounded Context 工具 Event Storming Event Storming图例 Event S ...
- (转载)[python学习笔记]Python语言程序设计(北理工 嵩天)
作者:九命猫幺 博客出处:http://www.cnblogs.com/yongestcat/ 欢迎转载,转载请标明出处. 如果你觉得本文还不错,对你的学习带来了些许帮助,请帮忙点击右下角的推荐 阅读 ...
- 值得学习的C语言开源项目
值得学习的C语言开源项目 - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的 ...
- DDD学习笔记 - 进阶篇(Ⅱ)
09 | 中台:数字转型后到底应该共享什么? 课程链接:https://time.geekbang.org/column/article/159580 中台是数字化转型的一个热门话题.继阿里提出中台概 ...
最新文章
- 如何开启匿名访问SharePoint 2010里的Client Object Model
- grep与正则表达式基础
- 翻译 github上How to be a good programmer
- 古天乐、胡歌登上核心期刊,他们的名字被用来命名一个新物种!
- vuex中各属性的使用
- vue父子组件间传参
- [转]C语言如何获得精确到毫秒的时间
- [高通MSM8909][Android7.1]电信卡信号优化
- 客快物流大数据项目(二十九):下载CDH的安装包
- python数据挖掘介绍
- vsphere client下载地址
- Vim的ZZ、ZQ和Ctrl-Z,提高浏览效率
- vue获取tr内td里面所有内容_点击td获取tr的所有值
- TypeScript查缺补漏
- 阿里云服务器的购买、基本配置、(xshell)远程连接、搭建环境、设置安全组、域名备案、申请ssl证书
- ARM联手SMI为Gear VR打造眼球追踪技术
- html页面添加遮罩层,在浏览器窗口上添加遮罩层的方法
- 梯度下降算法_梯度下降算法的工作原理
- Zabbix一键部署
- Mac下载SQLServer
热门文章
- Swift使用UIImagePickerController 从相册选择图片、从相机选择图片
- 常用工具类 (三) : Hutool 常用工具类整理 (全)
- java8获取以秒单位的时间戳
- Java基于springboot高考填报志愿综合参考系统 vue+elementUI
- 拼插机器人课和围棋课_开学第一课和机器人比围棋的人是谁
- 微信小程序使用 iconfont 彩色图标(mini-program-iconfont-cli)
- owin 怎么部署在云中_从几乎未能在云中部署简单的机器学习模型中学到的教训...
- python之Matplotlib
- 论文《基于结构光和双目视觉的三维重建系统研究》摘要
- 万用表怎么测量电池容量_万用表怎么检测电池容量_电池电量