当前位置: 首页 > news >正文

什么是UML UML入门到放弃系列

1.定义

        UML-Unified Modeling Language 统一建模语言,又称标准建模语言。是用来对软件密集系统进行可视化建模的一种语言。

2.UML的三个级别

        《UML精粹》一书中把这三个级别称为概念级、规格说明级和实现级。

2.1 概念级

        概念级的图示和源代码之间没有很强的关联。它们更多是和人的语言相关的。概念级的图示可以作为一种速记方法,用于描绘存在于人类问题领域中的概念和抽象。因此,它们不必遵循强的语义规则,其含义可以是模糊的,通过解释来确定。

2.2 规格说明级

        规格说明级的图示与源代码之间有很强的关联。实际上,规格说明级图示的目的就是要能够转换成源代码。

2.3 实现级

         实现级图示是要描绘已有的源代码。

        其中,规格说明级和实现级这两个级别的图示必须得遵循某些规则和语义。这样的图示非常明确并且有着大量的规范。

3.软件模型

        模型需要具备两个特点,即可测试可评估。如果模型不具备这两个特点,那它便没有存在的意义。为什么要建模型?那你可以联想一下航天工程师为何不直接造飞机,然后试飞呢?结构工程师为何不是直接建大桥,然后看看它是否能够不倒?答案很简单,飞机和桥梁比模型造价高多了。当模型比构建的真实实体便宜很多时,我们就会用模型来研究设计。这个观点在软件的建模上同样适用。

        接下来我们思考两个问题UML图是可测试可评估的么?与代码相比它更加便宜么?事实上我们无法给出一个明确的答案,或者说无法像航天工程师以及结构工程师那样在绝大多数场景下都能给出肯定的答案,这是因为软件建模的性价与具体的应用场景相关。

        我们来看UML是否具备模型的特点,即可测试可评估。很遗憾,测试在UML图方面,并没有严格的标准,同时模型的评估最终仍然是主观的。那么性价比呢,客观的说大多数情况UML图的绘制比编写代码代价要小一点,但是并没有小多少。事实上,经常出现更改源代码比更改图示更加容易的情况。

        说了这么多,你们是不是认为我在陈述一个伪命题,或者说UML图就是个鸡肋。这么说对了一半,因为UML确实很容易被误用,当硬性规定“必须图示一切”,这样的规则还不如没有规则。大量项目时间和精力会被浪费在绘制没人会看的图示上面,这时候UML图就是一个鸡肋。但如果用在与团队同步大型系统的结构时,脉络图就是一个非常适合的选择。所以恰当而有效的使用UML图是非常重要。

4.UML的应用场景

        那么我们什么时候应该使用UML图呢?我们把这个问题更加细化一点,写代码之前是否需要做好详细设计?我们都知道在建筑行业,一个建筑师的设计图可以拿个及时甚至上百人来建造房子。在做设计图时,不需要挖地基、浇灌混凝土或者安装窗户。总之,设计的代价比直接建造的代价低很多。丢弃一个错误的设计,比拆除有问题的建筑代价也低很多。但是这样的性价比,在软件领域却不明显,绘制UML图比写代码代价更低根本不明显,事实上,许多项目团队在图示上花的时间已经远远超过了写代码。丢弃图示比丢弃代码成本更低,同样不明显。因此,我们并不鼓励在写代码之前画一份详细的UML图示。
        那么我们到底什么时候才应该使用UML图呢?大师马丁总结了一下的情形
可以画图的情况如下:

  1. 几个人都需要理解设计的某个特定部分的结构,因为他们同时都要用到它。一旦所有人都理解,就停止。
  2. 你希望团队能够达成一致,但是有两个或者更多的人不同意某个特定元素的设计。把讨论限定在一个时间盒内,然后选择一种决策的手段,比如投票或者公平裁判。在时间盒终止或者能够做出决策时,就结束。然后,擦掉图示。
  3. 你想尝试一个设计想法,并且图示有助于思考。当你可以使用代码完成思考时,就停止。丢掉图示。
  4. 你要向其他人或者自己解释代码某些部分的结构当通过浏览代码可以更好地进行解释时,就停止。
  5. 接近项目的尾声,并且客户要求要把图示作为一部分文档提供给他们。

