往期本博主的 C++ 精讲优质博文可通过这篇导航进行查找:
Lemo 的C++精华博文导航:进阶、精讲、设计模式文章全收录
前言
在编写程序时,可视化的工具可以极大地帮助我们理解和设计复杂的系统。对于C++程序员来说,一个强大的工具是UML(统一建模语言)。PlantUML是一个流行的工具,可以帮助我们用文本来生成UML图。本文将讨论如何使用PlantUML来创建C++程序的UML类和关系图。
文章目录
- 前言
- PlantUML 简要介绍
- 用 PlantUML 绘制 C++ UML 图的优势
- 如何用 PlantUML 绘制 C++ UML 图
- PlantUML 基础文件格式的描述
- 类定义的描述
- 类的成员变量描述
- 抽象与静态成员描述
- 类的关系描述
- 类间连接线和箭头的描述
- 类间箭头方向指定的描述
- 类成员的链接关系描述
- 总结
PlantUML 简要介绍
PlantUML 是一个开源工具,它让你用简洁的文本描述来生成 UML 图。PlantUML 广泛用于绘制各种类型的 UML 图,包括时序图、用例图、类图、活动图、组件图等。通过简单的文本命令,我们可以创建复杂的图表,使用起来非常方便。
用 PlantUML 绘制 C++ UML 图的优势
选择使用PlantUML来绘制C++的UML图相对于其他 UML 绘图工具有几个显著优势:
-
文本到图形的转换: PlantUML 的核心优势在于其使用简单的文本描述来生成 UML 图。这种方式相对于传统的拖拽界面,可以快速精确地创建和修改 UML 图。特别是对于软件开发人员而言,直接编写或修改代码形式的文本可能更加自然和高效。
-
版本控制友好: 由于 PlantUML 使用文本文件来生成图形,这使得 UML 图可以像源代码一样被版本控制。这意味着 UML 图的每次更改都可以被跟踪和回退,极大地提高了团队协作和项目维护的能力。
-
易于集成和自动化: PlantUML 可以轻松集成到许多开发工具和 IDE 中,并且可以通过命令行工具自动化生成图形。这使得它非常适合持续集成(CI)流程,能够自动化地生成和更新 UML 图,保持文档与代码的同步。
-
开源且跨平台: PlantUML是一个开源项目,支持跨多个平台运行。这使得它对于不同开发环境的用户来说是一个无缝的选择,无论他们使用的是Windows,macOS,还是Linux系统。
除了上述提到的这 4 点,PlantUML 在泛编程语言方面都能够支持广泛的UML图类型;并且由于其语法的简单直接,开发者在使用时,上手也快;同时它是通过文本形式编写,在传播和交流上面,较图片也更便捷。
可以说 PlantUML 为 C++ 开发者提供了一个高效、灵活、协作友好的方式来创建和维护UML图,这些特性使得它在众多UML工具中脱颖而出,适用于快节奏和持续变化的软件开发项目。
说了这么多好处,我们再来看下如何去用它绘制 C++ UML 图。
如何用 PlantUML 绘制 C++ UML 图
让我们来看一下用PlantUML绘制UML类图的实际过程。
PlantUML 基础文件格式的描述
@startuml
…
…
…
@enduml
基本上每个 PlantUML 文件的基本格式都是如上所示:
- 文件头需要
@startuml
- 结束需要
@enduml
- 可以写
@startuml name
来指定 uml 图的名字
类定义的描述
结构如下:
@startuml
class classType1<<somethingCanBeDeleted>>{
int a
{field}int aa
double&function()
{method} func2
const character*whatever[]}
interface I22
@enduml
生成图如下:
class 的声明可替换为以下元素声明:
至于,类变量和类方法可使用小括号()
区分,也可以用{field}
声明变量,{method}
声明方法。
类的成员变量描述
结构如下:
@startuml
class classType1<<somethingCanBeDeleted>>{
+int a
~double&b
#const character*whatever[]
}
interface I22
@enduml
生成的图如下:
说明:
抽象与静态成员描述
结构如下:
@startuml
class classType1<<somethingCanBeDeleted>>{
{abstract}+int a
#{static}double&b
~const character*whatever[]
}
@enduml
生成的图如下:
说明:
- 抽象的成员(变量/函数)用斜体标识
- 静态的成员(变量/函数)用下划线标识
类的关系描述
结构如下:
@startuml
classType1 --|> 泛化:一般到特殊的关系
classType1 --o 聚合:整体和部分,部分可单独存在
classType1 --* 组合:整体和部分,部分不能单独存在
class classType1 implements List
class classType1 extends AsbtractClass
@enduml
生成的图如下:
说明:
plantUML里指定了泛化,聚合,组合三种类间关系。此外,还提供了实现(implements
),继承(extends
)
若无特殊声明, implements
指向的自动推断为interface
,extends
指向的推断与原元素相同
类间连接线和箭头的描述
结构如下:
@startuml
class1 --> class2
class1 --o class3:这里写冒号对链接加注释
class2 ..> class3
class4 +-- class2
class4 --* class5
class5 -- class2
class5 <--> "这里写引号添加注释" class3
@enduml
生成的图:
说明:
- 连接关系最后添加
:
,可在连接线中断添加注释 - 连接关系两头添加引号,则在两头添加注释
类间箭头方向指定的描述
结构如下:
@startuml
class1 -right-> class2
class1 --o class3
class2 .down.> class3
class4 +-down- class2
class4 -* class5
class5 -left- class2
class5 <--> class3
@enduml
生成的图如下:
说明:
- 用right,up,down,left来建议箭头的方向(可能被覆盖)
- 实际上,双破折号–>默认为垂直方向,单破折号->默认为水平方向
类成员的链接关系描述
结构如下:
@startuml
class class1{
const int64*mp[]
double k
}
class class2
class class3{
member1
}
class1::mp -left-> class2:指向一个类
class1::k -right-> class3::member1:指向类内成员
@enduml
生成的图如下:
说明:
- 在声明完类的成员变量后,单独指定成员的链接关系。
- 指定
class1
的const int64*mp[]
成员时,用::
声明来自class1
,而后可直接使用mp
。 - 指向对象可以是类,也可以是类的成员。
总结
通过使用PlantUML,C++开发者可以高效地创建和维护他们代码的UML图。这不仅帮助他们理解现有的代码基础,还能帮助新的开发者快速上手项目。
期望本文在帮助开发者在用 PlantUML 构建C++ UML 时,能有所帮助。
如果有疑惑的地方,欢迎私信交流。