惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
V2EX
Y
Y Combinator Blog
博客园_首页
V
Visual Studio Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
阮一峰的网络日志
阮一峰的网络日志
Hugging Face - Blog
Hugging Face - Blog
宝玉的分享
宝玉的分享
B
Blog
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
WordPress大学
WordPress大学
L
LangChain Blog
爱范儿
爱范儿
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Proofpoint News Feed
Blog — PlanetScale
Blog — PlanetScale
C
Check Point Blog
博客园 - 聂微东
云风的 BLOG
云风的 BLOG
Microsoft Security Blog
Microsoft Security Blog
博客园 - 叶小钗
酷 壳 – CoolShell
酷 壳 – CoolShell
H
Help Net Security

Nemo

20260819 - Nemo 再见,2025 Complete ORB-SLAM3 Setup Guide for Jetson Xavier NX with RealSense D455 20250723 再见,2024 Using CertBot for Automatic Secure EMQX Broker Create Your Own GPS Data Publisher Support SSL AGV Dispatching System Technical Documentation Finding Nemo No title 香港賽馬會呈獻系列:黑白——攝影敘事 再见,2023 团团是只猫 Design an FSM for Robot State Machines – Basics of Computer Science Data-driven robot lifespan: Collection 数据驱动的机器人寿命:收集、诊断、预测 Exploring the design space of binary search trees 特首来了 Large language models, explained with a minimum of math and jargon 设计有缓存异步逻辑的监控脚本并测试其资源占用 使用loguru记录串口数据并使用Docker搭建ARM开发环境 在vscode的Dev Container中构建.NET开发环境及使用doxygen和graphviz绘制函数调用图 State or Status? A*算法两种时间复杂度 /A* Algorithm: Two Types of Time Complexity 使用KD-Tree快速收敛到最近坐标点/Fast convergence to the nearest coordinate point using KD-Tree 翻译 || 总结 - Go语言中的空结构体(The empty struct) 再见,2022 从PE工作报告中能读出什么 Give me miles, give me truth
UML软件建模
Nemo · 2020-08-28 · via Nemo

:beetle:软件开发的本质就是在计算机的虚拟空间中根据现实需求创建一个新世界。

软件建模

软件建模,为要开发的软件建造模型,模型是对客观存在的抽象。

通过软件建模,把握事物的本质规律和主要特征,抽象软件系统的主要特征和组成部分,梳理这些关键组成部分的关系。

在软件开发中,有两个客观存在:

  • 要解决的领域问题
  • 最终开发出来的软件系统

这两个方面客观存在的抽象,就是软件模型。

8ebae3acc66c260233cdb77a9cb5d6ef.jpg

4+1 视图模型

这是建模方法论:

  • 逻辑视图:描述软件的功能逻辑,由哪些模块组成,模块中包含哪些类,其依赖关系如何;
  • 开发视图:包括系统架构层面的层次划分,包的管理,依赖的系统与第三方的程序包。开发视图某些方面和逻辑视图有一定重复性,不同视角看到的可能是同一个东西,开发视图中一个程序包,可能正好对应逻辑视图中的一个功能模块;
  • 过程视图:描述程序运行期的进程、线程、对象实例,以及与此相关的并发、同步、通信等问题;
  • 物理视图:描述软件如何安装并部署到物理的服务上,以及不同的服务器之间如何关联、通信;
  • 场景视图:针对具体的用例场景,将上述 4 个视图关联起来,一方面从业务角度描述,功能流程如何完成,一方面从软件角度描述,相关组成部分如何互相依赖、调用。

e402b54965f9d2f4750ec6a0de1cee04.png

软件建模与设计过程可以拆分成需求分析、概要设计和详细设计三个阶段。

UML 常用的有 7 种:类图、序列图、组件图、部署图、用例图、状态图和活动图。

类图

描述类的特性和类之间的静态关系,把相关的一组类及其关系用一张图画出来,主要是在详细设计阶段画。

一个类包含三个部分:

  • 类的名字、
  • 类的属性列表
  • 类的方法列表

类之间有 6 种静态关系:

  • 关联、
  • 依赖、
  • 组合、
  • 聚合、
  • 继承、
  • 泛化

84755193120d23e06e098642185bf152.png

序列图

用来描述各种参与者之间的动态调用关系,可以是类对象,也可以是更大粒度的参与者,比如组件、服务器、子系统。可在软件设计的不同阶段使用。

组件图

组件是比类粒度更大的设计元素,可包含多个类,用途可与包图接近,进行模块设计的时候更多的是用组件图。

5d4e41aa7769a011ef2bb9f22ee9808d.png

组件图描述组件之间的静态关系,主要是依赖关系,用在概要设计阶段。描述组件之间的动态调用关系,可以使用组件序列图,以组件作为参与者,描述组件之间的消息调用关系

部署图

软件系统的最终部署情况,属于宏观层面,软件系统最终物理呈现的蓝图,用在概要设计阶段。

32931c58184b79744efa559bf4e0b00c.png

用例图

反映用户和软件系统的交互,描述系统的功能需求,用在需求分析阶段

b79540c40111f3be97fc0b81d5a3060e.png

  • 角色:可以是人,也可以是其他的系统
  • 系统:矩形框被称为用例的边界,框里的椭圆表示一个一个的功能,功能之间可以调用依赖,也可以进行功能扩展。

状态图

状态图用来展示单个对象生命周期的状态变迁。一张状态图描述一个对象生命周期的各种状态,及其变迁的关系:

34ed399aa400f124ead77bad31468104.png

  • 在需求分析阶段:描述状态变迁的逻辑关系;
  • 在详细设计阶段:状态要用枚举值表示,以指导具体的开发。

活动图

描述过程逻辑和业务流程:

976fdc5c09c37d7b547d6c5d64bea107.png

实心圆代表流程开始,空心圆代表流程结束,圆角矩形表示活动,菱形表示分支判断。

活动图引入了一个重要的概念——泳道:将活动根据领域、系统和角色等划分到不同的泳道中,使流程边界更加清晰。

  • 在需求分析阶段描述业务流程;

  • 在概要设计阶段描述子系统和组件的交互;

  • 在详细设计阶段描述一个类方法内部的计算流程。

使用合适的 UML 模型构建一个设计文档

  • 需求分析阶段
    • 通过用例图来描述系统的功能与使用场景;
    • 通过活动图描述关键的业务流程;
    • 通过时序图描述新系统和原来的子系统的调用关系:在需求阶段就提出要和现有的某些子系统整合
    • 通过简化的类图进行领域模型抽象,并描述核心领域对象之间的关系;
    • 通过状态图描述某些对象内部会有复杂的状态变化。
  • 概要设计阶段
    • 通过部署图描述系统最终的物理蓝图;
    • 通过组件图以及组件时序图设计软件主要模块及其关系;
    • 通过组件活动图描述组件间的流程逻辑;
  • 详细设计阶段
    • 通过输出类图和类的时序图,指导最终的代码开发;
    • 通过画方法的活动图,描述方法内部比较复杂的逻辑。