现状
有没有CodeView时,给别人巴拉巴拉讲了一堆,结果大多情况下只对结尾部分提问,遇到老手则会从开头部分提问。中间部分呢?看大家表情就知道,都没跟上思路。
这里需要个图
受不了的程序员,则会提出要求:这段逻辑超过3个流程,需要个图来帮助大家理解。
不用了吧,代码都实现了,还用画图?
画图这件事,轮到别人使劲往上推,轮到自己使劲往外推。
为什么画图这么反人性?
- 程序员写代码用IDE,画图需要打开另一个软件,切换麻烦,不符合
懒
这个标准 - 代码没写前,图上画什么呢?就算画上八成也会再改,更不符合
懒
都标准 - 代码写好后,画起来也别扭,位置挪来挪去始终不满意,画完也没有
成就感
为了解决第1个问题,主流的IDE都通过插件的方式支持了画流程图的功能,如MarkDown插件本身就有flow
的功能,还有增强的PlantUML
基本能满足大部分要求。
还是不好用
- 这些
flow
和PlantUML
画起来太麻烦,一条线得用十几甚至几十个字母,而且整块代码有大量重复,透着浓浓的坏味道
- 那使用直接从源码生成的调用关系图?可以想象这样生成的图要么太大,要么太乱,况且我们只需要画代码中的一部分流程,生成的图一般不可能凑巧把我们需要的部分画在一起
画图能做到零负担吗?
- 思维不能切换,主线是代码思维,不能因为画图而
切
出去 - 不能比实现代码增加任何东西,多一个单词都是一种
罪恶
- 不能花太多时间,超过1分钟的事都会引发严重的
拖延症
ZenUML
主角登场了,直接上例子,就拿上周做的FizzBuzz来展示。
画图的源码如下:
- 全部是伪代码表示
- 关键的模块和接口可以和实现代码复用
- 对于已经实现的代码,再用伪代码复制一次,如这个例子可以在1分钟内完成
@Starter(main)
ruleSet = RuleSet.all() {
DivideRule.create(3, Fizz)
DivideRule.create(5, Buzz)
ContainsRule.create(3, Fizz)
ContainsRule.create(5, Buzz)
}
game = new Game(ruleSet)
game:Game.play(count) {
for (i < count) {
item = new FizzBuzz(i)
result = item:FizzBuzz.apply(ruleSet)
println(result)
}
}
item:FizzBuzz.apply(ruleSet) {
atomicResult = ruleSet.apply(i)
componentResult = reduce(atomicResult)
result = getOrElse(componentResult, defaultResult)
}
渲染效果
如何使用?
- 直接在线使用 https://zenuml.com/
- 主流IDE插件也即将发布
- 最后也欢迎大家为此神器添砖加瓦
https://github.com/ZenUml