1. 程式人生 > >那些年,我追過的繪圖語言(續)

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

微信 ont 字符 send ogr html wrap ack 時空

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點與您相會。

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