换个思维方式快速上手UML和 plantUML——类图

2024-01-29 14:04

本文主要是介绍换个思维方式快速上手UML和 plantUML——类图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

和大多数朋友一样,Jeffrey 在一开始的时候也十分的厌烦软件工程的一系列东西,对工程化工具十分厌恶,觉得它繁琐,需要记忆很多没有意思的东西。

但是之所以,肯定有是因为。对工程化工具的不理解和不认可主要是基于两个逻辑点:1)对于当下的任务来说,学习成本高,但是收效比较小,即收益小 2)即使学习了,利用空间不足,即应用少

如果要给出能说服自己学习软件工程的原因【也是一开始说服我自己的原因】

1)逐渐接触更大体积的代码,尤其是从零开始接触整体中的一部分业务代码,类的命名方式和方法变量的命名和自己习惯不同等等,导致理解成本高,花费的时间成本高,这个时候软件工程可以派上大用场降低理解成本

2)很多前辈和跟我们说,代码要先想好再写,因为这样可以从全局概览的角度去思考算法和数据存储方式。说的好,但是实现比较难,这个时候,就可以通过一些软件工程工具形象化的整理系统结构和算法步骤

image-20240128002807724

1.换个角度

找了很多UML绘制的工具,但是发现这些工具会增加很大的学习成本,而且对于强迫症的我来说,每次画图都需要把线放的对齐笔直,性格原因又增加了我的使用成本,进而降低了我的使用效率,最终让我与一开始便利书写代码的初衷相违背,进而我选择了使用plantUML一种十分简单的符号语言的方式来绘制UML,学习成本低上手简单

2.UML 类图

使用类图的目的是为了形象化的得到系统中各个类/方法/接口/变量 之间的关系图

2.1类图中的基本元素

不要从学习图的角度去思考类图应该怎么画,从代码的角度出发去思考类图中应该有什么

对于我的Java系统来说,从语法角度我需要在类图中体现类和它内部实例变量/方法,静态变量/方法,我还要体现类之间的继承和实现接口的关系,这些都应该是我的类图里面需要的。

那么作为一个类图的发明者来说,我就需要把这些东西都用符号表示出来。

首先表示一个类:Class animal,这个图我要把它的变量和方法分开,这样方便我去看:

image-20240127220203460

对于我的变量来说,它有类型,对于我的方法来说,它有参数,有返回值,有返回值的类型和数据的类型,这些我都要体现出来

image-20240127220525153

我的变量和方法还有访问修饰符的限制,这些我也得表示出来

image-20240127220934818

但是一般情况下,取决于UML 的绘制工具不同,我们用简单的键盘符号来表示访问修饰符:

publicprivateprotecteddefault
+-#~

最后有的时候我想把一些类归类,进而体现它的包,所以我需要把包也体现出来:

image-20240127221410975

最后当然你可以通过手绘制的形式来画UML,而这里我们通过在idea 中plantUML插件的形式来完成,相信优秀的你肯定会插件的下载,就叫这个名,这时候你会发现你的idea 的右边的一列上有plantUml,点开它。

image-20240127221641994

然后找个文件夹,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的角度来说是什么?继承,还有一种呢?对于接口的实现。

这是第一组:继承和实现,也是最好理解的一组

继承/泛化实现
一个类是另一个类的具体一个类是另一个类的实现,实现要实现所有方法
image-20240127230620897
空心实线箭头
image-20240127230633376
空心虚线箭头
plantUml:
1)class bird extends animal
2)bird --|> animal
plantUml:bird …|> fly
image-20240127231302080image-20240127231324445

第二组:聚合和组合,需要注意两点:两个关系都代表部分和整体的关系,但是组合的程度更深,如果整体不存在,则部分也不存在,而聚合则是整体不存在,部分可以单独存在。比如:头和人就是组合关系,帽子和人就是聚合关系

组合聚合
部分指向整体,相同生命周期,部分指向整体,部分可以单独存在
image-20240127231923712
实心菱形线
image-20240127231953735
空心菱形线
plantUml:head --* birdplantUml:hat --o bird
image-20240127232346958image-20240127232404420

第三组:关联和依赖关系

这两个是比较不容易区分的,但是通常来说关联关系就是一个类的一个实例变量是另一个类,而依赖关系是一个类的某个方法使用另一个类对象作为参数,但是这里要注意的是关联关系里面有双向关联,单向关联,自关联,多重性关联,怎么说?多重性关联就是,一对多,一对1 ,多对多,min对Max,当然其他的关系里面也可以这样表示

关联依赖
一个类的一个实例变量是另一个类一个类的某个方法使用另一个类对象作为参数
image-20240127234133241
实线实心箭头
image-20240127234206875
虚线实心箭头
plantUml:
1)gender --> Student
2)workhouse “1” <–>“n” book
plantUml:空气 …>新陈代谢
image-20240127234445729image-20240127234454931

以上的内容一定要牢记,多看几遍,记下来就好了

2.3补充语法

如果只有上面的这些内容,其实已经够我们去完成基本UML类图的绘制了,已经搭建起来了基本的类图和用plantUML语言来绘制类图的框架,但是,为了方便我们的使用,补充一部分plantUML语言的语法来使得绘制更加完善:

