AI实践哪家强?来 AICon, 解锁技术前沿,探寻产业新机! 了解详情
写点什么

在领域逻辑中使用 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:002746
用户头像

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

关注

评论

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

产品经理互怼放大招(god bless !Duel, Orcs)

执于业务

企业架构设计原则之因素均衡性

凌晞

架构设计 架构设计原则 企业构架

京东jd.item_get API助力,一键获取商品详情,打造专业级购物体验

技术冰糖葫芦

API API 类型

事业-最佳实践-编码-源代码方法组织

南山

最佳实践 编码 代码组织

java内存篇:内存对象有多胖?

码农楠爸

找到A不存在于B的记录,not in, except ,not exists ,left join + is null 大比拼

TiDB 社区干货传送门

6.x 实践

一文概述TiDB中的索引类型

TiDB 社区干货传送门

管理与运维

从金融行业典型案例中窥探TiDB到底有哪些优势

TiDB 社区干货传送门

数据库前沿趋势

产品经理 学习路线

执于业务

2024年DeFi的四大主导趋势:Restaking、Layer3、AI和DePin

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

物联网业务架构模式

执于业务

事业-最佳实践-编码-代码质量标准

南山

代码质量 代码可读性 #可维护性 #可测试性 可复用性

事业-最佳实践-编码-保持代码简洁

南山

代码质量 KISS YAGNI 代码简洁

教你快准狠上手基于 Dashboard 快速定位问题 SQL

TiDB 社区干货传送门

监控 实践案例 管理与运维 故障排查/诊断 7.x 实践

切换到tidb用户使用tiup命令出现bash: tiup: command not found

TiDB 社区干货传送门

管理与运维 7.x 实践

物联网架构

执于业务

事业-最佳实践-编码-程序错误处理

南山

最佳实践 异常处理 程序错误

再质押的Eigenlayer 现在参与来得及吗

币离海

EigenLayer

唐刘:关于产品质量的思考 - 我的基本认知

PingCAP

数据库 TiDB

2024 TiDB 社区 PCTA/PCTP/PCSD 免费考证(社区专场)机会来啦!想考证的 TiDBer 看过来!

TiDB 社区干货传送门

社区活动

支付系统概述(三):资金网络

agnostic

支付系统设计与实现

TiDB 版本升级的小 Tips

TiDB 社区干货传送门

版本升级 集群管理 管理与运维 7.x 实践

TiDB VS MySQL 场景选择

TiDB 社区干货传送门

7.x 实践

惊喜!这一国产数据库认证考试限免了!

TiDB 社区干货传送门

社区活动

TiDB v8.0 组件 TiProxy 测试

TiDB 社区干货传送门

8.x 实践

TiDB 奇遇记

TiDB 社区干货传送门

学习&认证&课程

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