大厂Data+Agent 秘籍:腾讯/阿里/字节解析如何提升数据分析智能。 了解详情
写点什么

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

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

关注

评论

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

在科技圈流行的冥想,为什么没有全民推广?

脑极体

Web框架Gin | Gin 路由

xcbeyond

Go 语言 路由 gin 8月日更

音频技术及行业的发展

声网

音频技术

面对物联网安全隐患高墙,熵核科技如何实现突围

熵核科技

物联网安全

支持高性能计算场景,博云容器云打造智能算力引擎

BoCloud博云

容器 高性能计算

网络安全行业真的内卷了吗?

网络安全学海

网络安全 信息安全 网络 渗透测试 安全漏洞

QDS06 Iperf 测网速

耳东@Erdong

8月日更 qds iperf

趁着课余时间学点Python(十二)面向对象的理解(结局)

ベ布小禅

8月日更

爆赞!GitHub上首本IntelliJ IDEA操作手册,标星果然百万名不虚传

Java~~~

Java 架构 面试 IDEA 架构师

低耦合、高内聚?

escray

学习 极客时间 如何落地业务建模 8月日更

腾讯三面落马+拒网易、CVTE后,字节四面成功拿下offer

编程菌

Java 编程 程序员 面试 计算机

架构实战营毕业总结

9527

#架构实战营

网络攻防学习笔记 Day104

穿过生命散发芬芳

态势感知 网络攻防 8月日更

360搜索宣布下线“明星人气排行榜”:饭圈文化不是洪水猛兽

石头IT视角

【得物技术】初探 OpenResty

得物技术

nginx 性能 openresty tengine

让GitHub炸锅的深入理解MySQL实战手册,竟出自阿里云“藏经阁”

Java~~~

Java MySQL 数据库 架构 面试

干货分享!通过Dapr快速落地DDD,实现高并发

行云创新

阿里首本凤凰架构竟要付费,构建大型分布式系统的指南这么宝贵吗

Java~~~

Java 架构 面试 分布式 高并发

ReentrantLock 中的 4 个坑!

王磊

Java 并发 lock 8月日更

百度程序员:面试官看过我的博客,所以没敢问我多线程

今晚早点睡

Java 百度 程序员 面试 计算机

出自清华大神之手的JVM实战手册,刚上架GitHub点赞就达到85k

Java~~~

Java 架构 面试 JVM 多线程

GitHub上火了这份堪称神级的SpringBoot手册,竟出自滴滴之手

Java~~~

Java 架构 面试 微服务 Spring Boot

终于有人把操作系统、网络系统、线程进程、IO模型全部总结出来了

Java~~~

Java 架构 面试 TCP 网络

前端之算法(三)归并排序

Augus

数据结构与算法 8月日更

JDK从8升级到11,使用 G1 GC,HBase性能下降20%。JDK 到底干了什么

Summer

Java 学习 程序员 架构 jdk

腾讯三面:哨兵挂了,Redis还能正常工作吗?

Summer

Java redis 学习 程序员 架构

红黑树的理解与 Java 实现

编程菌

Java 编程 程序员 计算机 技术宅

SQL的执行计划-->explain

卢卡多多

sql 8月日更

中国如何应对中美科技博弈?

石云升

科技革命 8月日更 启发 中美博弈

了,来了!Nacos 2.0的Spring Boot Starter终于来了

Summer

Java 学习 程序员 架构 springboot

【前端 · 面试 】JavaScript 之你不一定会的基础题(二)

编程三昧

JavaScript 面试 大前端 事件 8月日更

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