不要画图的情况如下:

  1. 过程要求。
  2. 不画图会有负罪感或者认为这是好的设计师要做的事情。好的设计师是要写代码的。他们只有在必要时才画图。
  3. 为了在编码前创建出面面俱到的设计阶段文档。这种文档基本上没有任何价值,却耗费了大量的时间。
  4. 为了方便其他人编码,真正的软件架构师是要为自己的设计编码的。

下面将给出UML主要的几个具体应用场景:

4.1 与他人交流时可以使用UML

        使用UML在软件开发者间交流设计构想是非常方便的。一小组开发者站在一块白板前可以完成许多工作。如果你有一些想法需要和他人进行交流,UML是非常有用的。UML有助于交流清晰的设计想法。我们很容易就可以想象出一组开发人员站在一块白板前讨论着一幅类似图示的场景。事实上,图示非常清晰地表达了代码结构。另一方面,在交流算法细节方面,UML并不是非常合适。

4.2 大型系统的架构图

        架构图可以使得开发人员快速找到类与类之间的依赖关系,并提供一份关于整个系统结构的参考。这样的架构图是很有用的教学工具,任何团队成员都要能够立即在白板上画出这样一幅图来。

4.3 项目结束文档

        要编写需要保存的设计文档,最佳时机是在项目结束时,并把它作为团队的最后一项工作。这种文档会精确地反映出设计的状态,对团队非常有用。不过,仍有一些问题需要注意。UML图必须得经过仔细考虑。我们不需要厚达几千页的顺序图!我们想要的是那些描述系统关键要点的少量重要图示。充斥着大量混乱不堪、纠缠在一起的令人迷惑的线条和框框的UML图,是无法理解的。

5.要不要使用UML工具

        UML CASE工具可能非常有用,但也可能是昂贵的垃圾收集器。在决定购买并部署UML CASE工具时,一定要非常小心。

  1. 难道UML CASE工具没有使得画图变得更容易一些吗?没有,它们使得画变得图更加困难了。要想熟练掌握工具,需要一个很长的学习曲线,即使掌握了,工具也相对更笨重,而白板则非常易于使用。开发者通常都已经非常熟悉白板。即使不熟悉,也基本上没有什么学习曲线。
  2. 难道UML CASE工具并没有使得大团队在协作绘图方面更容易一些吗?有些情况下确实更容易。不过,绝大多数开发者和开发项目都不需要产出如此数量和复杂性的图示,多到需要一个自动协作系统来协凋。无论如何,都应该先用一个手工系统,当其显现出不堪负荷,并且此时唯一的选择就是自动化时,才是考虑购买UML图绘制协调系统的最好时机。
  3. 难道UMLCASE工具并没有使得代码生成更加容易吗?画图,生成代码,然后使用生成的代码,所涉及的工作量之和很可能不比直接写代码的成本更低。如果说有收益的话,也不会是一个数量级,甚至不会是2倍。开发者知道如何编辑文本、使用IDE。从图示生成代码听起来像是个好主意,但我很希望你在大把花钱之前先度量一下生产力方面的提升。
  4. 那些本身就是IDE并且可以同时显示代码和图示的CASE工具如何呢?这些工具确实很酷。不过,总是显示UML图并没有多大意义。修改代码时图示会相应改变或者修改图示时代码会相应改变,实际上并不会带来多少帮助。坦白讲,我更愿意花钱买专注于更好地帮助我处理程序而不是图示的IDE,同样,在决定投入大笔资金之前,请先度量生产力的提高。简而言之,三思而后行。给团队装备一套昂贵的CASE工具也许有好处,但在购买这些很可能无人问津的东西之前,请先通过实验来验证它的好处。

