程序员需要学会画 UML 图
程序员是最需要沟通的人
初入行互联网公司时,很多同学会浅显的认为只有产品经理和业务方才需要沟通,技术同学只要接需求和钻研技术就行了,可是在多次接到开发需求后,发现沟通是技术同学的第一要务,如何理解需求,在需求理解中如何跟需求方沟通,如何让tl和组内同学明白你的想法和设计,如何清晰的向产品经理展示你的理解,这些都是开发前最重要的事,否则稀里糊涂的接需求,最后总是会偏离的业务最初本质,来回返工,大大降低了开发效率。那如何沟通呢?
其中,UML图是技术同学加深业务理解和沟通设计的最好表达方式,下面我会总结一下UML图的常见分类和简单使用。之后有机会会针对程序员沟通会专门写写自己的理解。
如何利用UML沟通
UML是什么
UML:Unified Modeling Language,是一种统一建模语言,为面向对象开发系统的产品进行说明、可视化、和编制文档的一种标准语言,其中建模,就是建立模型,就是为了理解事物而对事物做出的一种抽象,是对事物的一种无歧义的书面描述。
UML可以做什么
画图,对产品和系统从不同角度进行清晰展示。
UML分类
主要分为两类:静态,动态。
静态主要描述类、对象和数据结构以及他们之间存在的状态关系,这种结构在某段时间内应该是稳定的,强调一种结构。
主要包含:用例图、对象图、类图、组件图、包图、部署图。
动态描绘的是执行流程或者是实体状态变化的方式,来展示软件实体在执行过程中的变化过程,动态强调的是某种行为。
主要包含:协作图、序列图、活动图、状态图。
UML如何使用
下面将列举如何使用每种图
先从静态图开始
用例图
用例图主要回答了两个问题:1、是谁用软件。2、软件的功能。从用户的角度描述了系统的功能,并指出各个功能的执行者,强调用户的使用者,系统为执行者完成哪些功能。
![](https://static001.geekbang.org/infoq/50/50c226c6ea6c601af041f01ad5fd913f.png)
![](https://static001.geekbang.org/infoq/ba/ba1f07725b4f9b31cc2de6fa9aa61cc3.png)
类图
用户根据用例图抽象成类,描述类的内部结构和类与类之间的关系,是一种静态结构图。 在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation),组合(Composition),依赖(Dependency)。
各种关系的强弱顺序: 泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖
依赖关系使用虚线加箭头表示,如下图所示:
![](https://static001.geekbang.org/infoq/32/324c059cb9914b42c1407b3dc8cbfa42.png)
关联关系使用实线加箭头表示,类之间的关系比依赖要强。学生与老师是关联的,学生可以不用电脑,但是学生不能没有老师。如下图所示:
![](https://static001.geekbang.org/infoq/2a/2a0c599ad44a131101982ee912d7e7dd.png)
聚合
聚合关系使用实线加空心菱形表示。聚合用来表示集体与个体之间的关联关系。例如班级与学生之间存在聚合关系,类图表示如下:
![](https://static001.geekbang.org/infoq/f6/f696baac2a2187e93f508ad676b462f3.png)
组合
复合关系使用实线加实心菱形表示。组合又叫复合,用来表示个体与组成部分之间的关联关系。例如学生与心脏之间存在复合关系,类图表示如下:
![](https://static001.geekbang.org/infoq/65/652f58f21df0ba44aae47aff2f5d207d.png)
泛化
泛化是学术名称,通俗来讲,泛化指的是类与类之间的继承关系和类与接口之间的实现关系。
继承关系使用直线加空心三角形表示。类图结构如下:
![](https://static001.geekbang.org/infoq/2f/2f42278ddb6e5258014f7786cb21da4a.png)
类接口的实现关系使用虚线加空心三角形表示。类图结构如下:
![](https://static001.geekbang.org/infoq/1a/1a9b2c0db3ea99c6b7762b56ec35ce9f.png)
下面一个类图的举例
![](https://static001.geekbang.org/infoq/64/64478414023e4b87b4acf23bc8d52997.png)
对象图
描述的是参与交互的各个对象在交互过程中某一时刻的状态。对象图可以被看作是类图在某一时刻的实例。
![](https://static001.geekbang.org/infoq/f0/f08fe393620afd6b1cdca9b48667738d.png)
组件图
组件图提供系统的物理视图,它的用途是显示系统中的软件与其他软件组件(例如,库函数)的依赖关系。组件图可以在一个非常高的层次上显示,从而仅显示粗粒度的组件,也可以在组件包层次上显示。
![](https://static001.geekbang.org/infoq/5b/5bb3b9489756d5d37b7839508e393b62.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
包图
当对一个比较复杂的软件系统进行建模时,会有大量的类、接口、组件、节点和图需要处理;如果放在同一个地方的话,信息量非常的大,显得很乱,不方便查询,所以就对这些信息进行分组,将语义或者功能相同的放在同一个包中,这样就便于理解和处理整个模型。
![](https://static001.geekbang.org/infoq/d5/d54f50a89ab14dab52bf11a8e5217bc3.png)
部署图
描述了系统运行时进行处理的结点以及在结点上活动的构件的配置。强调了物理设备以及之间的连接关系。
![](https://static001.geekbang.org/infoq/98/98d02d08b647321b935e5dc96956bd7d.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
接下来将重点介绍动态图
介绍动态图之前先讲下动态图的几种消息
![](https://static001.geekbang.org/infoq/09/09fab09a82c0b6bdfef69b033556558a.png)
时序图
描述了对象之间消息发送的先后顺序,强调时间顺序。序列图的主要用途是把用例表达的需求,转化为进一步、更加正式层次的精细表达。用例常常被细化为一个或者更多的序列图。同时序列图更有效地描述如何分配各个类的职责以及各类具有相应职责的原因。
![](https://static001.geekbang.org/infoq/6a/6a0daf575ecdcba59d448f072199b0b2.png)
状态图
是一种由状态、变迁、事件和活动组成的状态机,用来描述类的对象所有可能的状态以及时间发生时状态的转移条件。
![](https://static001.geekbang.org/infoq/32/325a4959f000b0f159470b0e104c473a.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
活动图
是状态图的一种特殊情况,这些状态大都处于活动状态。本质是一种流程图,它描述了活动到活动的控制流。
交互图强调的是对象到对象的控制流,而活动图则强调的是从活动到活动的控制流。
活动图是一种表述过程基理、业务过程以及工作流的技术。它可以用来对业务过程、工作流建模,也可以对用例实现甚至是程序实现来建模。
下面是活动图的一些符号
![](https://static001.geekbang.org/infoq/c1/c1ee398f178022a46d19e55aebbc4be4.png)
![](https://static001.geekbang.org/infoq/f9/f9ebe25e104fba298bf1ccaf8817839a.png)
![](https://static001.geekbang.org/infoq/cf/cf923e6e54f16a8bb0e3f93f13c31d68.png)
![](https://static001.geekbang.org/infoq/34/340b738f61658e23048a55e5bd43fb84.png)
协作图
协作图(Collaboration Diagram /Communication Diagram,也叫合作图)是一种交互图(interaction diagram),强调的是发送和接收消息的对象之间的组织结构。
它是时序图去掉时间次序的空间结构。
下面是协作图和时序图的区别:
![](https://static001.geekbang.org/infoq/33/335015c0fe10699bb1ef4cc25e701eb4.png)
![](https://static001.geekbang.org/infoq/e1/e1f50425d6fd3e0d21b8098cf9aac174.png)
用什么画图
推荐:EdrawMax、processon 、draw.io
评论