[答疑]心脏的功能是泵血,心脏是个模块,所以“功能模块”没毛病啊!

news2024/9/20 13:22:39

DDD领域驱动设计批评文集

做强化自测题获得“软件方法建模师”称号

《软件方法》各章合集


有同学在我的视频下留言: 

图片

其实认真看我的视频或书就明白,这和我说的不是一回事。

这个留言有点新意,和以往的留言如“人能说话,嘴就是人的说话模块,没错啊!”是不一样的,所以我特地来说一下这个留言,它体现了开发人员容易出现的一些问题:

(1)不知不觉切换研究对象

我们先来看“以人为例,心脏的功能是泵血”。

我的视频或书里的图是这样的: 

图片

“以人为例”,这时候研究对象是“人”,这时候说“功能”应该说“人”的功能,例如“扛煤气罐”,“功能模块”指的是“扛煤气罐模块”、“扛煤气罐子系统”。

外面的老板、老婆、老爸老妈、要的就是这些“功能”,人的构造是心肝脾肺肾还是电路板,其实无所谓,甚至经过“机械飞升”的身体更受欢迎! 

图片

研究“人”的时候,“心脏”和“泵血”只是人的一种可选的设计方案,不是需求。而“功能”说的是需求。

这位同学在这里,不知不觉切换了研究对象。

“不知不觉切换研究对象”可谓开发团队的一个大毒瘤。有的人可能出于无知,可能出于维护面子,可能出于逃避责任,经常有意无意祭出这件法宝。

你和他谈组织流程,他和你谈某个类的代码,你和他谈某个类的代码,他又和你谈组织流程。

开头的图片说到心脏,我们把这个套路继续往小里用,也可以说:

以人为例,神经细胞的功能是传递信号,神经细胞是个模块,所以:神经细胞是传递信号模块,没毛病吧!

以人为例,原子的功能……

(2)把行为和类一一对应

假设我们不研究人这么大的范围,改为研究心脏。我们要生产或培养棒棒的心脏,“卖”给需要的人或动物。

既然已经是研究心脏了,这时候,“心脏”就是我们研究的目标系统。

“泵血”是心脏的功能,这个没问题,但是,心脏还有其他功能:回收废物、调节内分泌。

我们所研究的系统的名字却不叫“泵血系统”、“回收废物系统”、“调节内分泌系统”或者“泵血+回收废物+调节内分泌系统”,它就叫“心脏”。

同理,心脏的使用者要的就是心脏的功能和性能。心脏是由肉还是电路板构成,这也是可选的设计方案。

注意,此时心脏是我们所研究的系统,不是“模块”。

当心脏被“卖”出去,安装在人体内,这时心脏才会成为人的一个模块。

所以,“心脏的功能是泵血,心脏是个模块”这样顺下来的说法是不正确的。

同样,这个模块不叫“泵血模块”、“回收废物模块”、“调节内分泌模块”或者“泵血+回收废物+调节内分泌模块”,它就叫“心脏”。

我们可以再扩展开。假设心脏被安在某个公司员工(例如女秘书)身上,此时,这个女秘书也成为公司的一个“模块”,但是这个模块名字不叫“为老板做A+为老板做B+为老板做C模块”,她就叫“秘书”。 

图片

把行为和类一一对应,这样的思想有什么问题呢?

会导致得到的类是“泵血er”、“回收废物er”、“调节内分泌er”,得不到“心脏”这样一个类。

参见:

《软件方法》第8章>>

可能有的同学会想,这个不挺好吗,这不就是“微服务”吗?

是哦,好棒,什么也不用思考就解决了复杂问题,天上真的掉免费的午餐了吗?

参见:

《软件方法》第1章>>

《你的医书是假的!》>>

**********

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

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

相关文章

Python | Leetcode Python题解之第352题将数据流变为多个不想交区间

题目: 题解: from sortedcontainers import SortedDictclass SummaryRanges:def __init__(self):self.intervals SortedDict()def addNum(self, val: int) -> None:intervals_ self.intervalskeys_ self.intervals.keys()values_ self.intervals…

常见分布式ID解决方案的优缺点

分布式系统之所以难,很重要的原因之一是“没有一个全局时钟,难以保证绝对的时序”。 一、分布式ID的特性或要求: 唯一性:确保生成的ID是应用系统内唯一。高可用性:确保任何时候都能正确的生成ID。有意义:或者说包含更多信息,例如时间、业务等信息。如:有序性,通常都需…

多重示例详细说明Eureka原理实践

Eureka原理(Eureka Principle)是指在长时间的思考和积累之后,通过偶然的瞬间获得灵感或发现解决问题的方法的一种认知现象。这个过程通常包括三个主要阶段:准备阶段、潜伏期以及突然的灵感爆发。下面详细说明Eureka原理的实践步骤…

零拷贝并非万能解决方案:重新定义数据传输的效率极限

PageCache有什么作用? 在我们前面讲解零拷贝的内容时,我们了解到一个重要的概念,即内核缓冲区。那么,你可能会好奇内核缓冲区到底是什么?这个专有名词就是PageCache,也被称为磁盘高速缓存。也可以看下wind…

TY6802 同步整流PCB设计注意事项

TY6802 系列是一款用于反激式电源次级同步整流芯片,TY6802能可靠支持包括 DCM、CCM和准谐振模式。TY6802 集成了一个 100V 功率 MOSFET(TY6802A:100V15mR; TY6802B:100V10mR; TY6802C:100V7.5mR;) ,可以取代…