6.总结

        不要试图一次就把软件系统整体架构用UML绘制出来,从最简单的行为开始,绘制一幅有关具体问题的简单顺序图或者协作图,然后根据需求不断的补充和扩展。

        在使用图示时非常重要的一点是要能够想象出代码。我们把图示作为代码的速记,而不是替代。如果在画图时不能想象出它所表示的代码,那么就是在构建空中楼阁。停止绘图,想一想该如何把它翻译成代码。千万不要为了画图而画图。必须时刻确保自己知道正在表达什么代码。

        UML是一个工具,不是最终结果。作为一个工具,它可以帮助思考和交流设计。如果少量使用,它会带给你巨大的好处。如果过度使用,它会浪费你大量的时间。使用UML时,少即是好。

引用

《敏捷开发》—— 罗伯特.C.马丁 

 

 

相关文章:

什么是UML UML入门到放弃系列

1.定义 UML-Unified Modeling Language 统一建模语言,又称标准建模语言。是用来对软件密集系统进行可视化建模的一种语言。 2.UML的三个级别 《UML精粹》一书中把这三个级别称为概念级、规格说明级和实现级。 2.1 概念级 概念级的图示和源代码之间没有很强的关联。…...

vue3 + element Plus实现表格根据关键字合并行,并实现行的增删改操作

根据关键字合并表格 1.实现初始化表格2.实现添加班级与学生的功能3.添加的弹窗4.删除班级5.删除学生 首先看最终实现的效果 1.实现初始化表格 这里主要用到的是表格的span-method这个方法 <template><div class"main-page"><div class"flex-en…...

c++视觉处理---直方图均衡化

直方图均衡化 直方图均衡化是一种用于增强图像对比度的图像处理技术。它通过重新分布图像的像素值&#xff0c;以使图像的直方图变得更均匀&#xff0c;从而提高图像的视觉质量。在OpenCV中&#xff0c;您可以使用 cv::equalizeHist 函数来执行直方图均衡化。以下是 cv::equal…...

【LeetCode】2.两数相加

目录 1 题目2 答案2.1 我写的&#xff08;不对&#xff09;2.2 更正 3 问题 1 题目 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返…...

蜘蛛飞机大战

欢迎来到程序小院 蜘蛛飞机大战 玩法&#xff1a; 点击开始游戏&#xff0c;鼠标移动控制方向&#xff0c;可自由移动飞机打剁掉方飞机下落的子弹并打掉敌方飞机&#xff0c;三次生命&#xff0c;不同关卡不同奖励&#xff0c;快去闯关吧^^。开始游戏https://www.ormcc.com/pl…...

代码混淆界面介绍

代码混淆界面介绍 代码混淆功能包括oc&#xff0c;swift&#xff0c;类和函数设置区域。其他flutter&#xff0c;混合开发的最终都会转未oc活着swift的的二进制&#xff0c;所以没有其他语言的设置。 代码混淆功能分顶部的显示控制区域&#xff1a;显示方式&#xff0c;风险等…...

蓝桥杯每日一题2023.10.9

题目描述 成绩统计 - 蓝桥云课 (lanqiao.cn) 题目分析 学会使用四舍五入函数round #include<bits/stdc.h> using namespace std; int s1, s2; int main() {int n, x;cin >> n;for(int i 1; i < n; i ){cin >> x; if(x > 60)s1 ;if(x > 85)s2 ;…...

HTML5的新增表单元素

HTML5 有以下新的表单元素: <datalist> <keygen> <output> datalist datalist 元素规定输入域的选项列表。 datalist属性规定 form 或 input 域应该拥有自动完成功能。当用户在自动完成域中开始输入时&#xff0c;浏览器应该在该域中显示填写的选项&…...

如何在Firefox中配置HTTP?

在浏览器中配置HTTP是一个常见的需求&#xff0c;它可以让我们轻松访问需要的网站或保护个人隐私。本文将为您详细介绍如何在Firefox浏览器中配置HTTP应用&#xff0c;帮助您实现无缝的HTTP体验。无论您是初次接触HTTP还是有一定经验的用户&#xff0c;本文都能为您提供实用的操…...

Android组件通信——消息机制(二十六)

1. 消息机制 1.1 知识点 &#xff08;1&#xff09;掌握Message、Handler、Looper类的使用以及消息的传递&#xff1b; &#xff08;2&#xff09;可以通过消息机制动态取得信息&#xff1b; 1.2 具体内容 对于android的消息机制&#xff0c;我们主要要使用Java中线程的一…...

