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

news2024/11/29 2:52:10

往期本博主的 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 时,能有所帮助。

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM学习-MAT

MAT(Memory Analyzer Tool) 基本概述 Java堆内存分析器&#xff0c;可以用于查找内存泄漏以及查看内存消耗情况MAT是基于Eclipse开发的&#xff0c;不仅可以单独使用&#xff0c;还能以插件方式嵌入Eclipse中使用&#xff0c;是一款免费的性能分析工具 获取堆dump文件 dump…

Edge浏览器十大常见问题,一次性解决!

Edge曾被称为最好用的浏览器&#xff0c;拳打Chrome脚踢firefox, 可如今却隐藏着像是播放卡顿、下载缓慢、广告繁多等诸多问题&#xff0c;不知道各位还在用吗&#xff1f; 今天小编收集整理了Edge浏览器十大烦人问题&#xff0c;并提供简单有效的解决办法&#xff0c;让你的E…

65. UE5 RPG 实现远程攻击

前面&#xff0c;我们实现了敌人的近战普通攻击&#xff0c;还兼容了对于没有武器的敌人的攻击。有近战就要有远程&#xff0c;这一篇&#xff0c;我们实现一下敌人的远程攻击。 首先&#xff0c;由于创建的资源增多&#xff0c;我们将GA和GE按敌人和英雄的类别分开&#xff0c…

MPC控制简化版

MPC控制算法简化版 模型预测控制&#xff08;Model Predictive Control&#xff0c;MPC&#xff09;是一种先进的控制策略&#xff0c;广泛应用于人形机器人的运动控制。具体实现过程中&#xff0c;还需结合机器人的实际动力学模型和更多的物理约束条件。以下是一个人形机器人…

基本 MOSFET 恒流源

恒流源在电路分析练习和网络定理中占有重要地位&#xff0c;然后它们似乎或多或少消失了。。。除非你是IC设计师。尽管在典型 PCB 设计中很少遇到&#xff0c;但电流源在模拟 IC 领域却无处不在。这是因为它们 1) 用于偏置&#xff0c;2) 作为有源负载。 偏置&#xff1a; 用作…

【SkyWalking】启用apm-trace-ignore-plugin追踪忽略插件

背景 使用Agent采集追踪数据的时候&#xff0c;想排除某些路径&#xff0c;比如健康检查等&#xff0c;这样可以减少上报的数据&#xff0c;也可以去除一些不必要的干扰数据。 加载插件 在agent/optional-plugins目录中有个apm-trace-ignore-plugin-${version}.jar插件&…

Hive on Spark版本兼容性

Hive on Spark仅在特定版本的Spark上进行测试&#xff0c;因此给定版本的Hive只能保证与特定版本的Spark一起工作。其他版本的Spark可能与给定版本的Hive一起工作&#xff0c;但不能保证。以下是Hive版本及其对应的Spark版本列表&#xff1a; 详情参考官方文档&#xff1a;http…

C# 异步方法async / await 任务超时处理

一、需求 如果调用一个异步方法后&#xff0c;一直不给返回值结果怎么办呢&#xff1f;这就涉及到怎么取消任务了。 二、Task取消任务 static CancellationTokenSource source new CancellationTokenSource();static void Main(string[] args){Task.Run(() >{for (int i …

C# WPF入门学习主线篇(十)—— DataGrid常见属性和事件

C# WPF入门学习主线篇&#xff08;十&#xff09;—— DataGrid常见属性和事件 欢迎来到C# WPF入门学习系列的第十篇。在前面的文章中&#xff0c;我们已经学习了 Button、TextBox、Label、ListBox 和 ComboBox 控件。今天&#xff0c;我们将探讨 WPF 中的另一个重要控件——D…

CHATGPT升级plus(已有账号前提下)

注册wildcard(虚拟卡) 注册号账号后先进行充值&#xff0c;充值后选择CHATGPT一键升级按照他的流程来即可 Wildcard网址&#xff1a;Wildcard跳转注册 填写邀请码充值时少两美金合计14&#xffe5; 邀请码&#xff1a;OL3QXTRH

