ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

PlantUML Object Diagram 源码解析:object、map 与 json 三种对象图的实现机制

PlantUML Object Diagram 源码解析:object、map 与 json 三种对象图的实现机制 开发工具文档【免费下载链接】plantumlGenerate diagrams from textual description项目地址https://gitcode.com/gh_mirrors/pl/plantuml点击查看免费下载本篇文章以 PlantUML 仓库中 objectdiagram 包目录文档 为核心深入讲解该包所管理的三类对象图object、map、json的语法与底层实现。读者将掌握如何在 PlantUML 中编写对象图、map 键值表与 JSON 数据块并理解命令解析、实体创建与链接生成在源码中的真实执行路径。一、objectdiagram 包在 PlantUML 中的定位objectdiagram/readme.md 明确指出该包提供用于管理 PlantUML Object Diagram 的类覆盖三种实体类型object经典 UML 对象图实体展示对象实例及其属性值map以键值对key value形式呈现的映射表json内嵌 JSON 数据、以类表格形式展示的实体。包的 JavaDoc 说明package-info.java与之呼应同样将这三种图统称为 “Object (object, map, json) Diagram”。从目录结构看实现被分为两个部分组成部分文件职责命令层command/ 下的 6 个Command*类负责把用户输入的文本行解析为实体或字段抽象基类AbstractClassOrObjectDiagram.java提供对象图与类图共用的实体、链接与关联类能力这种 “命令解析 抽象图模型” 的分层与 PlantUML 其余图类型类图、状态图等的架构保持一致每种图都有独立的Command集合负责从文本中提取结构化数据。二、object 实体单行声明与多行属性块2.1 单行声明object Name创建对象图的最简语法是object Name。其命令实现位于 CommandCreateEntityObject.java。从 正则定义 可以看出该命令除关键字object外还支持四个可选扩展NameAndCodeParser.nameAndCode()既支持object 显示名也支持object 显示名 as 代码名的分离写法StereotypePattern.optional(STEREO)可选的构造型stereotype如entityUrlBuilder.OPTIONAL可选的 URL 链接ColorParser.exp1()可选的背景色。也就是说一条完整语句可以写成object 用户实体 as user entity #lightblue其中#lightblue会被映射为实体的背景色源码中通过ColorType.BACK设置entity会生成带圆圈字符的构造型标记。执行逻辑executeArg值得注意的两个行为重名检测如果同名对象已存在命令返回错误Object already exists: xxx显示名回退未指定显示名时直接使用对象名作为显示文本并采用CreoleMode.SIMPLE_LINE简单单行模式渲染。2.2 多行声明object Name { ... }当对象需要展示多个属性值时使用花括号块语法object user { name Alice age 30 admin false }该语法由 CommandCreateEntityObjectMultilines.java 处理。它与单行版本有两个关键差异复用既有实体单行命令遇到重名会报错而多行命令会复用已存在的实体源码中executeArg0先检查quark.getData()非空则直接使用因此可以把对象声明与属性填充拆成多条语句字段逐行添加块内每一行通过entity.getBodier().addFieldOrMethod(line)加入对象体且如果行首是可见性字符、-、#、~等由 VisibilityModifier 判定会触发对象的可见性修饰符显示。2.3 追加字段object : field value除了块语法还可以用单行命令为已存在的对象追加属性object user user : name Alice user : age 30CommandAddData.java 的正则([%pLN_.]) : (.*)表示冒号左侧必须是对象名允许点号与下划线右侧为字段内容。执行时若对象不存在命令返回No such entity——这一点与类图中的同类命令不同注释中特别说明类图版本会“即时创建”实体而对象图版本严格要求对象先存在。三、map 实体键值表与端口链接map是对象图中以键值对为核心的特殊实体由 CommandCreateMap.java 实现map 配置表 ##[dashed]red { 数据库地址 jdbc:mysql://localhost:3306 连接池大小 10 启用缓存 true owner *- 用户 }该命令在头部支持比object更丰富的样式选项正则定义选项写法作用显示名map 标题 as code分离显示名与代码名构造型...可选 stereotype背景色#color表背景色边框颜色与样式##[dotted\|dashed\|bold]color通过LINECOLOR捕获支持边框线型与颜色块体内部每一行必须是key value形式否则执行时报错Map definition should contains key value。真正的数据存储与解析逻辑位于 BodierMap.java。map 图最具特色的能力是端口链接形如key *- dest的行会在键所在端口与一个已存在的实体之间生成箭头链接。从 CommandCreateMap.executeNow 的实现可见其完整流程通过BodierMap.getLinkedEntry(line)识别*-链接标记拆分出左侧键名与右侧目标实体名若目标实体不存在则报错No such entity创建LinkType(ARROW, NONE)类型的链接并把键名设置为链接的端口成员link.setPortMembers(key, null)最终调用diagram.addLink(link)接入图模型。这一机制使 map 不仅能表达静态配置表还能作为图间关系的“锚点”在对象图上建立可读性极强的关联视图。四、json 实体内嵌 JSON 数据的表格化呈现json实体允许把一段 JSON 数据直接嵌入 PlantUML并以类表格形式渲染由 CommandCreateJson.java 与 CommandCreateJsonSingleLine.java 共同支撑。4.1 多行 JSON 块json 用户信息 { id: 1, name: Alice, roles: [admin, editor] }解析流程分两步先用正则匹配json关键字与实体名再将花括号内的全部行拼接为 JSON 字符串交给net.sourceforge.plantuml.json包内的JsonParser做真实语法校验getJsonValue。校验失败时返回错误Bad data。这里有一个值得注意的容错细节若整体解析失败代码会尝试去掉最外层括号后再次解析以兼容部分用户多写一层{ }的输入习惯。解析成功后JSON 值被设置到实体的BodierJSon上BodierJSon.java渲染阶段据此生成表格化的 JSON 结构视图。4.2 单行 JSON 值除了多行块还支持单行直接声明一个 JSON 值json version 1.2.3 json enabled true json tags [alpha, beta] json config {host: localhost, port: 8080}CommandCreateJsonSingleLine.java 的正则定义了六种合法取值类型L82-L89true/false布尔、-?\d数字、null、双引号字符串、[...]数组、{...}对象。与多行版本相同正则只是第一层筛选最终仍由JsonParser做内存级语法校验正则匹配但 JSON 非法时同样返回Bad data。4.3 与 object/map 的共性约束从源码可见json 实体与 object 一致实体名冲突时报JSON already exists且支持 stereotype、背景色等通用修饰唯一例外是 URL 选项——两个 json 命令及 map 命令的注释均明确标注 “the URL is currently ignored”即解析了 URL 参数但在执行阶段并不生效object 单行命令是唯一真正使用 URL 的。五、公共基类对象图的图级能力所有上述命令的操作目标最终收敛到 AbstractClassOrObjectDiagram.java。它继承了AbstractEntityDiagram为 object/map/json 三类图提供统一的基础设施命名空间分隔符构造函数中将namespaceSeparator设置为.L62-L66因此对象名中的点号如system.user会被解释为命名空间层级这与类图的包语义保持一致链接插入与查找insertBetween与foundLink支持在任意两个实体间插入中间节点并重排链接是对象图动态构图的基础关联类Association ClassassociationClass方法负责创建关联类的连接点POINT_FOR_ASSOCIATION叶子类型通过内部Association类维护“实体 A — 连接点 — 关联类”的链接拓扑并对同一对实体的多重关联进行去重与二次扩展。虽然关联类语法在对象图中使用频率不高但这一能力与类图共用同一抽象层体现了 PlantUML “实体 链接” 统一图模型的复用设计。六、综合示例与验证建议将三种实体组合到同一张对象图中即可验证全部核心能力startuml object 用户 as user #lightblue { name Alice age 30 } map 会话表 ##[dashed]gray { 当前用户 user token abc123 user *- user } json 响应数据 { code: 200, message: ok } user -- 会话表 enduml上述示例可用仓库提供的构建脚本直接渲染验证例如./gradlew run -Pargspath/to/diagram.puml渲染后应看到带背景色与属性块的对象、带虚线边框与*-端口链接的 map、以及表格化的 JSON 块。若 map 中引用了不存在的实体或 json 数据非法命令层会分别返回No such entity与Bad data错误提示这正是 CommandCreateMap 与 CommandCreateJson 执行期校验的直接体现。七、小结从 objectdiagram 包 出发可以清晰看到 PlantUML 对象图三条独立的实现脉络object单行声明、多行属性块、追加字段三种入口以LeafType.OBJECT创建实体字段经Bodier接口写入实体体map以key value键值表为核心支持边框样式定制与key *- dest端口链接链接经LinksetPortMembers接入图模型json多行块与单行值两种写法均由内置JsonParser做二次语法校验合法数据通过BodierJSon表格化呈现。三者共享AbstractClassOrObjectDiagram的实体、链接与关联类基础设施构成了一个语法简洁、实现分层清晰的“文本到图”转换链路。对于希望扩展 PlantUML 新实体类型的开发者command/ 目录下的 6 个命令类是研究“正则捕获 → 实体创建 → 模型接入”这一标准流程的最佳起点。赞分享开发工具文档【免费下载链接】plantumlGenerate diagrams from textual description项目地址https://gitcode.com/gh_mirrors/pl/plantuml点击查看免费下载相关推荐深入object-reflector源码解析对象属性反射的实现原理深入object reflector源码解析对象属性反射的实现原理 想要深入了解PHP对象反射的底层机制吗 object reflector 这个强大的开发工具forever源码中的对象合并object-assign应用forever源码中的对象合并object assign应用 在Node.js开发中对象合并是常见需求forever项目通过引入 object assigCLI运维Truffle Contract-Schema 网络对象Network Object规范解析address、events 与 links 的 JSON Schema 定义与实现Truffle Contract Schema 网络对象Network Object规范解析address、events 与 links 的 JSON S区块链开发工具Web3创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表