知识卡片

Hunt The Wumpus案例:从三组件模型到多API边界,GameRules成为最高层策略

结构图卡

内容

“系统=UI+业务逻辑+数据库”这个三组件模型对简单系统够用,但稍复杂的系统组件数量远不止三个。以1972年的文字冒险游戏Hunt the Wumpus为例:如果想让游戏支持多语言,就需要把UI和业务逻辑之间用一种与自然语言无关的API解耦——多个UI组件可以复用同一套游戏业务逻辑,业务逻辑不必知道UI用的是哪种语言;类似地,游戏状态存储介质(闪存/云端/本机内存)的细节也不该让游戏引擎知道,需要另一个API隔开业务逻辑和数据存储。但语言并非UI变更的唯一维度——文字输入输出方式本身也会变(命令行、短信、聊天程序),这意味着还需要一条API把语言部分(Language)和通信部分(TextDelivery)隔开。这样系统里的抽象组件(虚线框)所定义的API,惯例上由其使用方的上层组件负责实现和维护,而非被使用方:GameRules定义的API由Language实现,Language定义的API由TextDelivery实现,同时反过来Language使用的Boundary多态接口由TextDelivery实现、GameRules使用的Boundary多态接口由Language实现——每一层的具体实现类(English/Spanish、SMS等)都实现了上层抽象组件定义的多态接口。去掉所有具体实现类只留API组件后,箭头全部朝上,GameRules自然坐落在顶层,印证了它是最高层策略组件这个事实:来自用户的信息经TextDelivery→Language转换成命令输入给GameRules;GameRules处理后把数据交给DataStorage存储,同时把输出向下经Language转成语言、经TextDelivery传给用户。这样系统被分成两路数据流——一路管用户通信、一路管数据持久化,两路在顶部的GameRules汇聚,GameRules是所有数据的最终处理者。

结构图

flowchart BT
    TextDelivery --> Language
    Language --> GameRules
    DataStorage --> GameRules
    GameRules -.API由GameRules定义,Language实现.-> Language
    Language -.API由Language定义,TextDelivery实现.-> TextDelivery
    GameRules -.API由GameRules定义,DataStorage实现.-> DataStorage

参考来源

- 位置:《架构整洁之道》第25章《层次与边界》"基于文本的冒险游戏:Hunt The Wumpus""可否采用整洁架构"(源文件:_epub-src/text/part0014_split_010.html) - 结论依据:原文以Hunt The Wumpus游戏为例,说明如何用API边界依次分离UI语言、通信方式、数据存储,指出抽象组件API由使用方上层负责维护,并展示简化设计后GameRules因所有箭头朝上而坐落顶层、是数据流最终汇聚点,直接支撑本卡片的结构图与解释。 - 原始内容:多个UI组件复用同一个游戏业务逻辑组件……在所有这些场景中,由Boundary接口所定义的API都是由其使用者的上一层组件负责维护的……这种设计方式将数据流分成两路……两条数据流在顶部的GameRules汇聚。