《进化优化》第4章 遗传算法的数学模型

文章目录 4.1 图式理论4.2 马尔可夫链4.3 进化算法的马尔可夫模型的符号4.4 遗传算法的马尔可夫模型4.4.1 选择4.4.2 变异4.4.3 交叉 4.5 遗传算法的动态系统模型4.5.1 选择4.5.2 变异4.5.3 交叉 4.1 图式理论 图式是描述一组个体的位模式&#xff0c;其中用*来表示不在乎的位…...

spring:详解spring MVC

spring MVC SpringMVC是一种基于Java的MVC&#xff08;Model-View-Controller&#xff09;Web开发框架&#xff0c;通过将业务逻辑、数据和界面分离&#xff0c;使得开发人员能够更高效地管理和维护代码&#xff0c;提高应用的可扩展性和可维护性。 SpringMVC核心概念 Contr…...

【Leetcode】207.课程表

一、题目 1、题目描述 你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 p r e r e q u i s i t e s [ i ] = [ a i , b...

Ubuntu18.04中QT安装下载安装pcl和vtk以及使用过程中踩过的坑

一、先记录一下下载过程中踩过的坑 问题1&#xff1a;QVTKOpenGLNativeWidget和QVTKWidget 之前从来没有接触过QT中显示3D点云方面的知识&#xff0c;了解到可以用pcl&#xff0c;然后在网上各种找pcl下载的相关内容&#xff0c;想要在QT中显示出来&#xff0c;需要用到VTK&a…...

C++学习——对象数组、成员对象与封闭类

以下内容源于C语言中文网的学习与整理&#xff0c;非原创&#xff0c;如有侵权请告知删除。 一、对象数组 对象数组&#xff0c;即数组的每个元素都是某个类的对象。 1、对象数组中的每个元素都需要用构造函数初始化&#xff0c;具体哪些元素用哪些构造函数初始化&#xff0c…...

解锁机器学习-梯度下降:从技术到实战的全面指南

目录 一、简介什么是梯度下降&#xff1f;为什么梯度下降重要&#xff1f; 二、梯度下降的数学原理代价函数&#xff08;Cost Function&#xff09;梯度&#xff08;Gradient&#xff09;更新规则代码示例&#xff1a;基础的梯度下降更新规则 三、批量梯度下降&#xff08;Batc…...

day62:ARMday9,I2c总线通信

作业&#xff1a;按键中断实现LED1、蜂鸣器、风扇 key_in.c: #include "key_in.h"void gpio_init() {//RCC使能//GPIOERCC->MP_AHB4ENSETR | (0x1<<4);//GPIOBRCC->MP_AHB4ENSETR | (0x1<<1);//PE10、PB6、PE9输出模式GPIOE->MODER & ~(0…...

【Python学习笔记】类型/运算/变量/注释

前言 人生苦短&#xff0c;追求生产力&#xff0c;做一只时代风口的猪&#xff0c;应该学python Python语言中&#xff0c;所有的数据都被称之为对象。 1. 对象类型 Python语言中&#xff0c;常用的数据类型有&#xff1a; 整数&#xff0c; 比如 3 小数&#xff08;也叫浮…...

国内常用源开发环境换源(flutter换源,python换源,Linux换源,npm换源)

flutter换源 使用环境变量:PUB_HOSTED_URL FLUTTER_STORAGE_BASE_URL&#xff0c; upgrade出问题时可能会提示设置FLUTTER_GIT_URL变量。 flutter中国 PUB_HOSTED_URLhttps://pub.flutter-io.cn FLUTTER_STORAGE_BASE_URLhttps://storage.flutter-io.cn FLUTTER_GIT_URLhtt…...

关于一篇什么是JWT的原理与实际应用

目录 一.介绍 1.1.什么是JWT 二.结构 三.Jwt的工具类的使用 3.1. 依赖 3.2.工具类 3.3.过滤器 3.4.控制器 3.5.配置 3.6. 测试类 用于生成JWT 解析Jwt 复制jwt&#xff0c;并延时30分钟 测试JWT的有效时间 测试过期JWT的解析 四.应用 今天就到这了&#xff0c;希…...

【Method】把 arXiv论文 转换为 HTML5 网页

文章目录 MethodReference https://ar5iv.labs.arxiv.org/ Articles from arXiv.org as responsive HTML5 web pages. 可以将来自 arXiv 的 PDF 论文渲染成 HTML5 网页版本。 Method View any arXiv article URL by changing the X to a 5. 将 arXiv 网址中的 x 换成 5 再回…...

每日一题AC

4.小花和小草正在沙滩上玩挖沙洞的游戏。他们划了一条长度为n米的线作为挖沙洞的参考线路&#xff0c;小花和小草分别从两头开始沿着划好的线开始挖洞&#xff0c;小花每隔a米挖一个洞&#xff0c;小草每隔b米挖一个洞&#xff0c;碰到已经挖过洞的就不需要再挖了。那么&#x…...

后端:推荐 2 个 .NET 操作的 Redis 客户端类库

目录 Redis特点 Redis场景 1. StackExchange.Redis 2. FreeRedis &#x1f680; 快速入门 &#x1f3a3; Master-Slave (读写分离) &#x1f4bb; Pipeline (管道)示例 &#x1f30c; Redis Cluster (集群) Redis &#xff0c;是一个高性能(NOSQL)的key-value数据库,Re…...

华泰证券:京东营收增长或短期承压

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;华泰证券近期发布研报称京东营收增长或短期承压。华泰证券主要观点如下&#xff1a;营收增长或短期承压&#xff0c;聚焦长期内生能力建设 考虑到消费情绪的恢复仍需一定时间&#xff0c;我们预计…...

Java从resources文件下载文档,文档没有后缀名

业务场景&#xff1a;因为公司会对excel文档加密&#xff0c;通过svn或者git上传代码也会对文档进行加密&#xff0c;所以这里将文档后缀去了&#xff0c;这样避免文档加密。 实现思路&#xff1a;将文档去掉后缀&#xff0c;放入resources下&#xff0c;获取输入流&#xff0…...

【动手学深度学习-Pytorch版】BERT预测系列——BERTModel

本小节主要实现了以下几部分内容&#xff1a; 从一个句子中提取BERT输入序列以及相对的segments段落索引&#xff08;因为BERT支持输入两个句子&#xff09;BERT使用的是Transformer的Encoder部分&#xff0c;所以需要需要使用Encoder进行前向传播&#xff1a;输出的特征等于词…...

Python之元组、字典和集合练习

1、餐厅下午茶 &#xff08;列表与元组 crr66&#xff09; 某餐厅推出了优惠下午茶套餐活动。顾客可以以优惠的价格从给定的糕点和给定的饮 料中各选一款组成套餐。已知&#xff0c;指定的糕点包括松饼(Muffins)、提拉米苏(Tiramisu)、芝士蛋 糕(Cheese Cake)和三明治(Sandwic…...

【数据结构】归并排序和计数排序(排序的总结)

目录 一&#xff0c;归并排序的递归 二&#xff0c;归并排序的非递归 三&#xff0c;计数排序 四&#xff0c;排序算法的综合分析 一&#xff0c;归并排序的递归 基本思想&#xff1a; 归并采用的是分治思想&#xff0c;是分治法的一个经典的运用。该算法先将原数据进行拆…...

某医疗机构:建立S-SDLC安全开发流程,保障医疗前沿科技应用高质量发展

某医疗机构是头部资本集团旗下专注大健康领域战略性投资与运营的实业公司&#xff0c;市场规模超300亿。该医疗机构已完成数字赋能&#xff0c;形成了标准化、专业化、数字化的疾病和健康管理体系&#xff0c;将进一步规划战略方向&#xff0c;为人工智能纳米技术、高温超导、生…...

验证二叉搜索树的后序遍历序列

LCR 152. 验证二叉搜索树的后序遍历序列 class VerifyTreeOrder:"""LCR 152. 验证二叉搜索树的后序遍历序列https://leetcode.cn/problems/er-cha-sou-suo-shu-de-hou-xu-bian-li-xu-lie-lcof/description/"""def solution(self, postorder: Lis…...