logo头像

分享技术,品味人生

架构师-UML内功

软件工程里面,需求(设计)工程是很重要的一环,不管是传统开发模式还是敏捷开发都需要做一定量的需求设计。

而需求工程主要包括需求的获取和分析、建模设计及需求验证和管理三部分,这里主要整理需求建模设计采用UML语言的使用方法。

UML总说已过时,但在架构设计、复杂需求设计及团队沟通上是非常有用的,另外学习设计模式如能掌握类图的设计方法也是事半功倍的!

虽然现今大厂流行togaf架构设计,用到了业务架构、技术架构、应用架构、部署架构、前后端架构及特定领域的服务架构、数据架构等图形,在做EBA设计、方案书制定上用处大,但UML同样很有借鉴意义!

UML在设计过程中还是有一定作用的,主要体现在类图、时序图、状态图,这些如果不用UML图来表示而用文字来描述的话,大家很难达成一致理解;而如果自创一套表达方式,别人更加难理解;所以用UML还是很有作用的。

除了类图,其它的图UML就显得太丑了,例如部署图,系统架构图

1、简介

UML,Unified Modeling Language,统一建模语言

UML主要用于需求设计阶段进行架构设计、沟通确认之用,输出方案书、详细设计及开发阶段的需求变更环节。

在UML系统开发中有三个主要的模型:

  • 功能模型:从用户的角度展示系统的功能,包括用例图。
  • 对象模型:采用对象,属性,操作,关联等概念展示系统的结构和基础,包括类别图、对象图。
  • 动态模型:展现系统的内部行为。包括序列图,活动图,状态图。

补充:Philippe Kruchten 95年论文提出了4+1视图,也是广为人知的设计,这里暂时不扩展。

UML主要三构件:

  • 图,如用例图、类图、活动图、状态图、顺序图等。
  • 事物,如类图中的类,用例图中的角色。
  • 关系,如类之间的关系,泛化、包含、扩展等。

UML图在需求设计阶段的应用场景

image-20220728172748594

image-20220803145845271

2、七大常用UML图

UML图主要分为静态图和动态图,从不同视角分析对需求进行设计

静态图主要有:

  • 类图,包含类、接口、协助及关联关系,常用于设计模式的分析,如果用于编码前设计基本被吐槽得体无完肤。
  • 组件图,区分部署图主要是软件,如库之间的依赖,用的较少,如果是中间件产品常合并到部署图
  • 部署图,展示硬件、中间件等组件,运维部署之用

动态图主要有:

  • 用例图,从用户角度定义了应用场景,这与目前流行的业务架构很相近。
  • 时序图,强调按时间顺序,对应的协作图在ROSE可以互换,强调关联关系,也就是空间上的关联
  • 活动图,类似ER流程图
  • 状态图,关注状态转换变迁

2.1、用例图

从用户角度定义了应用场景,这与目前流行的业务架构很相近,主要用途是划分功能块、定义边界、交互关系!

要素:用户、用例、关系

这里展示简单用例图

image-20220728161254492

难点1:包含关系,用于提取公共模块、分解两大功能用途

image-20220728161712825

难点2:泛化关系,用例之间、用户之间存在共性,也就面向对象中的继承关系,下图做了共性抽象,简化理解

image-20220728162232488

难点3:扩展关系,如修改学生信息需要先查询再操作,有前后关系,那么这个操作就是扩展

image-20220728162540282

注意箭头不要反了!

难点4:各种关系的中文定义,很容易混淆

image-20220728163049013

2.2、类图

类图有两种方式,我们推荐使用第二种,本文主要对第二种进行展开研究:

  • 将类的详细设计放在类图中,包括常量、成员变量、方法,包括同级的接口、枚举,可以直接生成代码,但带来的维护量巨大,基本是两倍工作量!
  • 在类图中填入类、接口及关键成员及方法、构造,达到用图分析的目的,如分析Gof的23种设计模式

类图主要元素

  • 图形:类图、接口(抽象类与类图合并,通过文字标准区分)
  • 属性:类中包括属性、方法
  • 关系:
    • 依赖关系,所有关系都是依赖,他们只是特例,依赖是关系最弱的,常见单向1:1的使用。
    • 关联关系,特殊依赖关系,属于1对一或1对多的时候才是用,表现为直线,两头带或不带数字
    • 泛化关系,继承反方向,从父类角度出发,描述父类具有一个或多个子类共有属性。
      • 用实线+空心三角箭头表述,箭头指向父类。
    • 实现关系,类似继承关系,描述类实线接口的场景,用虚线+空心三角箭头表述,箭头指向接口。
    • 泛化关系:
      • 聚合关系,has of的关系,可分离,注意箭头方向
      • 组合关系,part of的关系,不可分离,不一定表现在代码上,如级联删除,也是需要注意箭头方向

