那些年,我追過的繪圖語言(續)
https://zhuanlan.zhihu.com/p/19901245
****************************
那些年,我追過的繪圖語言(續)
陳天 3 年前自從上一篇文章發布後,大家給我推薦了不少繪圖工具,比如startUML,rose,TikZ package,flowchart.js,matlab,R等等。感興趣的可以自行研究。至於matlab/R這樣的工具,雖然強大,但跟本文討論的畫一般意義的設計圖(如uml圖)無關。
鑒於很多讀者想進一步了解plantUML,這篇文章就多講講PlantUML。
plantUML支持如下UML圖:
-
Sequence diagram
-
Usecase diagram
-
Class diagram
-
Activity diagram
-
Component diagram
-
State diagram
-
Object diagram
-
GUI Wireframe
這裏面,我用的最多的是sequence diagram(序列圖)和activity diagram(活動圖),也就主要講講這兩個圖,其它的請自行閱讀plantUML的文檔。
Sequence diagram
sequence diagram裏每個角色被稱為participant,participant之間可以有message,比如這樣一個最基本的序列圖
@startuml // (1) participant Tars // (2) actor Copper // (3) database Murphy Tars -> Copper // (4) Copper --> Murphy: morse code // (5) @enduml // (6)
(1) 聲明一個圖形的起始
(2) 聲明一個participant,可以省略
(3) 如果想使用其它圖例(不是participant),則不能省略
(4) 聲明兩個participants間的消息, -→ 為虛線, → 為實線
(5) 消息可以添加說明
(6) 聲明一個圖形的結束
生成出來如下圖所示:
相信不用解釋,大家都懂。
你可以嘗試將participant換成如下圖示:
-
actor
-
boundary
-
control
-
entity
-
database
會有不同的效果。如果你的participant的名字很復雜,可以使用 as 起別名:
@startuml actor "星際穿越的\n<b>男主角</b>" as copper #99ff99 // (1) (2) (3) actor "星際穿越的\n男主女兒" as murphy #red copper -[#orange]> murphy: 愛和<font color=red>引力</font>可以穿越時空 // (4) (5) @enduml
(1) 可以給participant起別名,別名不必和顯示的字符一致
(2) 顯示的字符可以使用\n等ascii控制字符,也可以使用html標簽
(3) participant可以在結尾賦一個顏色
(4) message可以在 - 和 > 間插入一個顏色,以 [] 區隔
(5) startuml支持中文,如果編譯時遇到問題,請查看charset設置(設成utf-8)
生成出來的圖表如下:
如果明白了這兩個例子,咱們繼續:
@startuml scale 1024*768 (1) [--> Tars: "They" provides data inside singularity (2) activate Tars (3) Tars -> Copper: sending data activate Copper Copper -> Copper: translate it to morse code (4) activate Murphy Copper -> Murphy: send morse code through watch Copper -> Tars: ask for next batch deactivate Copper (5) Murphy -> Murphy: record and parse morse code Murphy -->]: figured out the formula (6) deactivate Murphy deactivate Tars @enduml
(1) 我們希望生成的圖片大一些
(2) [→(註意中間不要有空格),傳入到當前序列圖的消息(participant不在該圖中)
(3)(5) activate / deactivate 用於指定participant的lifeline
(4) participant可以發消息給自己
(6) →](中間不要有空格),傳出當前序列圖的消息(participant不在該圖中)
生成的圖表如下:
Activity diagram
有了sequence diagram的基礎,學習activity diagram易如反掌,直接上代碼,不過多解釋(程序猿應該對if else很熟悉了):
@startuml scale 1024*768 start if (exec Lazarus?) then (yes) :find a livable planet; (*) :save **human beings**; else (no) :keep adapting, __keep farming__ and <font color=red>keep dying</font>; endif stop @enduml
(*) 一個activity以 : 開始,以 ; 結束。有了sequential diagram的基礎,開始寫activity diagram總會忘記後面的分號。嗯,你忘呀忘呀,錯呀錯呀,就慢慢習慣了。
這個生成的圖表如下:
來個進階的:
@startuml scale 512*1024 |Romilly| (1) start repeat (2) :record the data from black hole; :keep waiting; repeat while (Copper & Brand are not back?) |#AntiqueWhite|Copper| (3) :enter the Endurance; while (has more video tapes?) (4) :watch it; :cry; endwhile end @enduml
(1)(3) 使用 | 創建帶泳道的活動圖,自泳道聲明以下的活動都屬於該泳道,泳道可以定義顏色
(2)(4) 兩種不同的循環方式,像不像寫代碼?
幾乎一下子就能看懂了,是不?
生成的圖表如下:
繼續進階:
@startuml scale 1024*768 start :first planet: Miller; fork (1) :Romilly: stay in the Endurance; fork again (2) :Copper et al: go to planet Miller; :giant wave comes; fork :Copper found wave, but helpless; fork again :Brand is racing against the wave; fork again :Doyle wait for Brand; :Doyle died; kill (3) endfork :they finally left the planet; endfork (4) @enduml
(1)(2)(4) fork,fork again,endfork 用來描述並發線程
(3) kill 終結一個線程,plantuml的例子中使用 detach,經測試,detach 不可用
生成的圖表如下:
最後,; 作為一個活動的終止,這是最標準的圖例;如果將每個活動最後的 ; 換成其它符號:|,<,>,/,},可以顯示不同的圖例。不解釋,具體看下述代碼和對應的圖表:
@startuml scale 2 :Ready; :next(o)| :Receiving; split :nak(i)< :ack(o)> split again :ack(i)< :next(o) on several line| :i := i + 1] :ack(o)> split again :err(i)< :nak(o)> split again :foo/ split again :i > 5} stop end split :finish; @enduml
生成的圖表:
就這些,應該夠你學一陣子的啦。
最近「奇博士的管理課」正在構思第二章的內容,更新有點慢,請稍安勿躁。感興趣可以點擊「閱讀原文」在百度閱讀訂閱。 如果您覺得這篇文章不錯,請點贊。多謝!
歡迎訂閱公眾號『程序人生』(搜索微信號 programmer_life)。每篇文章都力求原汁原味,早8點與您相會。
那些年,我追過的繪圖語言(續)