用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 时,能有所帮助。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/679998.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

10_JavaWeb过滤器

文章目录 过滤器1.过滤器的实现1.1 实现过滤器1.2 配置过滤器1.2.1 过滤器的xml方式1.2.2 过滤器的注解方式 2. 过滤器的生命周期3. 过滤器链使用 过滤器 生活举例: 公司前台,停车场安保,地铁验票闸机 java中过滤仅仅是对请求做出过滤 客户端向服务器发出请求&#xff0c;在服…

SQLServer 查询指定数据库名和表名及表结构等

查询当前数据库中所有表名&#xff0c;不用指定数据库&#xff0c;选中某数据库直接执行SQL就好 -- U:所有用户表名; S:所有系统表名;V:所有视图表名 SELECT name FROM sysobjects WHERE xtypeU OR xtypeS OR xtypeV 查询指定数据库数据库中所有表名&#xff0c; SELECT TAB…

【排序算法】归并排序

一、定义&#xff1a; &#x1f449;归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff…

精益求精测径仪颜色也是一种工艺细节

首先&#xff0c;测径仪的颜色可以作为一种视觉标识&#xff0c;提升工作效率。在复杂的生产环境中&#xff0c;不同颜色的测径仪可以迅速区分不同型号、规格或功能的设备&#xff0c;减少误操作的可能性。同时&#xff0c;通过颜色搭配&#xff0c;还可以实现设备布局的美观与…

[数据集][图像分类]煤矿分类数据集351张4类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;351 分类类别数&#xff1a;4 类别名称:[“Anthracite”,“Bituminous”,“…

Qt应用程序发布

一、静态编译发布 1.0:以Release模式构建工程 1.1:查看当前构建生成路径,并将所生成的.exe单独拷贝出来 1.2:将可执行文件*.exe拷贝至任一目标文件夹:D:\Temporary\QQIF 2:查看安装Qt时发布工具windeployqt.exe所在的目录 windeployqt.exe在Qt开发套件的bin目录下。Qt的每…

一个可以自动生成随机区组试验的excel VBA小程序

在作物品种区域试验时&#xff0c;通常会采用随机区组试验设计&#xff0c;特制作了一个可以自动生成随机区组试验的小程序。excel参数界面如下&#xff1a; 参数含义如下&#xff1a; 1、生成新表的名称&#xff1a;程序将新建表格&#xff0c;用于生成随机区组试验。若此处为…

JavaScript 从入门到精通Object(对象)

文章目录 对象文本和属性方括号计算属性 属性值简写属性名称限制属性存在性测试&#xff0c;“in” 操作符“for…in” 循环像对象一样排序 总结✅任务你好&#xff0c;对象检查空对象对象属性求和将数值属性值都乘以 2 对象引用和复制通过引用来比较克隆与合并&#xff0c;Obj…

消息队列-ActiveMQ

异步技术 企业级应用中广泛使用的三种异步消息传递技术 版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。原文链接&#xff1a;https://blog.csdn.net/qq_55917018/article/details/122122218 三…

创建 MFC DLL-使用关键字_declspec(dllexport)

本文仅供学习交流&#xff0c;严禁用于商业用途&#xff0c;如本文涉及侵权请及时联系本人将于及时删除 从MFC DLL中导出函数的另一种方法是在定义函数时使用关键字_declspec(dllexport)。这种情况下&#xff0c;不需要DEF文件。 导出函数的形式为&#xff1a; declspec(dll…

libsystemctlm-soc项目分析

概述 libsystemctlm-soc项目是Xilinx的SystemC库。 环境安装 verilator安装 # Prerequisites: #sudo apt-get install git help2man perl python3 make autoconf g flex bison ccache #sudo apt-get install libgoogle-perftools-dev numactl perl-doc #sudo apt-get insta…

调用讯飞星火API实现图像生成

目录 1. 作者介绍2. 关于理论方面的知识介绍3. 关于实验过程的介绍&#xff0c;完整实验代码&#xff0c;测试结果3.1 API获取3.2 代码解析与运行结果3.2.1 完整代码3.2.2 运行结果 3.3 界面的编写&#xff08;进阶&#xff09; 4. 问题分析5. 参考链接 1. 作者介绍 刘来顺&am…

VL53L4CX TOF开发(2)----修改测距范围及测量频率

VL53L4CX TOF开发.2--修改测距范围及测量频率 概述视频教学样品申请完整代码下载测距范围测量频率硬件准备技术规格系统框图应用示意图生成STM32CUBEMX选择MCU串口配置IIC配置 XSHUTGPIO1X-CUBE-TOF1app_tof.c详细解释测量频率修改修改测距范围 概述 最近在弄ST和瑞萨RA的课程…

前端开发入门指南:掌握网页设计的第一课

UI设计与前端开发是相辅相成&#xff0c;UI设计可以视觉美化产品界面&#xff0c;而前端开发可以通过代码实现设计稿。作为UI设计师&#xff0c;如果画出来的图片美观方便对前端开发者非常有益。如果设计复比较难以实现&#xff0c;沟通就会变得更加困难。因此&#xff0c;UI设…

html+CSS+js部分基础运用14

熟悉插值{{}}的用法&#xff0c;在页面中显示下列内容。图1 插值语法的效果图 在页面中统计鼠标单机按钮的次数。【提示&#xff1a;v-on指令】&#xff0c;页面效果如下图所示&#xff1a;图2 统计效果图 3、①单击按钮可以修改黑体字。②通过调试工具vue-devtools修改黑体字。…

数据结构:并查集

数据结构&#xff1a;并查集 题目描述参考代码 题目描述 输入样例 5 5 C 1 2 Q1 1 2 Q2 1 C 2 5 Q2 5输出样例 Yes 2 3参考代码 #include <iostream>using namespace std;const int N 100010;int n, m; int p[N], sz[N];int find(int x) // 返回x的祖宗节点 路径…

AI网络爬虫:用GraphQL查询爬取动态网页数据

任务&#xff1a;爬取网站www.skillshare.com搜索结果页面数据&#xff1a; 查看网站的请求信息&#xff1a; 请求网址: https://www.skillshare.com/api/graphql 请求方法: POST 状态代码: 200 OK 远程地址: 127.0.0.1:10809 引荐来源网址政策: strict-origin-when-…

Go 群发邮件Redis 实现邮件群发

一、安装 go get github.com/go-redis/redis/v8 go get gopkg.in/gomail.v2 二、使用"gopkg.in/gomail.v2"群发 package mainimport (gomail "gopkg.in/gomail.v2" )func main() {// 邮件内容m : gomail.NewMessage()m.SetHeader("From", &qu…

实验11 OSPF协议配置

实验11 OSPF协议配置 一、OSPF单区域配置&#xff08;一&#xff09;原理描述&#xff08;二&#xff09;实验目的&#xff08;三&#xff09;实验内容&#xff08;四&#xff09;实验配置&#xff08;五&#xff09;实验步骤 二、OSPF多区域配置&#xff08;一&#xff09;原理…

44-5 waf绕过 - SQL注入绕WAF方法

环境准备: 43-5 waf绕过 - 安全狗简介及安装-CSDN博客然后安装sqlilabs靶场:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 一、双写绕过 打开sql靶场的第一关:http://127.0.0.1/sqli-labs-master/Less-1/?id=1 验证一下waf是否开启防…