设计质量:最佳实践、反模式与验证
命名、分组、状态;八个反模式;用业务题链验证;上线前清单。

本课目标
读完这一课,你将能够
- 用命名、分组和状态让模型好读、好演进
- 认出八个反模式,说出各自的改法
- 用业务题链验证模型,并跑一遍上线前清单
命名、分组与状态
评审从名字开始,因为名字最难事后改:改一个链接端的名字或一个属性的类型,就是破坏性变更,会牵连每个用它的应用。所以先约定,再建。
| 好的写法 | 要避免的 | |
|---|---|---|
| 对象类型 | 单数的具体名词,业务专家一眼认得:WorkOrder | data、item、record |
| 属性 | 短而自明,不带类型和实现细节:standardCostUsd | value、fieldX、dtLastInspMod |
| 日期 | 全模型只用一种写法,并写进约定 | 混用 createdDate 和 dateOfCreation |
| 链接端 | 两头都读得通:customer.orders、salesOrder.customer | relatedItems、link1 |
新建 Object Type 和 Interface 用 PascalCase,例如 WorkOrder。属性和链接端用 camelCase,Action 用 kebab-case。示例工厂已有的小写类型名仍可用;新建类型要遵守新标准。定义时还会检查链接端:同一对象类型上,链接端名不能重复,也不能和属性同名。
分组(type group)是贴在对象类型上的分类标签,方便搜索和浏览,比如销售、生产、供应。状态决定能不能删除:active 是缺省状态,表示应用在用;experimental 还在开发;deprecated 准备删除;example 只用于培训。不能直接删除 active 构件或属性。先改成 deprecated 或 experimental,提交定义或合并,再删除。弃用时必须写 deprecated.message 和 deadline;replacedBy 可选。
八个反模式
下面八个是常见的坑,评审时逐条对照自己的模型。
| 症状 | 改法 | |
|---|---|---|
| 系统孤岛 | erpMaterial、mesMaterial 描述同一种物料 | 合成一个 material,写明每个属性以谁为准 |
| 大杂烩 | 源表几十列全收,含同步时间戳和内部 ID | 只留有人会看、搜、筛的属性 |
| 部门孤岛 | salesCustomer、qualityCustomer 各建各的 | 一个 customer,部门信息用属性和关系 |
| 上帝对象 | 一个 asset,属性含义随 assetType 变,一半为空 | 拆成 machine、productionLine,共有部分用接口 |
| 金锤子 | 什么都做成 Action,比如让人每天点「重算汇总」 | 汇总用派生属性或聚合;数据一变就要做的事,用工作流的 change 触发;Action 留给人的决定 |
| Action 泛滥 | 一个类型十几个 set-…,各改一个字段 | 合成 hold-work-order 这样的业务动作;常见的警戒线是超过 10 个 |
| 时间机器 | workOrderV1、workOrderV2,或用 isCurrent 区分副本 | 一个对象,加编辑历史、时间序列或变更记录对象 |
| 含糊命名 | value、type、date、relatedItems | 具体的名字,链接端按关系命名 |
用真实问题验证
结构评审只能说明模型自洽,不能说明有人用得上。验证要拿真实的业务问题当验收题,而且做题的不能是建模的人,因为建模的人会凭记忆绕过缺口。
好题从状况问到影响:先确定情境,再顺着关系追贡献因素,最后评估波及范围。题目来自组织每周反复问的事,不是来自你已经知道能答的事。示例工厂的一条题链:
- 情境
哪家客户本月订单量最大?
- 产品
它的订单里哪个产品占大头?
- 工单
哪些工单在生产这个产品?
- 物料
这些工单要用哪些物料(BOM)?
- 缺口
哪些物料的现存量不够?
- 影响
哪家供应商的延误,让最多的工单有风险?
走一遍就是一次评审:每一步都要能沿着关系走到。哪一步要导出表格再手工拼,说明关系或概念缺了。记下每个人卡在哪、搜了什么词,这些词就是缺的别名,也就是 synonyms。
再让智能体做同一批题:给只读的 Agent Key 和问题,不给路径。人能做、智能体不能,缺的是靠经验才知道的业务规则;都不能,缺的是数据、关系或含义。
上线前的清单
先让平台查结构上的问题:
aidc semantic define ontology/ --dry-run # do references close? which changes are breaking?
aidc semantic branch create tidy-links
aidc semantic branch modify tidy-links ontology/
aidc semantic branch validate tidy-links # merge checks
aidc semantic ontology --json --branch tidy-links # read it back the way an agent will
再逐项过这张单子:
- 每个对象类型是现实里的一样东西,不是一张表;名字业务专家认得。
- 每个属性都有人会看、搜或筛,同步时间戳这类技术列没有进来。
- 每个关系都能回答一个业务问题,两头读起来是一句话。
- 手工维护的计数和复制来的名字,都改成了派生属性或关系。
- 重复了三次的形状抽成了接口,必填的接口属性类型一致。
- 每个 Action 是一件业务上的事,不是「改一个字段」。
- 破坏性改动已和下游应用确认:改基数,改链接端名或端点,改属性类型,接口加必填属性,类型不再实现某个接口。
- 一条题链走通了,而且做题的不是建模的人。
这一门到此结束。下一门课讲怎样把数据接进来:数据源只读地流进这些对象类型。
要点
- 名字最难事后改:先约定,用业务的话,全模型一种日期写法,链接端两头都读得通。
- 删除
active构件或属性前,先改状态并提交;弃用要写原因和期限。破坏性改动先和下游应用确认。 - 八个反模式大多是同一类错:复制、混同或含糊,评审时逐条对照。
- 用业务题链验证,做题的不是建模的人,再让智能体做一遍。
- 上线前先跑平台检查,再过一遍清单。
练一练
评审一份模型
拿示例工厂或你自己的模型来做。
用八个反模式逐条给这份模型打分,写出最严重的两处和各自的改法。
为你的业务写一条五六步的题链,从情境到影响,标出每一步要走的关系。哪一步走不通?缺什么?
对 ontology/ 目录运行 aidc semantic define ontology/ --dry-run,读输出里的破坏性变更清单:哪些会让下游应用出问题?
小测
选一个答案,马上看解析。
Q1同一种物料在 ERP 和 MES 里各建了一个类型:erpMaterial 和 mesMaterial。这是哪种反模式?
按数据来自哪个系统分别建类型,就是系统孤岛。合成一个 material,再规定每个属性以哪个系统为准。
Q2要验证模型好不好用,最有价值的做法是?
建模的人会凭记忆绕过缺口,演示只会验证他已经知道的覆盖范围。新人卡住的地方,才是模型该改的地方。
Q3一个对象类型已有 12 个 set-… 开头的 Action,各改一个字段。该怎么办?
Action 应该对应一件业务上的事。超过 10 个、名字读起来像「设置某个字段」,是该合并的信号。