2.3.1 枚举类
enum Gender{MALE,FEMALE
}

image-20240127235204408

2.3.2 关系上的注释/ 标签
Student --|> human : 继承

image-20240127235335955

2.3.3 其他方式的注释
note left of Student : 这个学生不一般note right of Student : 这个学生不二般note top of Student : 这个学生不三般note bottom of Student : 这个学生不四般

image-20240127235902389

class Student{+int gender
}
note left of Student::gender这是性别
end note

image-20240128000044636

2.3.4 标题
title
这是学生系统类图
end title

image-20240128000233025

2.3.5 加粗/斜体

可以使用Markdown 语法来实现一些文字的变化

title
__这是学生系统类图__
**类图使用2**
end title

但是plantuml 用的是一个只有基本功能的Creole 引擎

2.3.6 图注
caption 图1

image-20240128000830591

3.上手实践

完成了上面的这部分,可以尝试根据图把下面这个图的代码写出来:

image-20240128002727674

先写再看!

@startuml
Class 动物{+有生命 : boolean+繁衍() : void+新陈代谢(空气,水) : void
}
' 关系上的标签
动物 ..> 水:依赖
动物 ..> 空气:依赖class 鸟{+翅膀+下蛋()
}
鸟 --|> 动物:继承
鸟 "1" *-- "2" 翅膀:组合
鸟 ..> 翅膀: 依赖interface 飞翔{+飞()
}
class 大雁 {+飞翔()+下蛋()
}
大雁 --|> 鸟
大雁 ..|> 飞翔class 鸭{+下蛋()
}
鸭 --|> 鸟
class 企鹅{+下蛋()
}
企鹅 --|> 鸟
企鹅 --> 气候class 大雁群{+人字飞()+一字飞()
}
大雁群 o-- 大雁唐老鸭 --|> 鸭
@enduml

本篇关键字:从设计者的角度,图的关系,上手实践

这篇关于换个思维方式快速上手UML和 plantUML——类图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/657157

相关文章

电脑桌面文件删除了怎么找回来?别急,快速恢复攻略在此

在日常使用电脑的过程中,我们经常会遇到这样的情况:一不小心,桌面上的某个重要文件被删除了。这时,大多数人可能会感到惊慌失措,不知所措。 其实,不必过于担心,因为有很多方法可以帮助我们找回被删除的桌面文件。下面,就让我们一起来了解一下这些恢复桌面文件的方法吧。 一、使用撤销操作 如果我们刚刚删除了桌面上的文件,并且还没有进行其他操作,那么可以尝试使用撤销操作来恢复文件。在键盘上同时按下“C

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

用命令行的方式启动.netcore webapi

用命令行的方式启动.netcore web项目 进入指定的项目文件夹,比如我发布后的代码放在下面文件夹中 在此地址栏中输入“cmd”,打开命令提示符,进入到发布代码目录 命令行启动.netcore项目的命令为:  dotnet 项目启动文件.dll --urls="http://*:对外端口" --ip="本机ip" --port=项目内部端口 例: dotnet Imagine.M

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +

v0.dev快速开发

探索v0.dev:次世代开发者之利器 今之技艺日新月异,开发者之工具亦随之进步不辍。v0.dev者,新兴之开发者利器也,迅速引起众多开发者之瞩目。本文将引汝探究v0.dev之基本功能与优势,助汝速速上手,提升开发之效率。 何谓v0.dev? v0.dev者,现代化之开发者工具也,旨在简化并加速软件开发之过程。其集多种功能于一体,助开发者高效编写、测试及部署代码。无论汝为前端开发者、后端开发者

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

【即时通讯】轮询方式实现

技术栈 LayUI、jQuery实现前端效果。django4.2、django-ninja实现后端接口。 代码仓 - 后端 代码仓 - 前端 实现功能 首次访问页面并发送消息时需要设置昵称发送内容为空时要提示用户不能发送空消息前端定时获取消息,然后展示在页面上。 效果展示 首次发送需要设置昵称 发送消息与消息展示 提示用户不能发送空消息 后端接口 发送消息 DB = []@ro

脏页的标记方式详解

脏页的标记方式 一、引言 在数据库系统中,脏页是指那些被修改过但还未写入磁盘的数据页。为了有效地管理这些脏页并确保数据的一致性,数据库需要对脏页进行标记。了解脏页的标记方式对于理解数据库的内部工作机制和优化性能至关重要。 二、脏页产生的过程 当数据库中的数据被修改时,这些修改首先会在内存中的缓冲池(Buffer Pool)中进行。例如,执行一条 UPDATE 语句修改了某一行数据,对应的缓

Java 多线程的基本方式

Java 多线程的基本方式 基础实现两种方式: 通过实现Callable 接口方式(可得到返回值):

前端form表单+ifarme方式实现大文件下载

// main.jsimport Vue from 'vue';import App from './App.vue';import { downloadTokenFile } from '@/path/to/your/function'; // 替换为您的函数路径// 将 downloadTokenFile 添加到 Vue 原型上Vue.prototype.$downloadTokenF