Mrli
别装作很努力,
因为结局不会陪你演戏。
Contacts:
QQ博客园

PlantUML作图

2022/04/04 计算机基础
Word count: 1,070 | Reading time: 5min

最近在看开源代码,有些项目的架构和执行逻辑都非常有学习、借鉴意义,因此想作图可视化记录下来。

在写文档的过程中,经常需要进行画图。虽然说现在有很多类似viso之类的可视化画图工具,但是还是要花费大量时间在拖拉组件上,效率十分低下。而Plantuml与markdown类似,本质上是也算一门可以快速画图的设计语言,学习起来也很方便,学完后直接书写、不需要拖拽就能做出规整的图,能大大节约在布局上细枝末节的时间。

此外,PlantUML在vscode, webstorm都有相关的插件可以使用。

在线体验网站有很多使用的样例介绍,在此我就不过多介绍了。本文会以我使用到的功能图来提醒说明一下一些语法规范和注意点。

时序图

  • 注释

    • 图上不显示的注释:/' 注释内容 '/

    • 图中显示的注释:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      # 左侧注释
      Alice->Bob : hello
      note left: this is a first note

      # 右侧注释
      Bob-->Alice : ok
      note right: this is another note

      # 跨越两个的注释
      note over Alice, Bob #FFAAAA: This is displayed\n over Bob and Alice.
  • 返回信息

    1
    2
    3
    Alice -> Bob: Another authentication Request
    # 同样可以写成Bob --> Alice, 只不过下面的更直观能看出是返回
    Alice <-- Bob: Another authentication Response
  • 生命线的激活与撤销

    • 关键字activatedeactivate用来表示参与者的生命活动。一旦参与者被激活,它的生命线(柱子)就会显示出来。
      • activatedeactivate适用于以上情形。
      • destroy表示一个参与者的生命线的终结。
    • 给生命线上色语法:activate Holder [#color]

    ▲.一个参与者在最外层只用于有一个生命线,但在大生命线中可以通过activate创建多个嵌套的小生命线,用deactivate跳出当前生命线

    ★因此,最好生命线的创建和退出同时写出,即写了一个activate ?就写一个deactivate ?, 需要完成的内容在其中编写

    此外,需要注意的是,当前结果的返回应该在deactivate之前。比如A <-- C: return后才是deactivate C,当然如果遵循了成对书写activate的习惯的话,就不存在这个问题了。

  • return关键字:以用于生成一个带有可选文本标签的返回信息。返回的点是导致最近一次激活生命线的点。但不建议使用,因为在维护修改的时候无法直观的看出到底是从哪返回哪。而是采取A <-- B: return来声明从B到A的虚线返回

  • 分隔符: 通过使用==关键词来将你的图表分割成多个逻辑步骤。

  • 声明参与者: 声明的顺序将是(默认的)显示顺序

    格式为: 类型 参与者名称 [as AliasName] [order orderVaalue] [#color]

    可以选择的类型有:

    • actor(角色)
    • participant(默认参与者)
    • boundary(边界)
    • control(控制)
    • entity(实体)
    • database(数据库)
    • collections(集合)
    • queue(队列)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
@startuml
/' 声明参与者 '/
Actor actor as A
Participant scheduler as S
Participant Fetcher as F
Participant check as C
Participant DoValidator as D
Participant Queue as Q
Participant ProxyHandler as P
Participant ProxyFetcher as PF
A -> S: runScheduler()

/'scheduler主要逻辑'/
activate S
S -> S: __runProxyFetch()
== 定时器设置 ==
S -> S: scheduler.add_job(__runProxyFetch)
S -> S: scheduler.add_job(__runProxyCheck)
S -> S: scheduler.configure()
S -> S: scheduler.start()

== 定时器执行 ==
S -> S: __runProxyFetch()
/' --__runProxyFetch-- '/
activate S #orange
S -> F: __runProxyFetch()
activate F #pink
F->F: run()
F->PF: freeProxyXX()
activate PF
PF-->F: proxy
deactivate PF
F->Q: proxy_queue.put(proxy)
Q-->F
F-->S
deactivate F

S -> C: Checker("raw", proxy_queue)
activate C
C -> C: _ThreadChecker.run()
C -> D: DoValidator.validator(proxy)

activate D
D -> D: cls.httpValidator(proxy)
D -> D: cls.httpsValidator(proxy)
D -> C
deactivate D

alt work_type
C->C: __ifRaw()
else
C->C: __ifUse()
end
C-->S

deactivate C
deactivate S
/' --__runProxyFetch-- '/

/' --__runProxyCheck-- '/
S -> S: __runProxyCheck()
activate S #orange
S->P: <<create proxy_handler>>
P-->S
S->Q: <<create proxy_queue>>
Q-->S

alt proxy_handler.db.getCount() < 0
S->S: __runProxyFetch()
else
S->P: proxy_handler.getAll()
P-->S
end
S->C: Checker("use", proxy_queue)
C-->S
deactivate S
/' --__runProxyCheck-- '/
S --> A
deactivate S
@enduml

Author: Mrli

Link: https://nymrli.top/2022/04/04/PlantUML作图/

Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.

< PreviousPost
理了一天彻底弄懂元类——分享给你一起弄懂
NextPost >
开源项目代码阅读记录
CATALOG
  1. 1. 时序图