Adobe Illustrator 矢量图设计软件下载安装,Illustrator 轻松创建各种矢量图形

Adobe Illustrator&#xff0c;它不仅仅是一个简单的图形编辑工具&#xff0c;更是一个拥有丰富功能和强大性能的设计利器。 在这款软件中&#xff0c;用户可以通过各种精心设计的工具&#xff0c;轻松创建和编辑基于矢量路径的图形文件。这些矢量图形不仅具有高度的可编辑性&a…

Codeforces Round 951 (Div. 2)

A - Guess the Maximum 直接暴力枚举 a i , a i 1 a_i,a_{i1} ai​,ai1​找最小的最大值 答案即为最小的最大值-1 code: #include<bits/stdc.h> #define endl \n #define fast() ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr) #define F first #…

skywalking学习

文章目录 前言一、skywalking单体安装部署1. 下载skywalking2. 部署oap和oap-ui服务3. 测试skywalking监控springboot应用 二、搭建swck(skywalking集群)1.安装k8s2.下载swck3.设置pod自动注入java agent 三、skywalking监控python四、skywalking监控cpp总结参考 前言 本文主要…

RTKLIB之RTKPLOT画图工具

开源工具RTKLIB在业内如雷贯耳&#xff0c;其中的RTKPLOT最近正在学习&#xff0c;发现其功能之强大&#xff0c;前所未见&#xff0c;打开了新的思路。 使用思博伦GSS7000卫星导航模拟器,PosApp软件仿真一个载具位置 1&#xff0c;RTKPLOT支持DUT 串口直接输出的NMEA数据并…

HCL模拟器下做M-LAG测试(以及和华为配置对比)-二层架构

1.简单二层架构 1.1 拓扑图 1.2 配置 1.2.1 Leaf1配置 system-mac必须配置&#xff0c;否则会有一个node处于unknown状态&#xff0c;即使配置主节点的mac&#xff0c;主节点也需要配置system-mac为自己的mac ## M-LAG配置[Leaf1] m-lag system-mac 0001-0001-0001 # 手动设…

MFC 教程-回车时窗口退出问题

【问题描述】 MFC窗口默认时&#xff0c;按回车窗口会退出 【原因分析】 默认调用OnOK() 【解决办法】 重写虚函PreTranslateMessage BOOL CTESTMFCDlg::PreTranslateMessage(MSG* pMsg) {// TODO: 在此添加专用代码和/或调用基类// 修改回车键的操作反应 if (pMsg->…

物理安全防护如何创新强化信息安全体系?

物理安全防护是信息安全体系的重要组成部分&#xff0c;它通过保护实体设施、设备和介质等&#xff0c;防止未授权访问、破坏、盗窃等行为&#xff0c;从而为信息系统提供基础的安全保障。要创新强化信息安全体系中的物理安全防护&#xff0c;可以从以下几个方面着手&#xff1…

企业数字化转型的测度难题:基于大语言模型的新方法与新发现

《经济研究》新文章《企业数字化转型的测度难题&#xff1a;基于大语言模型的新方法与新发现》运用机器学习和大语言模型构造一套新的企业数字化转型指标。理论分析和数据交叉验证均表明&#xff0c;构建的指标相对已有方法更准确&#xff1a; 1.第一步&#xff1a;选择“管理…

Redis常用命令——List篇

提到List&#xff0c;我们第一时间想到的就是链表。但是在Redis中&#xff0c;List更像是一种双端队列&#xff0c;例如C中的deque。它可以快速高效的对头部和尾部进行插入和删除操作。本片文章主要对List列表的相关命令进行详解&#xff0c;希望本篇文章会对你有所帮助。 文章…

js--hasOwnProperty()讲解与使用

@TOC 前言 hasOwnProperty(propertyName)方法 是用来检测属性是否为对象的自有属性 object.hasOwnProperty(propertyName) // true/false 讲解 hasOwnProperty() 方法是 Object 的原型方法(也称实例方法),它定义在 Object.prototype 对象之上,所有 Object 的实例对象都会继…