那些年,我追過的繪圖語言(續)

自從上一篇文章發布後,大家給我推薦了不少繪圖工具,比如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)nparticipant Tars // (2)nactor Copper // (3)ndatabase MurphynnTars -> Copper // (4)nCopper --> Murphy: morse code // (5)n@enduml // (6)n

(1) 聲明一個圖形的起始

(2) 聲明一個participant,可以省略

(3) 如果想使用其它圖例(不是participant),則不能省略

(4) 聲明兩個participants間的消息, -→ 為虛線, → 為實線

(5) 消息可以添加說明

(6) 聲明一個圖形的結束

生成出來如下圖所示:

相信不用解釋,大家都懂。

你可以嘗試將participant換成如下圖示:

  • actor

  • boundary

  • control

  • entity

  • database

會有不同的效果。如果你的participant的名字很複雜,可以使用 as 起別名:

@startumlnactor "星際穿越的n<b>男主角</b>" as copper #99ff99 // (1) (2) (3)nactor "星際穿越的n男主女兒" as murphy #rednncopper -[#orange]> murphy: 愛和<font color=red>引力</font>可以穿越時空 // (4) (5)n@endumln

(1) 可以給participant起別名,別名不必和顯示的字元一致

(2) 顯示的字元可以使用n等ascii控制字元,也可以使用html標籤

(3) participant可以在結尾賦一個顏色

(4) message可以在 - 和 > 間插入一個顏色,以 [] 區隔

(5) startuml支持中文,如果編譯時遇到問題,請查看charset設置(設成utf-8)

生成出來的圖表如下:

如果明白了這兩個例子,咱們繼續:

@startumlnscale 1024*768 (1)n[--> Tars: "They" provides data inside singularity (2)nnactivate Tars (3)nTars -> Copper: sending datanactivate CoppernnCopper -> Copper: translate it to morse code (4)nactivate MurphynnCopper -> Murphy: send morse code through watchnnCopper -> Tars: ask for next batchndeactivate Copper (5)nnMurphy -> Murphy: record and parse morse codennMurphy -->]: figured out the formula (6)nndeactivate Murphyndeactivate Tarsn@endumln

(1) 我們希望生成的圖片大一些

(2) [→(注意中間不要有空格),傳入到當前序列圖的消息(participant不在該圖中)

(3)(5) activate / deactivate 用於指定participant的lifeline

(4) participant可以發消息給自己

(6) →](中間不要有空格),傳出當前序列圖的消息(participant不在該圖中)

生成的圖表如下:

Activity diagram

有了sequence diagram的基礎,學習activity diagram易如反掌,直接上代碼,不過多解釋(程序猿應該對if else很熟悉了):

@startumlnnscale 1024*768nnstartnnif (exec Lazarus?) then (yes)n :find a livable planet; (*)n :save **human beings**;nelse (no)n :keep adapting,n __keep farming__ and <font color=red>keep dying</font>;nendifnnstopnn@endumln

(*) 一個activity以 : 開始,以 ; 結束。有了sequential diagram的基礎,開始寫activity diagram總會忘記後面的分號。嗯,你忘呀忘呀,錯呀錯呀,就慢慢習慣了。

這個生成的圖表如下:

來個進階的:

@startumlnnscale 512*1024nn|Romilly| (1)nstartnrepeat (2)n :record the data from black hole;n :keep waiting;nrepeat while (Copper & Brand are not back?)nn|#AntiqueWhite|Copper| (3)nn:enter the Endurance;nnwhile (has more video tapes?) (4)n :watch it;n :cry;nendwhilennendnn@endumln

(1)(3) 使用 | 創建帶泳道的活動圖,自泳道聲明以下的活動都屬於該泳道,泳道可以定義顏色

(2)(4) 兩種不同的循環方式,像不像寫代碼?

幾乎一下子就能看懂了,是不?

生成的圖表如下:

繼續進階:

@startumlnscale 1024*768nnstartnn:first planet: Miller;nnfork (1)n :Romilly: stay in the Endurance;nfork again (2)n :Copper et al: go to planet Miller;n :giant wave comes;n forkn :Copper found wave, but helpless;n fork againn :Brand is racing against the wave;n fork againn :Doyle wait for Brand;n :Doyle died;n kill (3)n endforkn :they finally left the planet;nendfork (4)nn@endumln

(1)(2)(4) fork,fork again,endfork 用來描述並發線程

(3) kill 終結一個線程,plantuml的例子中使用 detach,經測試,detach 不可用

生成的圖表如下:

最後,; 作為一個活動的終止,這是最標準的圖例;如果將每個活動最後的 ; 換成其它符號:|,<,>,/,},可以顯示不同的圖例。不解釋,具體看下述代碼和對應的圖表:

@startumlnscale 2n:Ready;n:next(o)|n:Receiving;nsplitn :nak(i)<n :ack(o)>nsplit againn :ack(i)<n :next(o)n on several line|n :i := i + 1]n :ack(o)>nsplit againn :err(i)<n :nak(o)>nsplit againn :foo/nsplit againn :i > 5}nstopnend splitn:finish;n@endumln

生成的圖表:

就這些,應該夠你學一陣子的啦。

最近「奇博士的管理課」正在構思第二章的內容,更新有點慢,請稍安勿躁。感興趣可以點擊「閱讀原文」在百度閱讀訂閱。 如果您覺得這篇文章不錯,請點贊。多謝!

歡迎訂閱公眾號『程序人生』(搜索微信號 programmer_life)。每篇文章都力求原汁原味,早8點與您相會。

推薦閱讀:

TAG:迷思 | 「奇博士的管理课」 |