uml与图形描述语言
背景
最近要写一些项目的文档,需要用到UML,
考虑到修改的可分析性,希望能找一个能描述图形的语言,来绘制UML图.
UML
统一建模语言(Unified Modeling Language),
大约在1994-1995年被开发,2005年时被国际标准化组织接纳.
目前包含14种类型
结构型图形
-
静态图
- 类图(类的继承关系等)
- 对象图(更适合描述界门纲目科属种之类的)
- 包图
-
实现图
- 组件图(适合描述软件架构,功能组成)
- 部署图(适合描述软件部署的方式)
-
其他
- 剖面图
- 复合结构图
行为型图形
- 活动图(流程图)(顺序,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 | @startuml |
plantuml缺点
-
语义区分不明确,导致难以区分类别,无法绘制混合图.
既有rectangle这样许多图中都能使用的对象.
又有class这样只能用于类图的对象.
还有interface,note这样,在类图中有一种用法,在组件图中又有另一种用法的对象.
默认是依靠某个图中的特有对象作为识别图形种类的依据.
但由于语义本身区分有问题,导致[a] --> [b]
这样的内容.
既可以被解读为状态图,又可以被解读为时序图.
如果所有对象都能够全局通用,那么就容易绘制混合图.
结果plantuml并不方便. -
符号的滥用,
()
,[]
,:
,;
等被在不同环境下赋予了不同的意义,难以理解,难以记忆 -
拼写的滥用,
end while
,endwhile
两种都可以使用,-right-
, 可以缩写为-r-
-
没有明确的对象概念.
note只有在类图中可以被单独声明,而后以变量的方式引用.在其他图中完全不可. -
没有明确的作用域概念
目前除了类图,定义了的节点就成为全局节点.
比如 组件A有子组件k,组件B也想有个子组件叫k.
至少在AB之外称呼时希望使用A::k
,B::k
.
但目前只有k(全局)
-
难以嵌套
plantuml提供了includedef,include等方式嵌套内容.但无法渲染出图片…
目前仅仅支持以1
2
3
4
5note
{{
嵌套的内容
}}
end note的方式嵌套其他类型的图作为注释.
-
布局难搞
目前有1
2
3
4
5
6
7a -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选项应该差不多了)
- 允许显示声明图的类型
- 方便语法检查
- 方便歧义内容的判定
- 后端渲染时能够尽量让线不要交叉