"Smart UI Anti-Pattern" 是什么?

What is the "Smart UI Anti-Pattern"?

Vaughn Vernon 在他的著作实施领域驱动设计中指出,

When there are User Interface views that render the model and drive execution of its behavior, these are also inside the Bounded Context. However, this does not mean that we model the Domain in the user interface, causing domain model anemia. We want to reject the Smart UI Anti-Pattern [Evans] and any temptation to drag domain concepts that belong in the model into other areas of the system.

Eric Evans 在他的书“领域驱动设计:解决软件核心的复杂性”(也称为“蓝皮书”)中强调了“智能 UI 反模式”的概念。

你能给我更多关于这个模式的细节吗?

"Smart UI" 只是一种反模式,因为它基本上与域驱动设计不兼容。 Evans 特别指出,如果您不采用具有 UI 层、(薄)应用程序层、用于定义业务状态和应用业务规则的域层以及基础架构层的模式,则“智能UI" 很可能是最佳选择,因为它优于半评估的分层方法(例如,模糊至少两个应用程序、域和基础设施层之间界限的方法)。 Evans 的意图似乎是让您询问“智能 UI”是否可行,如果可行,那么您可能甚至不应该费心去做 DDD,这通常会更加困难。

需要智能 UI 的情况是,如果应用程序以数据输入和显示为主,并且任何业务逻辑都足够简单,可以很容易地在 UI 中进行编码。在这种情况下,Evans 建议将域逻辑放在 UI 中(复数是因为每一位功能都倾向于放在自己的 UI 中)并或多或少地直接拥有 UI与关系数据库交互。老式的服务器端呈现 PHP 方法或 20 年前的典型 VB 应用程序基本上是范例。

Evans 列举了一些优势,包括对领域建模相对不熟练的开发人员可以非常快速地初始交付简单的应用程序,能够快速适应需求变化(只要需求的复杂性不增加) , 和可视化(low-/no-code 用现代的说法)工具可能对此非常有用。缺点包括与其他 applications/services 集成的能力有限(因为集成是通过关系数据库进行的,这往往意味着集成需要修改它涉及的任何内容),业务规则的重用主要通过复制和粘贴进行,缺乏抽象使得重构变得困难,并且在交付这些需求的能力消失之前,functional/non-functional 需求的复杂程度的上限相当低。

敏捷在很大程度上是在 Evans 开发 DDD 的同时出现的,很容易看出敏捷方法如何有利于智能 UI。但是请注意,只有当您可以合理地确定您知道需求将如何演变时,采用智能 UI 才是明智的:如果您认为设计决策部分是关于积累,使用金融比喻,看涨未来的期权要求,您正在编写看涨期权以通过这样做获得溢价。如果您在仔细规划问题并确定需求不会朝那个方向移动之后这样做,那么它可能类似于覆盖呼叫写作,但假设智能 UI 中的 YAGNI 更接近到“做空波动性”(通常被描述为在压路机前的街道上捡起小额硬币:你赚取微薄的利润,直到你被淘汰)。

还值得注意的是,埃文斯关于智能 UI 交付速度更快的主要论点很大程度上取决于实施(和管理)基础设施层的需要。自 Evans 的书以来,人们可能会争辩说,实现这些的困难在很大程度上已被支持 DDD 应用程序开发的框架(例如 Axon、Akka、Vlingo 等(仅指 JVM 目标框架))以及广泛的消息传递系统(Kafka、Kinesis、*MQ、Pulsar 等)、对象存储等,总体效果是 DDD 方法值得付出额外努力的复杂程度已经下降。