DDD通用语言、多尿和尿频-《分析模式》漫谈41

“Analysis Patterns”的第3章有这么一句:

A patient with observations of the presence of thirst, weight loss, and polyuria indicates diabetes.

2004(机械工业出版社)中译本的译文为:


 
虽然没有完全使用类图(类型图)上的概念,但几个标红的地方基本上都译出来了,presence译作“呈现”,polyuria译作“多尿”。

2020(人民邮电出版社)中译本的译文为: 


 
也没有使用类图上的概念,而且译成了一句大白话,presence漏译,没有体现出作者的意思。另外,polyuria译作“尿频”,这是错误的。

**********

Fowler为什么要很别扭地这样写,如果他想说大白话,可以换另外的写法。

这是因为他要用图3.10所定义的概念来表达。

图3.10原图如下,我把本文所列句子的关键词和图中的类型划线对应:


 
observation、presence对应图上的类型,thirst, weight loss, polyuria则是Observation Concept(观察概念)的一些实例。

原图不是用我们现在常见的UML来画的,可能理解起来有些费劲。我画的UML版本如下:


 
从图上可以看到,“观察”有一个子类叫“类别观察”,“类别观察”下面又分两个子类,“不存在(Absence)”和“存在(Presence)”。

本文开头所列句子,2024中译本打算翻译如下:

一名患者有以下存在观察:口渴、体重减轻和多尿,这些观察指示有糖尿病。

更细一点说就是:

如果一个“患者(人)”对象链接到一些“存在观察”对象,而且这些“存在观察”对象又分别链接到“口渴”、“体重减轻”、“多尿”等“观察概念”对象→这个人可能有糖尿病。

要用类图上的概念来表达,不能大白话。

**********

说到这里,有没有同学觉得和领域驱动设计鼓吹的“通用语言”有点像?

对的,领域驱动设计可能已经在山顶上等着收获胜利果实了——可是,平时鼓吹“通用语言”,真的到了用“通用语言”的时候,怎么就忘了用呢?

用类图、状态机图等严谨的方式定义出来的概念,才是真正的“通用语言”。或者说,“通用语言++的祖先”早就有了,不需要领域驱动设计重新造词。

就像我之前的文章批评过的,目前为止,我就没看到国内的DDD圈子有合格的建模者,能严谨地把领域逻辑通过模型表达出来,只是在喊口号和、简单罗列和错误百出的简单类图。

**********

2020中译本还存在一个问题:把polyuria译成“尿频”。

Excessive Urination(Polyuria)是多尿,和尿频(Frequent Urination)不是一个意思。

