面对现实
编程之神(Linus)曾经说过:talk is cheap, show me the code.
作为一个后端程序员最开始我也很喜欢这么说,显得逼格跟大神一样高!但工作几年后,我不得不承认,不要说别人code,就连我自己半年前写的code我都不想看!为什么?因为一开始我以为的研发是这样:
但实际上更像这样:
看这无辜的小眼神,是的,本质上我们的工作没有两样。
理想情况下我们应该有完美的文档和代码。但现实中,你接手的是个N手系统,文档要么找不到,要么已经跟当前系统差异很大,而代码就像一个被打得鼻青脸肿的人一样难以辨认。每当出现线上问题时,我们就不得不去debug陌生的代码,而这往往搞得我们晕头转向。我那时总在想,有没有什么方法,能够让我们不看代码也能清楚的知道系统结构,快速定位到要修改的地方?
问题与答案
我等了很多年,这期间出现过一些有意思的技术,但最终没有一个能完全满足我的要求。于是我最终下决心自己做,这就有了xunit,一个可以快速搭建后端系统框架的可视化开发工具,效果如下:
xunit的特点包括:
- 集成在IDE里的可视化开发编辑器
- 使用流程图来的表达业务逻辑结构
- 每个节点对应一个代码处理单元
它给后端研发带来的好处是:
- 你不用一行行看代码就能清晰的知道整个业务的逻辑结构
- 流程图已经定义了处理顺序,你只需像做填空题一样用最少的代码去实现真正核心的逻辑
- 你随时可以从模型直接跳转到代码,普通的设计文档永远无法做到这点
- 它集成在IDE里。你不必担心IDE和设计工具之间的切换会打断程序员最宝贵的心流
- 设计和运行使用同一个模型。永远不会出现设计文档和实际系统不一致的问题
- 没有代码生成这种额外步骤,系统不会因为用了它而增加一堆既看不懂,也无法维护的东西
这难道不是后端研发一直梦寐以求的工具吗?
xunit同时支持IDEA和Eclipse,下面以IDEA为例,介绍其安装使用过程。
安装插件
在IDEA里面通过File->Settings->Plugins->Brows Repository打开插件仓库界面。 输入xross可以看到X-Series系列插件。选择Xross Unit Editor进行安装,重启IDEA即可
创建模型
通过File->New->Xross Uint Model打开对话框,输入模型名称后将在resources目录创建.xunit结尾的模型文件
我们的需求是创建一个字符串处理的业务逻辑:首先对请求中的字符串变量进行预处理,增加一个前缀,其次判断处理后的变量长度,如果大于10,则将该字符串转为大写。需求本身很简单,但可以完整的展示利用xunit创建系统的过程。
首先单击左侧工具栏的Processor按钮,再单击中间主窗口空白处放置我们的第一个单元。
接下来再单击Processor按钮,然后单击刚才创建的单元,我们就得到了顺序执行的两个单元:
最后单击Validator按钮,再单击第二个processor,得到一个分支结构:
点击各个节点,在属性窗口中将第一个名字改为Check input,第二个改为To upper case,整个流程改为demo proces。到此模型创建工作就完成了。
到此为止,我们没有写一行代码,但我们有了一个简单的逻辑结构,我们的设计工作就完成了,是不是非常便捷直观?
因为有缺省实现,现在demo process已经是一个可调用的模块,但不会有什么用处,接下来让我们干点老本行。
编写代码
引入依赖
xunit已经发布到maven中央仓库,POM里面增加如下配置即可:
<dependency>
<groupId>com.xrosstools</groupId>
<artifactId>xunit</artifactId>
<version>2.2.1</version>
</dependency>
数据定义
任何的业务流程做的都是数据处理,在xunit中数据用空接口Context表示,我们首先来定义一个包含String成员变量的Context:
处理定义
流程图的节点表示对Context进行处理。xunit中定义了几种处理方式,比如对Context的成员变量进行处理,将一个Context转换为另一个Context,对Context进行对错判断等等。最基本的就是对成员变量进行处理,xunit中用Processor接口表示。
我们对Check input节点的实现如下,如果是空字符串则置为“-/-”,然后增加“Text:”前缀:
xunit用Validator接口表示判断处理实现。我们实现一个当字符串长度超过10时返回true的判断:
最后是将字符串全部变为大写,同样也是实现Processor接口:
绑定实现
为了将流程图中的各个节点和实现绑定,我们可以右键单击某个节点,选择Assign implementation class
然后输入类名即可:
其他几个节点也依葫芦画瓢就行。
调用模型
画图的目的是为了调用,调用的方式很简单,提供模型文件的名字和处理流程的名字就行。根据逻辑我们测试3个case。
- 输入空字符串
- 输入一个加前缀后长度不超过10的字符串
- 输入一个加前缀后长度超过10的字符串:
接下来是见证奇迹的时刻了:
可以看到结果完美符合预期。输入为空时,增加前缀后长度小于10,不会做转大写的操作;输入非空,增加前缀后长度也小于10,同样不会做转大写的操作;只有当增加前缀后长度大于10,才做转大写的操作。
xunit优势
上面只是牛刀小试,但已经足够展示xunit的能力。用xunit之后,你会发现之前靠人的努力自觉和流程规范强制的做法简直太low了。
借助xunit,你可以在一分钟内完成设计,跟人讲解系统时再也不用尴尬异常的show me the code!只要把xunit模型打开,一切都一目了然。维护系统时再也不用看大量的陌生代码或者到处去问。找到可疑模块后,只要双击节点就能看定位到代码。
怎么样,还不赶紧用起来。
参考资料
xunit,xstate和xdecision同属于开源低代码框架X-Series的一部分。关于xdecision,我会单独介绍。下面是其他一些资料:
如果对X-Series感兴趣,欢迎加入技术支持群:
希望我的工具能给广大的后端程序员带来些帮助。有什么问题咱们评论区见。