第一次接触PlantUML用例图时,我正被一个电商项目的需求评审会折磨得焦头烂额。产品经理在白板上画满歪歪扭扭的椭圆和火柴人,开发团队皱着眉头试图理解这些涂鸦背后的业务逻辑。直到有人扔出一段简单的文本代码,瞬间生成清晰的用例图——那一刻我意识到,这就是敏捷团队梦寐以求的沟通神器。
PlantUML用例图的核心价值在于用代码代替画笔。你不需要学习复杂的绘图工具,只需掌握几个基础语法规则,就能快速产出专业级图表。这种"文本即图表"的特性完美契合敏捷开发的需求:
举个例子,下面这段代码定义了一个最简单的登录场景:
plantuml复制@startuml
:用户: -> (登录系统)
(登录系统) <.. (记住密码) :扩展用例
@enduml
**参与者(Actor)**的三种定义方式:
plantuml复制:普通角色:
actor 正式角色
:带换行\n的角色: as actor1
**用例(Use Case)**的灵活写法:
plantuml复制(基础用例)
usecase 扩展用例 as UC1
(带\n多行描述的用例)
关系表达的箭头语法:
--> 实线箭头(关联)..> 虚线箭头(扩展)--|> 泛化关系实测发现几个易错点:
->而非--,后者在渲染时可能丢失箭头通过skinparam指令可以调整视觉元素:
plantuml复制skinparam actorStyle awesome
skinparam usecase {
BackgroundColor #FFEEEE
BorderColor #FF8888
}
推荐几个实用样式组合:
hollow透明样式在Scrum会议上,我们常遇到这样的用户故事:
"作为会员,我希望能够收藏商品,方便以后查看"
用PlantUML可以立即转化为:
plantuml复制@startuml
:会员: -> (收藏商品)
(收藏商品) --> (查看收藏夹)
@enduml
粒度控制是关键痛点。经过多个项目验证,我总结出"5分钟规则":如果一个用例的实现时间预估不超过5分钟,就应该考虑合并。比如"输入用户名"和"输入密码"应该合并为"登录系统"。
处理包含/扩展关系时,推荐这种写法:
plantuml复制(下单) <|-- (快速下单)
(支付) <.. (使用优惠券) : 扩展
(购物流程) --> (下单)
(购物流程) --> (支付)
特别提醒:
<|--)表示"是一种"关系<..)表示可选行为-->)表示必需步骤在GitLab中建立.puml文件后,配合CI/CD可以实现:
我们团队的标准工作流:
bash复制# 安装plantuml命令行工具
brew install plantuml
# 监控文件变化自动生成
find . -name "*.puml" | entr plantuml -tsvg /_
抛弃PPT改用PlantUML后,我们的评审流程变成:
这种工作方式使需求讨论效率提升约40%,最明显的变化是再也没人抱怨"这和上次说的不一样"。
对于大型系统,包(package)的使用至关重要:
plantuml复制rectangle "支付系统" {
usecase "微信支付" as wx
usecase "支付宝支付" as zfb
}
rectangle "订单系统" {
usecase "创建订单" as create
usecase "取消订单" as cancel
}
:用户: --> create
create .> wx : <<include>>
cancel ..> zfb : 退款
通过组合片段可以描述条件逻辑:
plantuml复制(查询订单) -> (验证权限)
alt 权限不足
(显示错误提示)
else 权限正常
(返回订单详情)
end
这种写法特别适合:
当用例超过20个时,建议:
!include指令组合-tsvg参数获得矢量图性能对比测试显示:
在VSCode中推荐这样配置:
json复制{
"plantuml.server": "https://www.plantuml.com/plantuml",
"plantuml.exportOutDir": "./out",
"plantuml.previewAutoUpdate": true
}
结合Asciidoctor实现文档即代码:
asciidoc复制[plantuml, role="uml-diagram"]
----
include::auth.puml[]
----
这套方案让我们的API文档始终保持100%的图表同步率。
最近完成的物流系统中,我们用PlantUML处理了这样的复杂场景:
plantuml复制package "智能调度" {
(路径规划) <.. (交通管制规避)
(车辆分配) --> (司机匹配)
}
package "异常处理" {
(超时预警) <.. (重新调度)
(货损上报) --> (保险理赔)
}
:调度员: --> (路径规划)
:司机: --> (货损上报)
这个案例展示了如何:
经过三个迭代周期的验证,这套用例图的准确率达到了92%,远超之前用Visio绘制的版本。