下图摘自默沙东诊疗手册(https://www.msdmanuals.cn/home/kidney-and-urinary-tract-disorders/symptoms-of-kidney-and-urinary-tract-disorders/excessive-or-frequent-urination)


 
可以看到,尿频的尿量是正常的,只不过排尿次数多,每次排得少。这是比较常见的问题,特别是50岁以上男性。

多尿(一般也会尿频)则是总尿量变大,这个麻烦就大了,很可能是糖尿病。这就是书中原文所说的。

2004(机械工业出版社)中译本译为“多尿”,是正确的。

2020(人民邮电出版社)中译本译为“尿频”,是错误的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/57105.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ajax是什么?

Ajax是什么? Ajax是创建交互式网页应用的网页开发技术。简单来说就是网页在不加载的情况下,可以跟服务器交换数据,并更新页面的内容。 原理: 1. 创建xhr(xmlHttpRequest)对象; 2, 通过xhr对象的open()方法和…

【C++_string类练习】仅仅反转字母

题目链接:仅仅反转字母 解题思路: 这种反转字符的题目我第一个想到的方法就是:双指针 一个指针在前start,一个指针在后back, 如果指针所指向的位置的值是字母,那么两个指针位置的值就进行交换&#xff0…

矿山企业电能智能化管理怎么实现

0引言 电力工业是国民经济和社会发展的基础,随着高质量发展要求的提升,提高能源效率对工业企业至关重要。有效提高电力能效的方法包括技术创新、监测用能行为和探索技术解决方案。智能化的电能管理是应对资源和环境压力的关键措施,对提高用电…

点餐小程序实战教程20广告管理

目录 1 创建数据源2 添加轮播容器3 创建变量4 绑定变量5 预览应用总结 一般餐厅需要有一些宣传,在我们的点餐页面可以在顶部加载广告位。广告主要是用轮播图的形式进行展示,本节我们介绍一下如果显示广告。 1 创建数据源 打开控制台,点击应用…

10-Docker安装Redis

10-Docker安装Redis Docker安装Redis 以 Redis 6.0.8 为例: docker pull redis:6.0.8直接pull会出现以下错误 [rootdocker ~]# docker pull redis:6.0.8 Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request can…

ubuntu安装docker及docker compose

在Ubuntu上安装Docker通常包括以下几个步骤: 更新包索引: 打开终端并运行以下命令来更新你的包索引: sudo apt update安装必要的依赖: 安装apt-transport-https、ca-certificates、curl、software-properties-common、gnupg等软件…

Java基础-8新特性

Lambda 表达式 Lambda 表达式,也可称为闭包。Lambda 表达式是一个匿名函数,我们可以这样理解 Lambda 表达式:Lambda 是一段可以传递的代码(能够做到将代码像数据一样进行传递)。格式如下: (parameters) -&g…

【Cadence27】HDL拷贝工程➕Allegro导出DXF和3D文件STP

【转载】Cadence Design Entry HDL 使用教程 【Cadence01】Cadence PCB Edit相对延迟与绝对延迟的显示问题 【Cadence02】Allegro引脚焊盘Pin设置为透明 【Cadence03】cadence不小心删掉钢网层怎么办? 【Cadence04】一般情况下Allegro PCB设计时的约束规则设置&a…

【入门篇】2.8 时钟(三)

目录 5.3.1 配置时钟源相关参数:调用函数 HAL_RCC_OscConfig() 5.3.2 配置系统时钟源以及 SYSCLK、AHB、APB1 和 APB2 的分频系数:调用函数HAL_RCC_ClockConfig() 六,STM32F4 时钟使能和配置 6.1 使能时钟 6.2 禁用时钟 5.3.1 配置时钟源相关参数:调用函数 HAL_RCC_Os…

【力扣 | SQL题 | 每日4题】力扣2308,2324,2346,2372

4 mid,还是比较常规的。 1. 力扣2308:按性别排列表格 1.1 题目: 表: Genders ---------------------- | Column Name | Type | ---------------------- | user_id | int | | gender | varchar | ---------------------- u…

卸载 Git

目录 打开 Geek找到 Git右键卸载 Git卸载完成等待扫描注册表点击完成清除Git在本地的配置文件 打开 Geek 找到 Git 右键卸载 Git 卸载完成 等待扫描注册表 点击完成 已经删除完毕 清除Git在本地的配置文件 进入 C:\Users\用户名 删除框起来的配置文件 👇 源码资料…

Map转Map

将一个Map<String,Integer> 转换成Map<String,String> //创建一个创建Map的公共方法 private static <T> Map<String,T> newMap(String key,T val,Object...kv){Map<String,T> ans new HashMap<>(8);ans.put(key,val);for(int i0,size k…

webpack自定义插件 ChangeScriptSrcPlugin

插件文件 class ChangeScriptSrcPlugin {apply(compiler) {const pluginName "ChangeScriptSrcPlugin";compiler.hooks.compilation.tap(pluginName, (compilation, callback) > {compilation.hooks.htmlWebpackPluginAlterAssetTags.tapAsync(pluginName,(html…

DES对称加密算法

DES&#xff08;Data Encryption Standard&#xff0c;数据加密标准&#xff09;是一种对称加密算法。 算法概述 加密类型&#xff1a;对称加密&#xff08;同一密钥用于加密和解密&#xff09;。密钥长度&#xff1a;64位&#xff08;8字节&#xff09;&#xff0c;其中有效…

java--网络编程

网络的相关概念 网络通信 1.概念:两台设备之间通过网络实现数据传输2.网络通信:将数据通过网络从一台设备传输到另一台设备3.java.net包下提供了一系列的类或接口&#xff0c;供程序员使用&#xff0c;完成网络通信 网络 概念&#xff1a;两台或多台设备通过一定物理设备连接…

UltraISO(软碟通)制作U盘制作Ubuntu20.04启动盘

目录 一、启动盘制作 1、工具准备 2、打开UltraISO后&#xff0c;点击左上角的文件&#xff0c;在打开的下拉项中&#xff0c;选择打开准备好的Ubuntu系统20.04 LTS镜像文件(ubuntu-20.04-desktop-amd64.iso)&#xff1b; 3、然后点击启动->写入硬盘映像 4、在弹出的窗…

Pollard‘s p-1算法

概述 光滑数 (Smooth number)&#xff1a;指可以分解为多个小素数乘积的正整数 当p是N 的因数&#xff0c;并且p−1是光滑数&#xff0c;可以考虑使用Pollards p-1算法来分解N 当p是N的因数&#xff0c;并且p1是光滑数&#xff0c;可以考虑使用Williamss p1算法来分解N 这里…

11.useComponentDidMount

在 React 的函数组件中,有时我们需要在组件首次挂载后执行某些操作,这在类组件中通常通过 componentDidMount 生命周期方法来实现。useComponentDidMount 钩子提供了一种简洁的方式来在函数组件中实现相同的功能。这个自定义钩子使得在组件挂载后执行一次性操作变得简单直观。…

一个简单的Qt Console Application计算练习程序

初步体验Qt Creator 用途&#xff1a;练习20以内2位数乘法速算的程序 功能1&#xff1a;支持用户设定题目数量 std::cout << "请输入本次练习题目数量&#xff1a;";int numProblems 0;std::string num;std::cin >> num;try {numProblems std::stoi(…

飞腾X100适配Ubuntu说明

【写在前面】 飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力&#xff0c;聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域&#xff0c;包含了应用使能套件、软件仓库、软件支持、软件适…