知识卡片

嵌套小数编号解决自调用歧义

结构图卡 · 1951.a

内容

通信图上最常见、最直观的消息编号是扁平序号(1、2、3……),但这种写法在UML规范里其实不合法,原因是它解决不了自调用的歧义:如果一个方法内部又调用了另一个方法,扁平编号没法表达这层嵌套关系,读者分不清某条消息到底是被哪一层调用触发的。UML要求的正式做法是嵌套小数编号(如1、1.1、1.1.1),用编号的层级结构直接对应调用的嵌套深度。代价是当调用嵌套很深时,编号会变成1.1.1.2.1.1这种难以一眼看懂的长串,模糊性问题不但没解决反而更糟糕,这也是许多人明知扁平编号不合法却仍然偏爱它的原因。

结构图:

flowchart TD
    A["扁平编号: 1, 2, 3, 4..."] -->|无法表达嵌套| B[自调用歧义: 分不清消息属于哪层调用]
    C["嵌套小数编号: 1, 1.1, 1.1.1"] -->|层级对应嵌套深度| D[消除自调用歧义]
    D --> E["深度嵌套时变成1.1.1.2.1.1<br/>反而难读, 模糊性问题更糟"]

参考来源

- 位置:《UML精粹:标准对象建模语言简明指南(第3版)》第12章《通信图》(源文件:_epub-src/EPUB/11.xhtml) - 结论依据:原文说明"图12.1的编号风格简明而常用,但实际上在UML中是不合法的。为了符合UML的规定,你不得不使用嵌套小数编号体系……采用嵌套小数编号是为了解决自调用的模棱两可问题",并指出深度嵌套时"模棱两可问题没有得到改进,反而更糟糕了"。 - 原始内容:图12.1的编号风格简明而常用,但实际上在UML中是不合法的。为了符合UML的规定,你不得不使用嵌套小数编号体系……尽管它是非法的,许多人更喜欢扁平的编号体系。嵌套编号可能会变得混乱……会导致这样的序列编号:1.1.1.2.1.1。