续一:《你的医书是假的!批评付施威的《DDD诊所——聚合过大综合症》

news2025/1/13 10:16:48

DDD领域驱动设计批评文集

“软件方法建模师”不再考查基础题

《软件方法》各章合集

我写了一篇文章,批评付施威的《DDD诊所——聚合过大综合症》(以下简称《DDD诊所》),文章是《你的医书是假的!批评付施威的《DDD诊所——聚合过大综合症》》(以下简称《你的医书是假的》)。

一、《你的医书是假的》关键内容

《DDD》诊所说,下面这个是不变式:

图片

图1 《DDD诊所》截图

我在《你的医书是假的》中提出以下批评:

(1)不变式是类的不变式。《DDD诊所》作者把它放在关系上是不对的,说明该作者没有理解不变式。

(2)《DDD诊所》作者引用的《领域驱动设计》译文的翻译很糟糕(参见《猴子掰玉米?比较不同版《领域驱动设计》说“不变式”和“聚合”》),关键内容的意思译反了,而《DDD诊所》作者并无察觉,反而整段引用作为依据。

(3)不变式不是用来描述像图中的“订单总价=sum(订单行总价)”这样的内容的。如果这样的约束被严格遵守,说明“订单”的“总价”属性在逻辑上是冗余的,应该删掉。既然“总价”属性没了,图1的所谓“不变式”自然也就没有了。

也就是说,改变订单属性值(包括加/删订单行以及其他操作)的时候,不需要判断某个含有“总价”属性的表达式是否为真——实际上也没法判断,“总价”属性都没有了嘛。

接下来,我再针对图1做进一步的阐述,帮助进一步理解不变式,并评点在《你的医书是假的》文章下面的留言。

二、等号和赋值号没搞混吧?

不变式是一个布尔表达式。

我在这里提这一点,到底是什么意思呢?

意思是:

如果发现有“不变式”表示为相等关系的表达式,那就要警惕一下,建模人员是不是把“=”当成赋值来理解了。

例如,图1的式子“订单总价=sum(订单行总价)”,有可能就会被误解成“把订单项的价钱之和赋值给订单总价以同步这两边的值”。

读者可以注意到,我在《你的医书是假的》画的图例中,没有相等关系的不变式。

读者还可以对比下面的例子: 

图片

图2 三角形及其不变式

这个还行,对吧?

那读者再看这个:

图片

图3 错例:等边三角形及其不变式?

这个是不是比较诡异?不过,这样的图倒是符合DDD伪创新的口味:投资少、见效快、门槛低、产量高、仪式感十足。

注意,我在图3中用“==”表示相等关系,而不是用“=”。其实这是违反OCL语法的,OCL里就是“=”表示相等关系,和SQL类似,但考虑到上面说的赋值误解(特别是显示在类图上时),我倒是觉得OCL应该改一下。

那么,可不可以有相等关系的不变式?可以有,但很少。相等关系表达式,经常是出现在前置条件和后置条件,而不是不变式。

什么时候可以有相等关系的不变式,这个就涉及到相当多的知识,不是本文能装得下的了,感兴趣的读者可以关注我的《软件方法》。

未完待续……

接下来内容:

▲“sum(订单行总价)”会在哪里出现?不变式和操作之间没有绑定关系

▲“订单总价=sum(订单行总价)”还存在一个问题

▲对《DDD诊所》作者付施威补充解释的评点

▲对林宁评论的评点

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

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

相关文章

yolov5 V7.0版本 使用Pascal voc 2012 数据集训练

1、环境搭建 # 1、anaconda pycharm环境搭建 https://blog.csdn.net/weixin_45715405/article/details/132100595?spm1001.2014.3001.5502 根据上面创建一个conda的虚拟环境python版本为3.8版本# 2、yolov5 代码下载 https://github.com/ultralytics/yolov5# 3、安装需要的依…

封装公共el-form表单(记录)

1.公共表单组件 //commonForm.vue <script> import {TEXT,SELECT,PASSWORD,TEXTAREA,RADIO,DATE_PICKER } from /conf/uiTypes import { deepClone } from /utils export default {name: GFormCreator,props: {config: { // title/itemstype: Object,required: true}}…

【PHP】基础语法变量常量

文章目录 PHP简介前置知识了解静态网站的特点动态网站特点 PHP基础语法代码标记注释语句分隔(结束)符变量变量的基本概念变量的使用变量命名规则预定义变量可变变量变量传值内存分区 常量基本概念常量定义形式命名规则使用形式系统常量魔术常量 PHP简介 PHP定义&#xff1a;一…

10.应用部署

配置项目编码 配置IDEA IDE编码 不配置会出现idea内部log中文乱码&#xff0c;而外部正常的现象 增加配置代码&#xff1a; -Dfile.encodingUTF-8需要重新启动idea 配置运行看板 services docker 如果docker尚未配置&#xff0c;则docker看板不会显示&#xff0c;但可以先…

睡眠模式下如何快速唤醒电脑,看这里!

这篇文章解释了如何唤醒正在睡觉的电脑,以及如果正常方法不起作用该怎么办。 一、如何从睡眠中唤醒电脑 不管你使用的是什么操作系统,关闭睡眠模式就像唤醒电脑一样简单,你可以通过某种方式与电脑交互来完成: 移动鼠标 滑动触摸板 按键盘上的任意键 有些设备有点不同,只…

淘宝API技术解析:实现店铺所有商品接口的高效获取与处理

当涉及到淘宝店铺的所有商品接口&#xff0c;我们可以利用淘宝开放平台提供的API进行操作。 &#xff08;首先&#xff0c;我们需要确保已经在淘宝开放平台注册并创建了应用&#xff0c;并获取了相应的App Key和App Secret。&#xff09; 1. 获取授权&#xff1a;使用OAuth 2…

