【AICon】探索RAG 技术在实际应用中遇到的挑战及应对策略!AICon精华内容已上线73%>>> 了解详情
写点什么

在领域逻辑中使用 If 语句的潜在危险

  • 2017-02-19
  • 本文字数:1255 字

    阅读完需:约 4 分钟

大多数编程语言中 if 语句主要有两个作用:验证输入以保护领域免受错误数据的影响,以及处理领域内业务逻辑。但是, Udi Dahan 最近在阿姆斯特丹 DDD 欧洲会议上的发言中指出,我们一般很少从业务或领域角度管理使用 if 语句处理逻辑的风险。

我们在线购物时会浏览不同的商品,并仔细阅读其中一些商品的详细信息。当找到想要购买的商品并将其添加到购物车中时,我们也从交互的查询功能转移到命令功能。对任何类型的命令,Dahan 认为我们应该问的重要问题之一是,什么因素会导致该命令失效。他还强调了我们必须区分技术失效(例如网络服务器崩溃或者反序列化错误,这应该由基础架构解决)和逻辑失效(比如将已经从产品目录中删除的商品添加到购物篮)。

Dahan 与客户合作的一个常见案例就是检查是否有项目被删除。对他来说,处理已删除项目这类问题的一个步骤是区分私有数据和公共数据,并与内容管理系统进行比较。在内容管理系统中,你可以编辑页面和内容,最后通过按“发布”键公开信息。在处理私有数据方面,用户可以随意添加、更新或删除项目,直到最后满意了再公开。

在处理公共数据方面,我们应该更多地用业务逻辑来替换删除和检查删除,应该更仔细地斟酌为什么要删除某个项目。以某个不再出售的产品为例,或许更好的方法是创建一个特定的命令,将该产品标记为不出售,而不是使用某种形式的暂时或真正的删除。

这种解决方案的潜在问题是竟态条件(race condition)。即顾客将商品添加到购物篮后该商品被标记为不出售,之后当客户想要结账时已经无法购买这项商品了。对于 Dahan 来说,以这种方式看待问题的视角是非常狭窄的、以数据为中心且局限于某个时间点。相反地,他将这个问题描述为多个参与者同时在同一个对象上操作的典型场景。

对于在协作领域多个参与者同时对相同的数据进行操作的情况,Dahan 认为我们应该开始考虑使用 CQRS。当 CQRS 应用于领域时,他建议使其尽可能简单化,并设计好解决方案,以保证经过验证后应用于领域逻辑的命令几乎不会失效。这意味着在处理命令时,我们必须准备好在竞态条件下失败却仍然可以满足整体业务目标。通常这从商业角度来说能达到最终的一致性,但不是技术上的一致性(如读取模型最终与写入模型同步)。举例来说就是客户把某个不出售的商品添加到购物篮中。

这个问题的一个解决方案是使用幕后长期运行过程,当用户不再操作购物篮或者超时时,从购物篮移除已停止销售的商品。最终,该商品被从所有购物篮中移除,因此不再销售。

当我们查看系统时可能会发现许多以某种形式检查状态的if 语句,对于每一个if 语句,我们都应该搞清楚是否有其他参与者可能改变该if 语句所检查的状态。这样我们可以找到潜在的协作情形和对长期运行过程的需求。不过Dahan 指出,我们要注意不要使用太多的长期运行过程,它并不是万能的。

查看英文原文: The Dangers of If Statements in Domain Logic


感谢王纯超对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2017-02-19 18:002366
用户头像

发布了 22 篇内容, 共 48154 次阅读, 收获喜欢 3 次。

关注

评论

发布
暂无评论
发现更多内容

识别AI换脸!百度这项技术夺冠了!

百度大脑

人工智能 百度

中央银行、不平等和新技术:使用分布式账本、可编程合约和密码学的蓝图

CECBC

1 分钟学会 30 种编程语言

AlwaysBeta

科技热点周刊|马斯克套现 440 亿;苹果推出数字身份证;Meta 与微软合作;华为捐赠欧拉

青云技术社区

云计算 物联网

Ubuntu系统下《汇编语言》环境配置

codists

汇编语言

一个基于PoS共识算法的区块链案例

Regan Yue

区块链 共识算法 11月日更 细讲区块链

你现在可以在元宇宙里 “打工”了!

CECBC

【LeetCode】重新排序得到 2 的幂Java题解

Albert

算法 LeetCode 11月日更

NodeJs 深入浅出之旅:V8 内存分配🧙‍♂️

空城机

大前端 Node 11月日更

一起听、一起看、一起唱掀起Z世代青年社交浪潮

声网

人工智能 算法 音视频

架构设计

AHUI

「架构实战营」

赢在2022,面试官常问的软件测试面试题总结

六十七点五

软件测试 面试题 自动化测试 经验总结 测试工程师

范学雷的专栏《深入剖析 Java 新特性》

IT蜗壳-Tango

11月日更

你不知道的开源分布式存储系统 Alluxio 源码完整解析(下篇)

腾源会

大数据 开源

一文告诉你 K8s PR (Pull Request) 怎样才能被 merge?

腾源会

k8s

你不知道的开源分布式存储系统 Alluxio 源码完整解析(上篇)

腾源会

大数据 开源 数据湖

15 K8S之容器安全上下文

穿过生命散发芬芳

k8s 11月日更

验证码

卢卡多多

图片验证码 11月日更

Android C++系列:JNI操作Bitmap

轻口味

c++ android jni 11月日更

进击的Java(七)

ES_her0

11月日更

jodconverter实现在线预览

小鲍侃java

11月日更

这一次,Google 终于对 Web 自动化下手了!

星安果

chrome 自动化

在华为云专属月,找到开启互联网第二增长曲线的一把钥匙

脑极体

请问软件测试和渗透测试的区别是什么?

喀拉峻

网络安全 渗透测试

【算法技术专题】如何用Java实现一致性 hash 算法( consistent hashing )(上)

洛神灬殇

算法 一致性hash 11月日更

CNCF 沙箱再添“新将”!云原生边缘容器开源项目 SuperEdge 正式入选

腾源会

开源 容器 云原生 cncf

linux下清理系统缓存并释放内存

入门小站

Linux

在线假单词随机生成器

入门小站

工具

监管打压加码!虚拟货币挖矿再遭围堵 “漏网之鱼”当休

CECBC

数据同步:教你如何实时把数据从 MySQL 同步到 OceanBase

OceanBase 数据库

数据库 开源 oceanbase 分布式,

新能源汽车补贴没了,行业还能快速发展吗?

石云升

学习笔记 新能源汽车 11月日更

在领域逻辑中使用If语句的潜在危险_语言 & 开发_Jan Stenberg_InfoQ精选文章