换个思维方式快速上手UML和 plantUML——类图
和大多数朋友一样,Jeffrey 在一开始的时候也十分的厌烦软件工程的一系列东西,对工程化工具十分厌恶,觉得它繁琐,需要记忆很多没有意思的东西。
但是之所以,肯定有是因为。对工程化工具的不理解和不认可主要是基于两个逻辑点:1)对于当下的任务来说,学习成本高,但是收效比较小,即收益小 2)即使学习了,利用空间不足,即应用少
如果要给出能说服自己学习软件工程的原因【也是一开始说服我自己的原因】
1)逐渐接触更大体积的代码,尤其是从零开始接触整体中的一部分业务代码,类的命名方式和方法变量的命名和自己习惯不同等等,导致理解成本高,花费的时间成本高,这个时候软件工程可以派上大用场降低理解成本
2)很多前辈和跟我们说,代码要先想好再写,因为这样可以从全局概览的角度去思考算法和数据存储方式。说的好,但是实现比较难,这个时候,就可以通过一些软件工程工具形象化的整理系统结构和算法步骤
1.换个角度
找了很多UML绘制的工具,但是发现这些工具会增加很大的学习成本,而且对于强迫症的我来说,每次画图都需要把线放的对齐笔直,性格原因又增加了我的使用成本,进而降低了我的使用效率,最终让我与一开始便利书写代码的初衷相违背,进而我选择了使用plantUML一种十分简单的符号语言的方式来绘制UML,学习成本低上手简单
2.UML 类图
使用类图的目的是为了形象化的得到系统中各个类/方法/接口/变量 之间的关系图
2.1类图中的基本元素
不要从学习图的角度去思考类图应该怎么画,从代码的角度出发去思考类图中应该有什么。
对于我的Java系统来说,从语法角度我需要在类图中体现类和它内部实例变量/方法,静态变量/方法,我还要体现类之间的继承和实现接口的关系,这些都应该是我的类图里面需要的。
那么作为一个类图的发明者来说,我就需要把这些东西都用符号表示出来。
首先表示一个类:Class animal,这个图我要把它的变量和方法分开,这样方便我去看:
对于我的变量来说,它有类型,对于我的方法来说,它有参数,有返回值,有返回值的类型和数据的类型,这些我都要体现出来
我的变量和方法还有访问修饰符的限制,这些我也得表示出来
但是一般情况下,取决于UML 的绘制工具不同,我们用简单的键盘符号来表示访问修饰符:
public | private | protected | default |
---|---|---|---|
+ | - | # | ~ |
最后有的时候我想把一些类归类,进而体现它的包,所以我需要把包也体现出来:
最后当然你可以通过手绘制的形式来画UML,而这里我们通过在idea 中plantUML插件的形式来完成,相信优秀的你肯定会插件的下载,就叫这个名,这时候你会发现你的idea 的右边的一列上有plantUml,点开它。
然后找个文件夹,new个txt文件,然后输入以下代码,你就能看到上图啦:
@startuml
package "Entity"{class animal{+isAlive: boolean#gender: int-age: int~race: String+breath(): void}class birdclass dogclass cat
}
@enduml
2.2类图中的关系元素 6个三组
这一块就一个字,麻烦!但是也不麻烦,用几个表,我们简单说明一下,这个地方需要一点点的耐心和记忆力。类类之间的关系从Java的角度来说是什么?继承,还有一种呢?对于接口的实现。
这是第一组:继承和实现,也是最好理解的一组
继承/泛化 | 实现 |
---|---|
一个类是另一个类的具体 | 一个类是另一个类的实现,实现要实现所有方法 |
![]() 空心实线箭头 | ![]() 空心虚线箭头 |
plantUml: 1)class bird extends animal 2)bird --|> animal | plantUml:bird …|> fly |
![]() | ![]() |
第二组:聚合和组合,需要注意两点:两个关系都代表部分和整体的关系,但是组合的程度更深,如果整体不存在,则部分也不存在,而聚合则是整体不存在,部分可以单独存在。比如:头和人就是组合关系,帽子和人就是聚合关系
组合 | 聚合 |
---|---|
部分指向整体,相同生命周期, | 部分指向整体,部分可以单独存在 |
![]() 实心菱形线 | ![]() 空心菱形线 |
plantUml:head --* bird | plantUml:hat --o bird |
![]() | ![]() |
第三组:关联和依赖关系
这两个是比较不容易区分的,但是通常来说关联关系就是一个类的一个实例变量是另一个类,而依赖关系是一个类的某个方法使用另一个类对象作为参数,但是这里要注意的是关联关系里面有双向关联,单向关联,自关联,多重性关联,怎么说?多重性关联就是,一对多,一对1 ,多对多,min对Max,当然其他的关系里面也可以这样表示
关联 | 依赖 |
---|---|
一个类的一个实例变量是另一个类 | 一个类的某个方法使用另一个类对象作为参数 |
![]() 实线实心箭头 | ![]() 虚线实心箭头 |
plantUml: 1)gender --> Student 2)workhouse “1” <–>“n” book | plantUml:空气 …>新陈代谢 |
![]() | ![]() |
以上的内容一定要牢记,多看几遍,记下来就好了
2.3补充语法
如果只有上面的这些内容,其实已经够我们去完成基本UML类图的绘制了,已经搭建起来了基本的类图和用plantUML语言来绘制类图的框架,但是,为了方便我们的使用,补充一部分plantUML语言的语法来使得绘制更加完善:
2.3.1 枚举类
enum Gender{MALE,FEMALE
}
2.3.2 关系上的注释/ 标签
Student --|> human : 继承
2.3.3 其他方式的注释
note left of Student : 这个学生不一般note right of Student : 这个学生不二般note top of Student : 这个学生不三般note bottom of Student : 这个学生不四般
class Student{+int gender
}
note left of Student::gender这是性别
end note
2.3.4 标题
title
这是学生系统类图
end title
2.3.5 加粗/斜体
可以使用Markdown 语法来实现一些文字的变化
title
__这是学生系统类图__
**类图使用2**
end title
但是plantuml 用的是一个只有基本功能的Creole 引擎
2.3.6 图注
caption 图1
3.上手实践
完成了上面的这部分,可以尝试根据图把下面这个图的代码写出来:
先写再看!
@startuml
Class 动物{+有生命 : boolean+繁衍() : void+新陈代谢(空气,水) : void
}
' 关系上的标签
动物 ..> 水:依赖
动物 ..> 空气:依赖class 鸟{+翅膀+下蛋()
}
鸟 --|> 动物:继承
鸟 "1" *-- "2" 翅膀:组合
鸟 ..> 翅膀: 依赖interface 飞翔{+飞()
}
class 大雁 {+飞翔()+下蛋()
}
大雁 --|> 鸟
大雁 ..|> 飞翔class 鸭{+下蛋()
}
鸭 --|> 鸟
class 企鹅{+下蛋()
}
企鹅 --|> 鸟
企鹅 --> 气候class 大雁群{+人字飞()+一字飞()
}
大雁群 o-- 大雁唐老鸭 --|> 鸭
@enduml
本篇关键字:从设计者的角度,图的关系,上手实践
相关文章:

