Mermaid 类图中的泛型 <T> 怎么画?告别 got ‘DEPENDENCY‘ 语法错误

这是一篇专门围绕 Mermaid 类图中如何正确表示“泛型”这一主题编写的技术博客。文章以一个常见的语法错误为切入点,详细介绍了 Mermaid 提供的优雅解决方案 ~T~,旨在帮助开发者绘制出更精准、更专业的类图。


Mermaid 类图中的泛型 <T> 怎么画?告别 got 'DEPENDENCY' 语法错误

在面向对象编程中,泛型(Generics)是我们构建类型安全、可复用代码的强大工具。当我们使用 Mermaid 的类图(classDiagram)来可视化我们的软件设计时,一个自然而然的需求便是:如何准确地表示像 List<T>Repository<User> 这样的泛型类和接口?

很多开发者,特别是 Java 或 C# 背景的,会很自然地将编程语言中的泛型语法直接搬到 Mermaid 中,结果却遭遇了无情的 Parse error... got 'DEPENDENCY' 错误。

本文将带你深入了解这个错误的根源,并介绍 Mermaid 提供的、专门用于表示泛型的优雅语法——~T~

案发现场:当 <T> 遇上 Mermaid 解析器

我们的目标是绘制一张简单的 JPA (Java Persistence API) Specification 查询模式的类图。其中包含了多个泛型接口,如 JpaSpecificationExecutor<T>Specification<T>

我们的初始代码如下 (错误版本):

classDiagram
    class JpaSpecificationExecutor<T> {
        <<Interface>>
    }
    class Specification<T> {
        <<Interface>>
    }
    class SolutionRepository {
        <<Interface>>
    }
    JpaSpecificationExecutor<T> <|-- SolutionRepository

这段代码的意图非常清晰,但在 Mermaid 看来,却是一段无法理解的“天书”。渲染器会抛出类似这样的错误:

在这里插入图片描述

Error: Parse error on line 2:
…pecificationExecutor<T> {                 <<Inte
---------------------------------^
Expecting ‘NEWLINE’, ‘EOF’, ‘SQS’, ‘STRUCT_START’, ‘STRUCT_STOP’, ‘STYLE_SEPARATOR’, got ‘DEPENDENCY’

错误信息 got 'DEPENDENCY' 可能让人一头雾水。这里的 DEPENDENCY 实际上是 Mermaid 解析器对尖括号 < 的内部词法单元(Token)命名(因为它也用于表示依赖关系)。这条错误的大白话翻译就是:

“我在 JpaSpecificationExecutor 后面,期望看到的是换行符或者 {,结果却收到了一个 < 符号。这不符合我的语法规则!”

探寻根源:Mermaid 不懂你的 <T>

根本原因在于:Mermaid 的类图解析器,并不认识也不支持其他编程语言(如 Java, C#, TypeScript)中 ClassName<TypeParameter> 这种泛型语法。

解析器在设计时,并没有被赋予理解尖括号 < > 在类名中作为泛型边界符的能力。当它在类名后面看到一个 < 时,它会尝试将其解析为某种关系操作符(如依赖关系 <..),而不是泛型参数的开始。由于后续的 T> 不符合任何已知的关系语法,解析便宣告失败。

解决方案:Mermaid 的泛型“暗号”——~T~

幸运的是,Mermaid 的设计者们为我们提供了一种专门的、无歧义的语法来表示泛型。

Mermaid 中表示泛型的语法是:ClassName~TypeParameter~

我们使用一对波浪号 ~ 来包裹泛型参数,而不是尖括号 < >

修正后的代码 (最佳实践):

"调用"
"使用"
"创建"
AppSolutionService
-SolutionRepository solutionRepository
+searchSolutionsForApp()
«Interface»
SolutionRepository
+findAll(Specification, Pageable)
«Interface»
JpaSpecificationExecutor<T>
«Static Utility»
AppSolutionSpecification
%% 在方法签名中同样可以使用
+getSpecification() : Specification<Solution>
«Interface»
Specification<T>

这个版本做了哪些关键修正?

  1. JpaSpecificationExecutor<T> 被修正为 JpaSpecificationExecutor~T~
  2. Specification<T> 被修正为 Specification~T~
  3. 在方法 getSpecification() 的返回类型中,也将 Specification<Solution> 相应地修改为了 Specification~Solution~

将这段修正后的代码放入渲染器,一张既语法正确、又能清晰表达泛型概念的专业类图便诞生了。

为什么 ~T~ 是一个更好的设计?

  • 无歧义: 波浪号 ~ 在 Mermaid 的类图语法中没有其他含义,专门用于泛型,因此不会与关系操作符 <> 产生任何解析上的冲突。
  • 视觉清晰: ClassName~T~ 的形式在视觉上也能很好地将泛型参数与类名本身区分开来。

经验总结 🧠

这次由泛型语法引发的“惨案”,为我们提供了宝贵的经验:

  1. 尊重 DSL (Domain-Specific Language, 领域特定语言) 的“方言”: Mermaid 有自己的一套用于表达通用编程概念(如泛型、接口)的独特语法。我们必须使用它的“方-言”,而不是直接照搬我们熟悉的 Java 或 TypeScript 语法。
  2. <> vs ~~: 在 Mermaid 类图中,请牢记:尖括号 <> 用于表示关系(继承、组合、依赖等),波浪号 ~~ 用于表示泛型。
  3. 查阅文档是捷径: 当你想在 Mermaid 中表达某个编程概念却不确定语法时,花一分钟查阅官方文档,远比自己反复试错要高效得多。

遵循这些简单的规则,你就能在 Mermaid 中自如地绘制出能够精准反映你软件设计的、包含泛型等高级概念的专业类图。Happy Diagramming! UML (Unified Modeling Language, 统一建模语言)图也可以如此简单!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值