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

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

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

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

相关文章

Flutter 中的 RawImage 小部件:全面指南

Flutter 中的 RawImage 小部件&#xff1a;全面指南 Flutter 是一个流行的跨平台 UI 框架&#xff0c;由 Google 开发&#xff0c;它允许开发者使用 Dart 语言构建高性能、美观的应用。在 Flutter 的丰富组件库中&#xff0c;RawImage 是一个低级的图像组件&#xff0c;它允许…

[JS]学习笔记1 -- JAVAScript输入输出+变量

目录 1、组成&#xff1a; 2、书写位置&#xff1a; 2.1 内联JAVAScript&#xff1a; 2.2 内部JAVAScript&#xff1a; 2.3 外部JAVAScript&#xff1a; 3、注释 3.1 单行注释&#xff1a; 3.2 块注释&#xff1a; 4、输入输出语法 4.1 输入&#xff1a; 4.2 输出&a…

怎么用微信小程序实现远程控制空调

怎么用微信小程序实现远程控制空调呢&#xff1f; 本文描述了使用微信小程序调用HTTP接口&#xff0c;实现控制空调&#xff0c;通过不同规格的通断器&#xff0c;来控制不同功率的空调的电源。 可选用产品&#xff1a;可根据实际场景需求&#xff0c;选择对应的规格 序号设备…

最大似然参数估计、贝叶斯参数估计、最小二乘估计与贝叶斯学习的本质区别

最大似然参数估计和贝叶斯参数估计的区别在于最大似然估计认为参数是确定性的量&#xff0c;而贝叶斯估计认为参数是随机变量。之所以命名贝叶斯估计是因为用到了贝叶斯公式。根据贝叶斯公式&#xff0c;从先验概率密度转换到后验概率密度。 统计学中的贝叶斯参数估计是&#x…

python创建项目时关于new conda environment的解释

“New Conda Environment” 指的是创建一个新的 Conda 环境。Conda 是一个开源的跨平台包管理和环境管理系统&#xff0c;它可以帮助用户方便地安装、运行和升级软件包及其依赖关系。特别适用于数据科学、机器学习等领域&#xff0c;因为它对Python及非Python的包管理都有很好的…

three.js能实现啥效果?看过来,这里都是它的菜(16)

不知不觉已经分享16期&#xff0c;在这个过程中得到了很多好朋友的支持&#xff0c;所以我决定坚持分享36期&#xff0c;让大家对three.js有更加直观的认知。

机器学习知识点总结

简介&#xff1a;随着人工智能&#xff08;AI&#xff09;蓬勃发展&#xff0c;也有越来越多的人涌入到这一行业。下面简单介绍一下机器学习的各大领域&#xff0c;机器学习包含深度学习以及强化学习&#xff0c;在本节的机器学习中主要阐述一下机器学习的线性回归逻辑回归&…

数据库讲解---(关系规范化)【二】

目录 前言 一.函数依赖相关 1.1函数依赖集F的逻辑蕴涵 1.2函数依赖集闭包 1.3函数依赖的推理规则 1.3.1独立推理规则 自反律 增广律 传递律 1.3.2其他推理规则 合并规则 分解规则 伪传递规则 二.数据集闭包与F逻辑蕴涵的充要条件 2.1属性集闭包 2.2F逻辑蕴涵的…

【uni-app】申请高德地图key,封装map.js,实现H5、iOS、Android通过getlocation获取地图定位信息

map组件基础使用 <template><view class"contact"><image class"img" :src"formData.headImg"></image><view class"info"><view click"callPhone">联系电话&#xff1a;{{formData.p…

线性代数|机器学习-P6正定和半正定矩阵

文章目录 1. 正定矩阵的判定标准2. 非正定矩阵3. 能量方程3. 正定方程4. 半正定矩阵 1. 正定矩阵的判定标准 目前我们有 5 种方法判断矩阵是否为正定矩阵&#xff1a; 所有的特征值大于零&#xff1a; λ i > 0 \lambda_i>0 λi​>0对于所有的非零向量x&#xff0c;…

