用PlantUML描绘C++世界:通过文本描述精准控制UML图的生成

往期本博主的 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 绘图工具有几个显著优势:

  1. 文本到图形的转换: PlantUML 的核心优势在于其使用简单的文本描述来生成 UML 图。这种方式相对于传统的拖拽界面,可以快速精确地创建和修改 UML 图。特别是对于软件开发人员而言,直接编写或修改代码形式的文本可能更加自然和高效。

  2. 版本控制友好: 由于 PlantUML 使用文本文件来生成图形,这使得 UML 图可以像源代码一样被版本控制。这意味着 UML 图的每次更改都可以被跟踪和回退,极大地提高了团队协作和项目维护的能力。

  3. 易于集成和自动化: PlantUML 可以轻松集成到许多开发工具和 IDE 中,并且可以通过命令行工具自动化生成图形。这使得它非常适合持续集成(CI)流程,能够自动化地生成和更新 UML 图,保持文档与代码的同步。

  4. 开源且跨平台: 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指向的自动推断为interfaceextends指向的推断与原元素相同

类间连接线和箭头的描述

结构如下:

@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

生成的图如下:
在这里插入图片描述
说明:

  • 在声明完类的成员变量后,单独指定成员的链接关系。
  • 指定class1const int64*mp[]成员时,用::声明来自class1,而后可直接使用mp
  • 指向对象可以是类,也可以是类的成员。

总结

通过使用PlantUML,C++开发者可以高效地创建和维护他们代码的UML图。这不仅帮助他们理解现有的代码基础,还能帮助新的开发者快速上手项目。

期望本文在帮助开发者在用 PlantUML 构建C++ UML 时,能有所帮助。

如果有疑惑的地方,欢迎私信交流。

相关推荐

  1. UML

    2024-06-11 19:42:03       9 阅读
  2. 深度学习与图像描述生成——看说话(3)

    2024-06-11 19:42:03       29 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-11 19:42:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-11 19:42:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-11 19:42:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-11 19:42:03       20 阅读

热门阅读

  1. WPF用C#代码实现设置Border颜色的渐变

    2024-06-11 19:42:03       9 阅读
  2. VSFTP虚拟用户访问-设置

    2024-06-11 19:42:03       8 阅读
  3. 用链表实现的C语言队列

    2024-06-11 19:42:03       7 阅读
  4. 【React】dayjs -- 格式化时间 的使用

    2024-06-11 19:42:03       8 阅读
  5. 作文美文2段

    2024-06-11 19:42:03       7 阅读
  6. Linux网络服务

    2024-06-11 19:42:03       7 阅读
  7. vue面试题十二

    2024-06-11 19:42:03       9 阅读
  8. 2024.6.7 刷题总结

    2024-06-11 19:42:03       7 阅读
  9. 二层三层转发原理【小白总结版】

    2024-06-11 19:42:03       7 阅读
  10. Pyskl:搭建使用(win)

    2024-06-11 19:42:03       5 阅读
  11. GO——泛型

    2024-06-11 19:42:03       4 阅读
  12. 编程基础-算法研究-算法题

    2024-06-11 19:42:03       6 阅读
  13. Jtti:解决服务器应用服务迟缓的步骤和方法

    2024-06-11 19:42:03       9 阅读
  14. uniapp,微信小程序,在map组件外与中的代码区别

    2024-06-11 19:42:03       8 阅读