知识卡片

用例:只在自动化系统内才有意义,控制业务实体交互是DIP的又一应用

普通读书笔记卡

内容

并非所有业务逻辑都是纯粹的[[业务实体把关键业务逻辑与关键业务数据绑定为独立模块]]——有些逻辑靠定义或限制自动化系统本身的运行方式来实现赚钱省钱,脱离自动化系统就没有意义。比如银行要求柜员新建贷款前必须先收集验证客户联系信息、确认信用值大于500才允许进入还款预估页——这不是人工能替代的操作步骤,而是关于”如何操作这个自动化系统”的描述:需要什么输入、该产生什么输出、以及产生输出所需的处理步骤,这就是用例(usecase)。用例描述的是某个特定应用场景下的业务逻辑,而非业务实体所承载的关键业务逻辑;用例本质上定义了如何调用业务实体里的关键业务逻辑,控制着业务实体之间的交互方式——但除了正式描述数据流入流出的接口,用例并不详细描述用户界面,光看用例是分辨不出系统究竟是Web、富客户端、命令行还是内部服务交付的,这一点至关重要:用例只规范用户与业务实体的交互方式,与数据流入流出系统的具体渠道无关。在系统实现里,用例本身也是一个对象,包含实现特定应用场景的业务逻辑函数,以及输入数据、输出数据和相关业务实体的引用。业务实体从不知道是哪个用例在调用它——这正是[[抽象工厂模式与依赖反转名字的由来控制流与源码依赖方向相反]]所属依赖反转原则的又一具体应用:像业务实体这样的高层概念无须了解用例这样的低层概念,反过来低层用例却必须了解高层业务实体。业务实体之所以是高层、用例之所以是低层,判断标准和[[层次按距离输入输出的远近定义高层策略变更应更少更重大]]一致——用例服务于特定应用场景,天然更靠近系统的输入输出;业务实体是能适用于多个应用场景的一般化概念,离输入输出更远。

参考来源

- 位置:《架构整洁之道》第20章《业务逻辑》"用例"(源文件:_epub-src/text/part0014_split_005.html) - 结论依据:原文用银行柜员新建贷款前必须验证信用值的例子定义用例(描述输入输出与处理步骤,只在自动化系统里有意义),说明用例不描述用户界面细节、只规范用户与业务实体的交互方式,并明确业务实体不了解用例、用例依赖业务实体是DIP应用,直接支撑本卡片结论。 - 原始内容:这些业务逻辑就不能靠人工来执行,它们只有在作为自动化系统的一部分时才有意义……用例控制着业务实体之间的交互方式……用例依赖于业务实体,而业务实体并不依赖于用例。