Spring AI 第一讲 之 Chat Client API

Chat Client API ChatClient 提供了与人工智能模型通信的流畅 API。它同时支持同步和反应编程模型。 流畅的应用程序接口&#xff08;API&#xff09;提供了一些方法&#xff0c;用于构建作为输入传递给人工智能模型的 "提示"&#xff08;Prompt&#xff09;的各个…

RK3588 AB镜像升级学习(一)

参考资料&#xff1a;Android A/B 系统_洛奇看世界的博客-CSDN博客 一、AB镜像分区 区分了OTA升级镜像的两种方式&#xff1a; 传统的升级方式&#xff1a;设备有Android系统和Recovery系统&#xff0c;如果Android需要升级时&#xff0c;把内容存到cache分区。重启后进入re…

15 条 QA 测试技巧

越来越多的企业开始寻求独立人才来增强或拓展其技术能力。软件开发行业是目前向混合团队转变的关键领域之一。与此同时&#xff0c;自由职业软件质量保证测试人员已成为任何软件开发团队的宝贵补充。 本指南将概述质量保证 (QA) 测试人员的职责以及成为测试人员的实用技巧。 Q…

Diffusers代码学习-Dreambooth

在Diffusers代码中&#xff0c;可以使用train_dreambooth.py脚本进行模型训练。 下载源代码及安装。 在运行脚本之前&#xff0c;请确保从以下源安装库&#xff1a; git clone https://github.com/huggingface/diffusers cd diffusers pip install . 导航到包含train_dr…

P3. 创建个人中心页面

P3. 创建个人中心页面 0 概述Tips1 个人中心页面1.1 创建 Bot 表及 pojo, mapper1.2 实现 Bot 增删改查的 API1.3 实现个人中心页面前端 0 概述 主要介绍了一下添加一个表(类)&#xff0c;及其CRUD的前端和后端的实现方式&#xff0c;介绍的是通用的方法。 后端的CRUD很好写&am…

5 - 无效的推文(高频 SQL 50 题基础版)

5. 无效的推文 知识点&#xff1a;计算字符长度 -- 查询所有无效推文的编号&#xff08;ID&#xff09; -- CHAR_LENGTH() 或 LENGTH() 函数来计算列中字符串的字符数。 -- 这两个函数的区别在于处理非 ASCII 字符时的行为&#xff1a; -- CHAR_LENGTH() 返回字符串的字符数&a…

可能是当下最能打的MCU图形库:LVGL

在讨论图形用户界面&#xff08;GUI&#xff09;库时&#xff0c;很多人会想到emWin、TouchGFX以及QT等。这些库虽然功能强大&#xff0c;但它们普遍存在一个共同的问题&#xff1a;对资源的需求较高&#xff0c;不适用于资源有限的微控制器&#xff08;MCU&#xff09;。有没有…

Spring Boot既打jar包又打war包如何做

你好&#xff0c;我是柳岸花开。 引言 在软件开发中&#xff0c;根据不同的部署需求&#xff0c;我们可能需要将应用打包成不同的格式。Spring Boot作为目前流行的Java应用开发框架&#xff0c;提供了一种简单的方式来打包应用。本文将介绍如何利用Maven Profiles在Spring Boot…

【linux】swap学习

在 Linux 系统中&#xff0c;swap 是一种用于扩展系统内存的技术。当物理内存&#xff08;RAM&#xff09;不足时&#xff0c;系统会将一部分不常用的内存数据移至 swap 空间&#xff0c;从而释放物理内存供其他程序使用。Swap 空间可以是一个单独的分区&#xff08;swap 分区&…

交互规范:苹果 iOS 11 设计规范

文件格式&#xff1a;PDF&#xff08;请与班主任联系获取原型文档&#xff09; 文件名称&#xff1a;苹果 iOS 11 设计规范 文件大小&#xff1a;29.2 MB 文档内容介绍 免费领取资料 添加班主任回复 “210421” 领取