知识卡片

命令与事件的语义区别:推文与订餐邮件的类比

普通读书笔记卡

内容

事件是已经发生的事情、是事实——组件A发布事件只是通知所有人,对这个事件会产生什么影响没有任何期望,是否响应、如何响应完全由组件B自己决定。命令则相反:组件A向组件B发送命令,表达的是一个明确的意图——”我想让你做某件事”,B不能轻易忽略这个命令。作者常用推文和订餐邮件做类比:在Twitter上说”我饿了”是一个事件,广播给全世界,可能触发某个动作(运气好有关注者送吃的来),但更可能被完全忽视,这对事件来说很正常;相比之下,给餐馆发一封订餐邮件是命令,你有明确的订餐意图,绝不会指望靠发条推文来点餐。这个区别与具体通信协议无关——Twitter和邮件都是异步通信,但对”接下来会发生什么”的期望完全不同;同步通信里同样存在这种差异,打电话说”嘿我饿了”是事件,说”你好我想点些东西”是命令,内容类型和通信通道彼此独立。有人认为”命令”意味着不能被拒绝,这也不对——餐厅完全可能因为忙不过来拒绝你的订单;命令真正要求的是对方必须做出回应、不能置之不理。这引出命令的另一个特征:大多数情况下会有一个反馈回路(确认或回应),如果命令发出去却什么反馈都没收到,你会感到不安——不过邮件回复或电商页面的即时确认也都不是最终的回应,只有饭菜真正送到你手上,那才是真正满意的终点。

参考来源

- 位置:《流程自动化实战:系统架构和软件开发视角》第8章《平衡编排与编制》"8.2.1 命令简介"(源文件:_epub-src/EPUB/xhtml/Section0001_0012.xhtml) - 结论依据:原文用发推文(事件,广播且可能被忽视)与发订餐邮件(命令,有明确意图且需要回应)的类比说明二者语义差异独立于通信协议,并说明命令并非"不能拒绝"而是"必须回应",直接支撑本卡片结论。 - 原始内容:比如你在Twitter上说你饿了,这就是一个事件……但更有可能的是,它完全被忽视了……想象一下,你给你最喜欢的餐馆发了一封订餐邮件。现在你有一个明确的意图:订餐……重要的是,餐厅需要做出回应,不能无视你的订单。