PlantUML快速入门

UML 的简介

统一建模语言(UML)是一个通用的可视化建模语言,用于对软件进行描述、可视化处理、构造和建立软件系统制品的文档。其重要性就不多言(虽然没见到多少人用,但我仍然认为它很重要,只要大家愿意用,那么它就是一个非常好的工具,也是我写这片文章的重点所在)。

UML中的九种图

  • 用例图(Use case diagram):描述角色以及角色与用例之间的连接关系。说明的是谁要使用系统,以及他们使用该系统可以做些什么。
  • 类图(Class diagram):描述类的内部结构和类与类之间的关系,
  • 对象图(Object Diagram):描述的是参与交互的各个对象在交互过程中某一时刻的状态。对象图可以被看作是类图在某一时刻的实例。
  • 顺序图(Sequence Diagram):描述对象之间消息发送的先后顺序,强调时间顺序。
  • 协作图(Collaboration Diagrams):描述收发消息的对象的组织关系,强调对象之间的合作关系。
  • 状态图(State Diagram):是一种由状态、变迁、事件和活动组成的状态机,用来描述类的对象所有可能的状态以及时间发生时状态的转移条件。
  • 活动图(Activity Diagram):本质是一种流程图,它描述了活动到活动的控制流。
  • 组件图(Component diagram):描述系统中构件与构件之间,类或接口与构件之间的关系图
  • 配置图(Deployment diagram):描述系统运行时进行处理的结点以及在结点上活动的构件的配置。强调了物理设备以及之间的连接关系。

因为本人是开发人员,使用类图比较多,下面主要以类图为例介绍PlantUML的用法。先熟悉一下类图中的六种关系

类图中的六种关系

  • 实现(Realize):元素A定义一个约定,元素B实现这个约定,则B和A的关系是Realize,B realize A。这个关系最常用于接口。

    uml中用空心箭头和虚线表示实现关系,箭头指向定义约定的元素。

  • 泛化(Generalization):通常所说的继承(特殊个体 is kind of 一般个体)关系,不必多解释了。

    uml中用带空心箭头的实线线表示泛化关系,箭头指向一般个体。

  • 依赖(Dependency):元素A的变化会影响元素B,但反之不成立,那么B和A的关系是依赖关系,B依赖A;类属关系和实现关系在语义上讲也是依赖关系,但由于其有更特殊的用途,所以被单独描述。

    uml中用带箭头的虚线表示依赖关系,箭头指向被依赖元素。

    特点:当类与类之间有使用关系时就属于依赖关系,不同于关联关系,依赖不具有“拥有关系”,而是一种“相识关系”,只在某个特定地方(比如某个方法体内)才有关系。

  • 关联(Association):元素间的结构化关系,是一种弱关系,被关联的元素间通常可以被独立的考虑。

    uml中用实线表示关联关系,箭头指向被依赖元素。

    特征:表示类与类或类与接口之间的依赖关系,表现为“拥有关系”;具体到代码可以用实例变量来表示。(A类有一个成员变量保存的是B类的一个引用,也就是说由A类可以找到B类)

  • 聚合(Aggregation):关联关系的一种特例,表示部分和整体(整体 has a 部分)的关系。

    uml中用带空心菱形头的实线表示Aggregation关系,菱形头指向整体。

    特征:属于是关联的特殊情况,体现部分-整体关系,是一种弱拥有关系;整体和部分可以有不一样的生命周期;是一种弱关联;

  • 组合(Composition):组合是聚合关系的变种,表示元素间更强的组合关系。如果是组合关系,如果整体被破坏则个体一定会被破坏,而聚合的个体则可能是被多个整体所共享的,不一定会随着某个整体的破坏而被破坏。

    uml中用带实心菱形头的实线表示组合关系,菱形头指向整体。

  • 特征:属于是关联的特殊情况,也体现了体现部分-整体关系,是一种强“拥有关系”;整体与部分有相同的生命周期,是一种强关联;

PlantUML 的简介

UML的工具很多,但我最喜欢PlantUML。因为PlantUML只需要编写语句而不需要绘图,这意味着可以方便地进行版本控制。

目前PlantUML支持时序图、用例图、类图、活动图、组件图、状态图、对象图。另外配置图和时间图为beta版本。

PlantUML的各类开发插件很多,因为我一般使用Android Studio作为开发工具,所以下面我就用Android Studio上的插件PlantUML integration来做以上六种图的简单演示。

通用语法

  • @startuml 开始,以 @enduml 结束;
  • 标题用 Title 开头
  • 注释用 ' 开头,多行用 /' 开头 '/ 结尾
  • --- 表示实线,越多越长
  • ... 表示虚线,越多越长
  • < > 表示左右三角实心箭头
  • <| |> 表示左右三角空心箭头
  • o 表示菱形空心箭头
  • * 表示菱形实心三角箭头
  • as 设置别名


例子


实例是最好的老师,首先来看一张图:

从这张图中可以清楚的看出各个类之间的关系。下面来看一下代码(别头大,真的很简单),注意PlantUML中是以'为注释标记的,已经写了比较详细的注释。(如果看不懂,你可以。。。转行了)

代码:(Markdown的代码标签有点问题,大家凑乎这看吧)

@startuml

'定义抽象类,可以使用 abstract class 或者 abstract
abstract class "动物" as animal {
'定义属性和方法的区别是是否带()
    生命
    新城代谢(氧气, 水)
}
'使用note来添加注释
note left of animal : 还有其他特性用以区别植物和微生物

'这是第二种定义结构的方式,我比较喜欢前一种
abstract 鸟
鸟 : 羽毛
鸟 : 下蛋()

class 大雁 {
    下蛋()
    飞()
}

class 鸭子 {
    下蛋()
    嘎嘎叫()
}

'定义一个包
package 虚拟的 {

    class 唐老鸭 {
        说话()
    }
'指定泛化关系
    唐老鸭 --|> 鸭子
'指定实现关系
    唐老鸭 ..|> 讲话
}

'定义一个接口
interface 飞翔 {
    飞()
}

interface 讲话 {
    说话()
}
'生命一个类
class 水
'指定依赖关系
animal ..>'类也可以不声明直接使用
animal ..> 氧气

'对元素的说明,可以在每一边使用 "".
鸟 "1" *--> "2" 翅膀
鸟 --|> animal

class 雁群

大雁 --|>大雁 ..|> 飞翔
'在关系之间使用标签来说明时, 使用 ":"后接 标签文字
大雁 "n" <.o "1" 雁群 : 聚合

鸭子 --|> 鸟

@enduml

总结

由此可见使用PlantUML来绘制UML是非常简单的(规则不多就那么几条常用的),而且不用考虑排版的问题(要是有人说你的图排版真差也有人背锅了),也不用考虑版本管理的问题(纯文本形式,真是太赞了)。官网上对每种类图的使用介绍也很详细,最佳的学习方法就是边用边查,用上几次基本就熟练了,以后妈妈再也不用担心我向别人解释代码结构了。

本文来自网易实践者社区,经作者张志明 授权发布。