zoukankan      html  css  js  c++  java
  • 那些年,我追过的绘图语言(续)

    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 "星际穿越的
    <b>男主角</b>" as copper #99ff99 // (1) (2) (3)
    actor "星际穿越的
    男主女儿" as murphy #red
    
    copper -[#orange]> murphy: 爱和<font color=red>引力</font>可以穿越时空      // (4) (5)
    @enduml

    (1) 可以给participant起别名,别名不必和显示的字符一致
    (2) 显示的字符可以使用 等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点与您相会。

  • 相关阅读:
    Java集合框架——Map接口
    深入分析——HashSet是否真的无序?(JDK8)
    你这辈子最引以为傲的是什么?
    全网Star最多(近20k)的Spring Boot开源教程 2019 年要继续更新了!
    Spring Cloud Alibaba与Spring Boot、Spring Cloud之间不得不说的版本关系
    Spring Cloud Alibaba基础教程:Nacos的集群部署
    Spring Cloud Alibaba基础教程:Nacos的数据持久化
    Spring Cloud Alibaba基础教程:Nacos配置的多文件加载与共享配置
    Spring Cloud Alibaba基础教程:Nacos配置的多环境管理
    Spring Cloud Alibaba基础教程:Nacos配置的加载规则详解
  • 原文地址:https://www.cnblogs.com/zhao1949/p/6999215.html
Copyright © 2011-2022 走看看