uml与图形描述语言

背景

最近要写一些项目的文档,需要用到UML,
考虑到修改的可分析性,希望能找一个能描述图形的语言,来绘制UML图.

UML

统一建模语言(Unified Modeling Language),
大约在1994-1995年被开发,2005年时被国际标准化组织接纳.

目前包含14种类型

结构型图形

  1. 静态图

    • 类图(类的继承关系等)
    • 对象图(更适合描述界门纲目科属种之类的)
    • 包图
  2. 实现图

    • 组件图(适合描述软件架构,功能组成)
    • 部署图(适合描述软件部署的方式)
  3. 其他

    • 剖面图
    • 复合结构图

行为型图形

  • 活动图(流程图)(顺序,if,loop等)
  • 状态图(状态的切换)
  • 用例图(用户甲有abc功能,用户乙有abd功能)

交互型图形

  • 通信图
  • 交互概述图
  • 时序图(类似AB两人的聊天记录)
  • 时间图(类似CPU取指令,读指令,执行指令等)

typora的图形支持

虽然有3种方式,但在图形的表现力方面依然可以用孱弱来形容
不知道typora为什么总是抱着xxx.js这样的前端工具不放.

js-sequence

仅仅能画 时序图

flowchar.js

仅仅能画 流程图

memaid

支持图形稍微多一些

  • 时序图
  • 流程图
  • 甘特图
  • 类图
  • 状态图
  • 饼图

更为知名的plantuml

专门为绘制uml而生.支持UML也最多(上面有注释的UML,palntuml都能画)
同时也还能支持其他的图形

  • json,yaml等的可视化
  • 甘特图
  • WBS
  • ER图
  • 思维导图
  • 数学公式
  • 等等等等

还能

  • 嵌入富文本,表情符号,图标,灰度图(Sprite图)

文件后缀通常是 .puml.pu
不过仅仅描述而不绘制,绘制由graphviz完成.

DOT

似乎是graphviz官方推荐的语言.

描述方式上看起来更底层一些

  • 节点

配合一些属性

  • label
  • color
  • shape
  • style
  • image

完成图形的绘制

graphviz

Graph Visualization Software的缩写.
AT&T实验室的开源工具包.

TODO plantuml与dot语言的关系?

还有为什么plantuml能够以graphviz为后端?
是后台转换为了dot语言吗

plantuml入门

plantuml没有类似DOT语言的基本概念.基本上按照例子绘制即可.
一些特殊知识

  • 注释: ' 引起单行注释, /''/ 包含多行注释
  • 支持html特性, <u>xxx<u> 可以绘制出有下划线的效果, <font color=red>xxx</font> 控制字体等
  • 支持声明变量

比如一个流程图的例子

1
2
3
4
5
6
7
8
9
10
@startuml
start
:hello;
if (已经安装?) then (yes)
:开始使用;
else (no)
:先预览;
endif
stop
@enduml

plantuml缺点

  1. 语义区分不明确,导致难以区分类别,无法绘制混合图.
    既有rectangle这样许多图中都能使用的对象.
    又有class这样只能用于类图的对象.
    还有interface,note这样,在类图中有一种用法,在组件图中又有另一种用法的对象.
    默认是依靠某个图中的特有对象作为识别图形种类的依据.
    但由于语义本身区分有问题,导致 [a] --> [b] 这样的内容.
    既可以被解读为状态图,又可以被解读为时序图.
    如果所有对象都能够全局通用,那么就容易绘制混合图.
    结果plantuml并不方便.

  2. 符号的滥用, (), [], :, ; 等被在不同环境下赋予了不同的意义,难以理解,难以记忆

  3. 拼写的滥用, end while, endwhile 两种都可以使用, -right-, 可以缩写为 -r-

  4. 没有明确的对象概念.
    note只有在类图中可以被单独声明,而后以变量的方式引用.在其他图中完全不可.

  5. 没有明确的作用域概念
    目前除了类图,定义了的节点就成为全局节点.
    比如 组件A有子组件k,组件B也想有个子组件叫k.
    至少在AB之外称呼时希望使用 A::k, B::k.
    但目前只有 k(全局)

  6. 难以嵌套
    plantuml提供了includedef,include等方式嵌套内容.但无法渲染出图片…
    目前仅仅支持以

    1
    2
    3
    4
    5
    note
    {{
    嵌套的内容
    }}
    end note

    的方式嵌套其他类型的图作为注释.

  7. 布局难搞
    目前有

    1
    2
    3
    4
    5
    6
    7
    a -right- b
    a -left- b
    a -down- b
    a -up- b

    ' 甚至还模仿npm一样可以使用前n个字母
    a -r- b

    尽管官方说graphviz不一定能遵守.
    但使用下来,只要线/节点之比大于2graphviz几乎是一定不遵守

理想的描述方式

  • 拥有基础的概念,就像DOT语言那样(图,节点,边)
  • 基于这些基础概念定制出一系列的alias,并且不允许用符号作为alias比如 (), []
    • 比如 rectangle 就可以称为 节点(形状:矩形)
    • 比如 use a 可以称为 边(虚线,空心方箭头)
  • 拥有继承概念
    • 比如用户可以声明 red rectangle,而不必像plantuml一样在全局作用域内使用 skinparam <某参数> <参数值>
  • 支持以类似四角号码的方式规定某个对象的具体位置(将css删减到只剩下position选项应该差不多了)
  • 允许显示声明图的类型
    • 方便语法检查
    • 方便歧义内容的判定
  • 后端渲染时能够尽量让线不要交叉

参考

  1. typora的图形支持
  2. mermaid与plantuml对比
  3. plantuml主页