换个思维方式快速上手UML和 plantUML——类图
和大多数朋友一样,Jeffrey 在一开始的时候也十分的厌烦软件工程的一系列东西,对工程化工具十分厌恶,觉得它繁琐,需要记忆很多没有意思的东西。 但是之所以,肯定有是因为。对工程化工具的不理解和不认可主要是基于两个逻…...
策略模式+SpringBoot接口,一个接口实现接收的数据自动分流处理
策略模式 定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。策略模式的精髓就在于将经常变化的一点提取出来,单独变成一类,并且各个类别可以相互替换和组合。 1、策略接口 CalculationStrategy //算数 public interface…...

P1228 地毯填补问题(葬送的芙蓉王【bushi】)
地毯填补问题 题目描述 相传在一个古老的阿拉伯国家里,有一座宫殿。宫殿里有个四四方方的格子迷宫,国王选择驸马的方法非常特殊,也非常简单:公主就站在其中一个方格子上,只要谁能用地毯将除公主站立的地方外的所有地…...
352. 闇の連鎖(树上差分,LCA)
352. 闇の連鎖 - AcWing题库 传说中的暗之连锁被人们称为 Dark。 Dark 是人类内心的黑暗的产物,古今中外的勇者们都试图打倒它。 经过研究,你发现 Dark 呈现无向图的结构,图中有 N 个节点和两类边,一类边被称为主要边ÿ…...
dcat admin + dingo + nginx 开发前台
前言 Dcat Admin 是一个功能强大的后端框架,主要用于开发管理后台。然而,大多数网站不仅需要一个管理后台,还需要一个用户界面,即“前台”,以及它们自己的用户系统。 为了实现这一目标,我们需要对 Dcat A…...

安卓线性布局LinearLayout
<?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:layout_width"match_parent"android:…...

Advanced CNN
文章目录 回顾Google NetInception1*1卷积Inception模块的实现网络构建完整代码 ResNet残差模块 Resedual Block残差网络的简单应用残差实现的代码 练习 回顾 这是一个简单的线性的卷积神经网络 然而有很多更为复杂的卷积神经网络。 Google Net Google Net 也叫Inception V…...