自组织地图 (SOM) — 介绍、解释和实现

自组织地图 &#xff08;SOM&#xff09; — 介绍、解释和实现 一、说明 什么是SOM&#xff08;self orgnize map&#xff09;自组织地图&#xff0c;是GNN类似的图神经网络的概念。因为神经网络实质上可以解释为二部图的权重&#xff0c;因此无论GNN还是SOM都有共同的神经网络…

AIGC的发展

AIGC&#xff08;Artificial Intelligence Generated Content&#xff09;&#xff0c;即人工智能生产内容&#xff0c;是人工智能在内容领域的最新进展。AIGC利用人工智能算法通过分析大量数据集&#xff0c;自动生成具有特定风格和主题的内容。AIGC涵盖了多种应用领域&#x…

ITIL4的知识体系及必要性

官方网站 www.itilzj.com 文档资料: wenku.itilzj.com 点击进入IT管理资料库 ITIL4 的必要性及历史 在这个前所未有的变革时代&#xff0c;人们身处着被誉为“第四次工业革命”的时代&#xff0c;这个时代催生出了一个日益加速、变得愈发错综复杂的环境。在这种环境下&#xf…

电脑文件夹密码怎么设置?文件夹加密介绍

文件夹是电脑管理文件必不可少的工具&#xff0c;而我们为了保护文件夹的数据安全&#xff0c;通常会采用设置密码的方法来保护文件夹。那么&#xff0c;电脑文件夹密码该怎么设置呢&#xff1f; 文件夹加密超级大师 文件夹加密超级大师不但可以为电脑文件夹设置密码&#xff…

阿里云大语言模型(LLM)实战训练营,火热开营中!

简介&#xff1a;大语言模型实战训练营已正式开营&#xff0c;汇集阿里云、黑马程序员多位AI领域资深技术专家手把手带您快速实现大语言模型从入门到应用落地&#xff01;完成课程学习任务更有机会领取LAMY钢笔、小米充电宝、双肩包等精美礼品&#xff0c;快来一起学习体验吧~ …

MySQL高可用Orchestrator

目录 一 Orchestrator简介 二 Orchestrator功能 1 Discovery(发现复制拓扑) 2 Refactoring(重构复制拓扑) 3 Recovery(恢复主库故障) 三 orchestrator支持的操作方式 四 部署要求 五 下载 六 安装 1 下载软件包 2 解压软件包 3 创建账号 第一种是 orc后端MySQL数据…

识别图片翻译怎么操作?几个好方法了解一下

图片翻译是一项非常有用的工具&#xff0c;可以让人们轻松地识别和翻译图片中的文字&#xff0c;对于一些步入职场的小伙伴尤其是从事文案编辑的朋友更是一个需要的技能&#xff0c;很多时候我们参考的多语言文献资料都是图片的格式&#xff0c;翻译内容的话会比较麻烦&#xf…

【python】python开源代理ip池

一、前言 随着互联网的不断发展&#xff0c;越来越多的应用需要使用高匿代理IP才能访问目标网站&#xff0c;而代理IP作为一种能够隐藏本机真实IP地址的工具&#xff0c;在网络抓取、搜索引擎排名、广告投放、反爬虫等方面有着广泛的应用场景。但是&#xff0c;由于代理IP的稳…

黑客自学路线

谈起黑客&#xff0c;可能各位都会想到&#xff1a;盗号&#xff0c;其实不尽然&#xff1b;黑客是一群喜爱研究技术的群体&#xff0c;在黑客圈中&#xff0c;一般分为三大圈&#xff1a;娱乐圈 技术圈 职业圈。 娱乐圈&#xff1a;主要是初中生和高中生较多&#xff0c;玩网恋…

玩转软件|钉钉个人版内测启动:AI探索未来的工作方式

目录 前言 正文 AI为核心&#xff0c;个人效率为王&#xff01; 指令中心&#xff0c;解锁AI技巧&#xff01; 灵感Store&#xff0c;探索更多可能&#xff01; 未来的AI&#xff0c;即将问世&#xff01; 个人内测体验 前言 重磅消息&#xff1a;钉钉个人版在8月16日正…

【JavaSE】详解final关键字

在Java中&#xff0c;final可以用来修饰类、方法和变量。final修饰类&#xff0c;表示该类无法被继承&#xff0c;并且此类的设计已被认为很完美而不需要进行修改或扩展。final修饰类中的方法&#xff0c;表示不可以被重写&#xff1b;也就是把该方法锁定了&#xff0c;以防止继…

最小栈00

题目链接 最小栈 题目描述 注意点 pop、top 和 getMin 操作总是在 非空栈 上调用 解答思路 由于栈先进后出的特点&#xff0c;对于任意一次入栈操作&#xff0c;只要该元素未被弹出&#xff0c;则其前面插入的元素一定都还在栈中&#xff0c;所以每次入栈时只需要根据其前…

Lnton羚通视频算法算力云平台【PyTorch】教程:学习Datasets-DataLoader基础知识

Dataset & DataLoader PyTorch 提供了两个数据处理的基本方法&#xff1a;torch.utils.data.DataLoader torch.utils.data.Dataset 允许使用预加载的数据集以及自己的数据。 Dataset 存储样本及其对应的标签&#xff0c; DataLoader 在 Dataset 基础上封装了一个可迭代的对…

苍穹外卖 day3 实现登录过程中MD5加密

一 原来是明文存的 密码可见度太高&#xff0c;MD5加密为密文图像 效果 二 密文实现步骤 修改明文密码&#xff0c;改成密文 123456 密文值&#xff1a;e10adc3949ba59abbe56e057f20f883e代码如下所示 在这里插入代码片 package com.sky.service.impl;import com.sky.con…