基于ESP32的OEE分析开发板上MQTT协议的实现

整理自 《Implementation of MQTT Protocol on ESP32-Based OEE Analysis Development Board》,作者是Amir Akbar Wicaksono, Yuli Kurnia Ningsih, 和 Indra Surjati,发表于《MITOR: Jurnal Teknik Elektro》。论文讨论了在工业4.0背景下,通…

数字化技术分别有哪些,数字化技术特点和优势是什么?

​随着企业数字化进程的加速,人工智能、工业互联网、低代码等底层技术正全面重塑企业运营生产体系,推动新的生产要素、研发范式和商业模式的建立。 这个变革过程不仅是对原有制造体系的颠覆,而且会影响各行各业的所有细分行业和产业链价值链…

探索地理空间分析的新世界:Geopandas的魔力

文章目录 探索地理空间分析的新世界:Geopandas的魔力背景:为何选择Geopandas?这个库是什么?如何安装这个库?五个简单的库函数使用方法场景应用:Geopandas在实际工作中的应用常见bug及解决方案总结 探索地理…

UE5 日期时间蓝图变量 加减节点

参考链接:Having troubles with DateTime in UE5 - General / Feedback & Requests - Epic Developer Community Forums (unrealengine.com) 直接粘贴到UE5蓝图图表可用。(反之相加,用负号操作一下) 减号蓝图节点(…

php源码编译与初始化

1 php源码编译 解压 yum install -y bzip2 # 安装解压工具 tar -xf php-7.4.12.tar.bz2 # 解压文件./condigure ./configure --prefix/usr/local/php --with-config-file-path/usr/local/php/etc --enable-fpm --with-fpm-usernginx --with-fpm-groupnginx --with-curl --wi…

Nginx--流量控制

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 一、流量限制 1、介绍 流量限制 (rate-limiting);可用来限制用户在给定时间内HTTP请求的数量。请求,可以是一个简单网站首页…

Element-UI Table实现列表筛选数据及列表嵌套选择框

VUE 框架在 Element UI 的基础上,Table 组件中实现了列表数据的修改功能,支持单选和多选功能,并且列表具备筛选功能。样式如图所示。 功能介绍 点击table列名实现筛选查询功能相关性判断点击列表中的正方形实现选择框功能,同时修…

设计模式-创建型模式-建造者模式

1.建造者模式定义 建造者模式又称生成器模式,将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示; 1.1 建造者模式优缺点 优点 封装性好,主要的业务员逻辑封装在指挥者类中;客户端不必知道产品内…

RabbitMQ练习(Work Queues)

1、RabbitMQ教程 《RabbitMQ Tutorials》https://www.rabbitmq.com/tutorials 2、环境准备 参考:《RabbitMQ练习(Hello World)》 确保RabbitMQ、Sender、Receiver容器正常安装和启动: rootk0test1:~# docker run -it --rm --…

流体中的流线【StreamLines】的实现

流线是一条线,它是 与瞬时速度方向相切(速度是一个矢量,并且 它有一个大小和一个方向)。为了在流程中可视化这一点,我们 可以想象一个小的标记流体元素的运动。例如,我们可以标记一个 用荧光染料滴水&#…

nginx和tomcat负载均衡

文章目录 一,tomcat1.tomca用途2.tomcat重要目录 二,nginx1.Nginx应用2.nginx作用3.nginx的正向代理和反向代理3.1正向代理3.2反向代理(单级)3.3反向代理(多级) 4.nginx负载均衡4.1Nginx支持的常见的分流算法1. 轮询(Round Robin):2.最少连接数(LeastCon…

OLED整体刷新到结合switch刷新方式演变

OLED整体刷新到结合switch刷新方式演变 引言 OLED刷新模式, 其实很简单, 就和prinf输出一样, 只是我们这里利用OLED来输出我们所需要的东西了。 至于OLED单独整体刷新, 还是利用switch刷新, 都是形而上学, 形的东西, 至于底层, 江协科技大佬已经帮我整理好了, 我们是站在巨人的…

[ 全部搞定 - 发票导出表格 ] PDF发票提取到表,图片发票提取到表格,扫描件发票提取到表格,全电发票PDF,全电发票扫描件识别导出EXCEL表格

最近很多朋友说找PDF发票提取Excel表格的,找到了图片识别Excel表格的,有的找图片识别Excel表格的,找到了PDF发票提取表格的,所以就很难搞,还有的说都想要 今天一篇文章,全部搞定所有发票【电子发票&#x…

运维学习————nginx3-keepalived及高可用nginx集群

目录 一、高可用nginx规划图 二、克隆一个nginx 启动测试 ​编辑 三、keepalived简介 四、安装配置keepalived保活nginx 4.1、安装 ​编辑 4.2、配置 4.2.1、主机配置(nginx1(主)配置) 4.2.2、从机配置(nginx2(主)配置)…

敏捷架构框架:数字化转型的核心驱动力

在数字化转型的浪潮中,传统的企业架构和组织结构正面临严峻挑战。为了在快速变化的市场环境中保持竞争力,企业不仅需要灵活的开发流程,还需要一种能够支持敏捷方法的架构体系。《数字化时代的敏捷架构》提出的敏捷架构框架(Agile …