类图的基本展示: 类的可见性,符号是重点,不过除非有参与图里的重要关系,一般不填具体的属性和方法

image-20220729114317931

泛化和实现很相似,都是从类发起,做接口实现或类继承

泛化关系(Generalization):继承反方向,从父类角度出发,描述父类具有一个或多个子类共有属性。用实线+空心三角箭头表述,箭头指向父类。

image-20220729133635565

实现关系(Realization):类实现接口,标准是虚线+空心三角箭头,箭头指向接口,startuml可能为了跟其他图区分,用了直线

image-20220729133429981

依赖和关联也非常相似,容易混淆,简单地说,采用成员变量形式的关联,其他使用方式是依赖,生命周期长短有别

依赖关系(Dependency)

弱关联关系, 三种表现方式, 形参,临时变量,静态方法执行,提现的是一种使用行为,生命周期短

image-20220729135208443

关联关系(Association)

强关联关系,有单向和双向、自关联三种,也就是把目标类作为自己的成员变量,这里双向关联没有箭头,生命周期长,一起产生、销毁

image-20220729135722901

聚合、组合都是单向关联关系的加强版,聚合是构造函数形参,组合是空构造里实例化,组合的耦合性更强,用实心菱形表示,箭头指向使用方

聚合关系(Aggregation):单向关联关系的加强版,聚合是构造函数形参,用实心菱形表示,箭头指向使用方,这是一个has-of,没有也行

image-20220729141450720

注:set方式也是聚合关系的一种展现形式

组合关系(Compostion): 这是一个part-of的思想,没有会死。。。

image-20220729141604987

小结: 强弱关系, 组合>聚合>关联>依赖,代码的展示仅供参考,遍寻互联网发现思想有统一标准,实操都有差异!

2.3、时序图与协作图

在rose软件中,这两个图形是可以一键转换的,时序图关注的是时间顺序,协作图关注的是对象之间的关系,当然通过序号、备注,还是可以看出所有信息。

时序图:

image-20220728170111315

协作图:

image-20220728164827219

这两个图还是比较简单。

2.4、活动图、状态图

很多工具将这两个图形合并提供。

其中活动图跟传统的流程图类似,主要有1开始、1-N的结束、活动块、判断块、并行点和线条组成。

状态图,是以状态为主的活动图,一般用于TCP/IP网络状态设计等特殊场景

活动图实例:如果环节、角色比较明确,还可以加上泳道、矩阵

image-20220728170907572

状态图实例: 烧水

image-20220728171431109

2.5、组件图、部署图

6.组件图

组件图提供系统的物理视图。它的用途是显示系统中的软件对其他软件组件(例如,库函数)的依赖关系。组件图可以在一个非常高的层次上显示,从而仅显示粗粒度的组件,也可以在组件包层次2上显示。
组件图的建模最适合通过例子来描述。图7显示了4个组件:ReportingTool、BillboardService、Servlet2.2API和JDBCAPI。从ReportingTool组件指向BillboardService、Servlet2.2API和JDBCAPI组件的带箭头的线段,表示ReportingTool依赖于那三个组件。

7.部署图

常用UML图中部署图表示该软件系统如何部署到硬件环境中。它的用途是显示该系统不同的组件将在何处物理地运行,以及它们将如何彼此通信。因为部署图是对物理运行情况进行建模,系统的生产人员就可以很好地利用这种图。
部署图中的符号包括组件图中所使用的符号元素,另外还增加了几个符号,包括节点的概念。一个节点可以代表一台物理机器,或代表一个虚拟机器节点(例如,一个大型机节点)。要对节点进行建模,只需绘制一个三维立方体,节点的名称位于立方体的顶部。所使用的命名约定与序列图中相同:[实例名称]:[实例类型](例如,”w3reporting.myco.com:ApplicationServer”)。

  • 9、IT治理,平台如何全面推广落地,如新旧切换、统一开发等等
  • 10、实施路线图,3年,5年套路
  • 11、预期成果与价值,著作权、论文、专利,创新点,社会效益及经济效益

3、工具

idea有带一些优秀的插件,具体如下:

  • idea自带的类图,可看继承、注解的关系,右键或使用ctrl+alt+u快捷键

image-20220805094608740

  • UML Generator,根据所选的类自动生成详细类图,效果不错,不过类多了不好选啊
  • Sequence Diagrams,根据鼠标所选的元素生成时序图,还是好棒棒的!
  • PlantUML,手写关系,生成各种类图,效果是不错啊,不过手敲风格不是我的想法。。。

评论系统未开启,无法评论!