写点什么

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

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

关注

评论

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

比redis-rdb-tools快10倍的rdb分析工具

BUG侦探

redis bigkey rdb分析

天津大学教授站上 WICC2021 “讲坛” 将分享边缘计算新研究

融云 RongCloud

用10个真实案列带你掌握MySQL调优

北游学Java

Java MySQL 性能调优

智汇华云|安超云套件Archer Cloudsuite为“信创强国”筑基

华云数据

如何保障服务器承受亿级流量(12)【限流】

我爱娃哈哈😍

架构设计 架构设计实战

Tapdata 荣获2021中国创新势力榜“最佳数字中台企业服务品牌”大奖

tapdata

Tapdata 最佳数字中台企业服务品牌

如何实现70%丢包下音视频的高可用 - 数据篇

ZEGO即构

音视频 数据处理 传输协议 弱网环境高可用 Qo

lsyncd实现文件实时同步

阿呆

lsyncd

Realtime DB技术详解

安第斯智能云

数据

什么是高效,什么是好的企业文化

Ryan Zheng

DistSQL:像数据库一样使用 Apache ShardingSphere

SphereEx

专科程序员与本科程序员之间有什么区别?薪资待遇又差多少?

Java 编程 程序员 架构 面试

大数据训练营 - 第二次作业hadoopRPC

西伯利亚鼯鼠

爬虫入门到放弃03:爬虫如何模拟人的浏览行为

叫我阿柒啊

爬虫 代理IP user-agent

Uber 多区域 Kafka 的灾难恢复

奔着腾讯去

Apache kafka 分布式

浪潮云说直播间,就在今天!

去中心化交易所搭建|区块链数字货币交易平台开发

Geek_23f0c3

APP开发 去中心化交易所系统开发 区块链、

天不生我SpringBoot高级笔记 编程万古无常夜!

白亦杨

Java springboot

Tapdata 与巨杉数据库完成产品兼容互认证

tapdata

Tapdata 巨杉数据库 产品兼容性互认

干货 | 用JAVA实现多语言翻译组件

LigaAI

Java 国际化

有奖体验活动,最新1.3版本试用

Geek_6cdeb6

人工智能 机器学习 深度学习 学习 AI

手把手教你,从零开始搭建Spring Cloud Alibaba!这份笔记太牛了

产业区块链迎来新纪元,基础设施建设成核心命题

旺链科技

区块链 产业 基础设施建设

容器安全检查列表

greatersecurity

容器 云原生 DevSecOps

手写希尔排序算法

实力程序员

编程 程序员 C语言 排序算法

Alibaba永远滴神!阿里内部最新Java基础到中高级核心知识手册

Java~~~

Java 编程 程序员 架构 面试

完美收官!字节4面斩下2-2Offer,入职就是30K16薪,全凭这套“面试+架构进阶知识点”pdf

Java 程序员 架构 面试

百度内容风控是怎样在秒级之内完成词表匹配

百度Geek说

百度 内容审核

从零开始学习3D可视化之数据对接(1)

ThingJS数字孪生引擎

大前端 可视化 3D 3D可视化 数字孪生

2021InfoComm|钉钉会议 Rooms 的 "全场景" 智能化解决方案

阿里云视频云

音视频 钉钉 视频会议 会议 会议室

耗时半年,堪称神迹!阿里架构师整合出258W字Java全栈面试题

Java架构追梦

Java 阿里巴巴 面试 java架构 跳槽

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