判断当前设备是不是安卓或者IOS?
代码(重要点): 当前文件要是 xxx.js文件,就需要写好代码后调用才会执行: // 判断是不是安卓 const isAndroid () > {return /android/.test(navigator.userAgent.toLowerCase()); }// 判断是不是ios const isIOS () > {return /iphone|ipad|ipod/.test(navigator.use…...
使用C++操作Matlab中的mat文件
matlab提供读写MAT文件的头文件和库函数,下面列出这些文件的路径,其中matlabroot指matlab安装的路径,arch来识别平台架构 头文件在matlabroot\extern\include库函数在matlabroot\bin\win64例程在matlabroot\extern\examples\eng_mat头文件 …...
【OCPP】ocpp1.6协议第3.5章节:本地授权和离线行为-介绍及翻译
目录 3.5章节 概述 3.5 本地鉴权和离线行为-译文(Local Authorization & Offline Behavior) 3.5.1 鉴权缓存-译文(3.5.1. Authorization Cache) 3.5.2 本地鉴权列表-译文(Local Authorization List) 3.5.3 授权缓存和本地授权列表之间的关系-译文(Relation between A…...
OpenGL查询对象 Query Objects
查询对象和异步查询(Query Objects and Asynchronous Queries) Query Objects(查询对象)是OpenGL中的一种机制,用于获取有关一系列GL命令处理过程的信息。这些信息可以包括: 绘图命令处理的图元数量。写入变换反馈缓冲区的图元数…...

【数据分享】1929-2023年全球站点的逐日最高气温数据(Shp\Excel\免费获取)
气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、湿度等指标,其中又以气温指标最为常用!说到气温数据,最详细的气温数据是具体到气象监测站点的气温数据! 之前我们分享过1929-2023年全球气象站…...

Docker深入解析:从基础到实践
Docker基础知识 Docker是什么:定义和核心概念解释 Docker是一个开源项目,它诞生于2013年,旨在自动化应用程序的部署过程, 让应用程序能够在轻量级的、可移植的、自给自足的容器中运行。这些容器可以在几乎任何机器上运行…...

【鸿蒙】大模型对话应用(一):大模型接口对接与调试
Demo介绍 本demo对接阿里云和百度的大模型API,实现一个简单的对话应用。 DecEco Studio版本:DevEco Studio 3.1.1 Release HarmonyOS API版本:API9 关键点:ArkTS、ArkUI、UIAbility、网络http请求、列表布局 官方接口文档 此…...
SQL的函数类型
目录 一、聚合函数 二、数值型函数 三、字符串函数 四、日期函数 五、流程控制函数 一、聚合函数 定义:聚合函数是指对一组值进行运算,最终返回是单个值,也可以被称为组合函数。 COUNT() 统计目标行数量的函数 AVG() 求平均值 SU…...

TSINGSEE青犀视频智慧电梯管理平台,执行精准管理、提升乘梯安全
一、方案背景 随着城市化进程的不断加快,我国已经成为全球最大的电梯生产和消费市场,电梯也成为人们日常生活中不可或缺的一部分。随着电梯数量的激增,电梯老龄化,维保数据不透明,物业管理成本高,政府监管…...
VMware:在部分链上无法执行所调用的函数,请打开父虚拟磁
VMware:在部分链上无法执行所调用的函数,请打开父虚拟磁 问题:VMware给虚拟机扩展硬盘容量,提示:在部分链上无法执行所调用的函数,请打开父虚拟磁。原因:是因为你的虚拟磁盘文件是分多个文件存储的…...

【数据结构 08】红黑树
一、概述 红黑树,是一种二叉搜索树,每一个节点上有一个存储位表示节点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个节点着色方式的限制,红黑树确保没有一条路径会比其他路径长上两倍,因而是接进…...

【百度Apollo】自动驾驶规划技术:实现安全高效的智能驾驶
🎬 鸽芷咕:个人主页 🔥 个人专栏:《linux深造日志》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! ⛳️ 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下…...

《C程序设计》上机实验报告(五)之一维数组二维数组与字符数组
实验内容: 1.运行程序 #include <stdio.h> void main( ) { int i,j,iRow0,iCol0,m; int x[3][4]{{1,11,22,33},{2,28,98,38},{3,85,20,89}}; mx[0][0]; for(i0;i<3;i) for(j0;j<4;j) if (x[i][j]>m) { mx[i][j]; iRowi…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...

论文阅读:Matting by Generation
今天介绍一篇关于 matting 抠图的文章,抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法,已经有很多的工作和这个任务相关。这两年 diffusion 模型很火,大家又开始用 diffusion 模型做各种 CV 任务了&am…...

轻量级Docker管理工具Docker Switchboard
简介 什么是 Docker Switchboard ? Docker Switchboard 是一个轻量级的 Web 应用程序,用于管理 Docker 容器。它提供了一个干净、用户友好的界面来启动、停止和监控主机上运行的容器,使其成为本地开发、家庭实验室或小型服务器设置的理想选择…...
简单介绍C++中 string与wstring
在C中,string和wstring是两种用于处理不同字符编码的字符串类型,分别基于char和wchar_t字符类型。以下是它们的详细说明和对比: 1. 基础定义 string 类型:std::string 字符类型:char(通常为8位)…...

vxe-table vue 表格复选框多选数据,实现快捷键 Shift 批量选择功能
vxe-table vue 表格复选框多选数据,实现快捷键 Shift 批量选择功能 查看官网:https://vxetable.cn 效果 代码 通过 checkbox-config.isShift 启用批量选中,启用后按住快捷键和鼠标批量选取 <template><div><vxe-grid v-bind"gri…...