还在Show me the code?试试xunit吧!

498 阅读6分钟

面对现实

编程之神(Linus)曾经说过:talk is cheap, show me the code.

image.png

作为一个后端程序员最开始我也很喜欢这么说,显得逼格跟大神一样高!但工作几年后,我不得不承认,不要说别人code,就连我自己半年前写的code我都不想看!为什么?因为一开始我以为的研发是这样:

image.png

但实际上更像这样:

image.png

看这无辜的小眼神,是的,本质上我们的工作没有两样。

理想情况下我们应该有完美的文档和代码。但现实中,你接手的是个N手系统,文档要么找不到,要么已经跟当前系统差异很大,而代码就像一个被打得鼻青脸肿的人一样难以辨认。每当出现线上问题时,我们就不得不去debug陌生的代码,而这往往搞得我们晕头转向。我那时总在想,有没有什么方法,能够让我们不看代码也能清楚的知道系统结构,快速定位到要修改的地方?

问题与答案

我等了很多年,这期间出现过一些有意思的技术,但最终没有一个能完全满足我的要求。于是我最终下决心自己做,这就有了xunit,一个可以快速搭建后端系统框架的可视化开发工具,效果如下:

image.png

xunit的特点包括:

  1. 集成在IDE里的可视化开发编辑器
  2. 使用流程图来的表达业务逻辑结构
  3. 每个节点对应一个代码处理单元

它给后端研发带来的好处是:

  1. 你不用一行行看代码就能清晰的知道整个业务的逻辑结构
  2. 流程图已经定义了处理顺序,你只需像做填空题一样用最少的代码去实现真正核心的逻辑
  3. 你随时可以从模型直接跳转到代码,普通的设计文档永远无法做到这点
  4. 它集成在IDE里。你不必担心IDE和设计工具之间的切换会打断程序员最宝贵的心流
  5. 设计和运行使用同一个模型。永远不会出现设计文档和实际系统不一致的问题
  6. 没有代码生成这种额外步骤,系统不会因为用了它而增加一堆既看不懂,也无法维护的东西

这难道不是后端研发一直梦寐以求的工具吗?

xunit同时支持IDEA和Eclipse,下面以IDEA为例,介绍其安装使用过程。

安装插件

在IDEA里面通过File->Settings->Plugins->Brows Repository打开插件仓库界面。 输入xross可以看到X-Series系列插件。选择Xross Unit Editor进行安装,重启IDEA即可

1

创建模型

通过File->New->Xross Uint Model打开对话框,输入模型名称后将在resources目录创建.xunit结尾的模型文件

image.png

我们的需求是创建一个字符串处理的业务逻辑:首先对请求中的字符串变量进行预处理,增加一个前缀,其次判断处理后的变量长度,如果大于10,则将该字符串转为大写。需求本身很简单,但可以完整的展示利用xunit创建系统的过程。

首先单击左侧工具栏的Processor按钮,再单击中间主窗口空白处放置我们的第一个单元。

image.png

接下来再单击Processor按钮,然后单击刚才创建的单元,我们就得到了顺序执行的两个单元:

image.png

最后单击Validator按钮,再单击第二个processor,得到一个分支结构:

image.png

点击各个节点,在属性窗口中将第一个名字改为Check input,第二个改为To upper case,整个流程改为demo proces。到此模型创建工作就完成了。

image.png

到此为止,我们没有写一行代码,但我们有了一个简单的逻辑结构,我们的设计工作就完成了,是不是非常便捷直观?

因为有缺省实现,现在demo process已经是一个可调用的模块,但不会有什么用处,接下来让我们干点老本行。

编写代码

引入依赖

xunit已经发布到maven中央仓库,POM里面增加如下配置即可:

<dependency>
    <groupId>com.xrosstools</groupId>
    <artifactId>xunit</artifactId>
    <version>2.2.1</version>
</dependency>

数据定义

任何的业务流程做的都是数据处理,在xunit中数据用空接口Context表示,我们首先来定义一个包含String成员变量的Context:

image.png

处理定义

流程图的节点表示对Context进行处理。xunit中定义了几种处理方式,比如对Context的成员变量进行处理,将一个Context转换为另一个Context,对Context进行对错判断等等。最基本的就是对成员变量进行处理,xunit中用Processor接口表示。

我们对Check input节点的实现如下,如果是空字符串则置为“-/-”,然后增加“Text:”前缀:

image.png

xunit用Validator接口表示判断处理实现。我们实现一个当字符串长度超过10时返回true的判断:

image.png

最后是将字符串全部变为大写,同样也是实现Processor接口:

image.png

绑定实现

为了将流程图中的各个节点和实现绑定,我们可以右键单击某个节点,选择Assign implementation class

image.png

然后输入类名即可:

image.png

其他几个节点也依葫芦画瓢就行。

调用模型

画图的目的是为了调用,调用的方式很简单,提供模型文件的名字和处理流程的名字就行。根据逻辑我们测试3个case。

  1. 输入空字符串
  2. 输入一个加前缀后长度不超过10的字符串
  3. 输入一个加前缀后长度超过10的字符串:

image.png

接下来是见证奇迹的时刻了:

image.png

可以看到结果完美符合预期。输入为空时,增加前缀后长度小于10,不会做转大写的操作;输入非空,增加前缀后长度也小于10,同样不会做转大写的操作;只有当增加前缀后长度大于10,才做转大写的操作。

xunit优势

上面只是牛刀小试,但已经足够展示xunit的能力。用xunit之后,你会发现之前靠人的努力自觉和流程规范强制的做法简直太low了。

image.png

借助xunit,你可以在一分钟内完成设计,跟人讲解系统时再也不用尴尬异常的show me the code!只要把xunit模型打开,一切都一目了然。维护系统时再也不用看大量的陌生代码或者到处去问。找到可疑模块后,只要双击节点就能看定位到代码。

怎么样,还不赶紧用起来。

参考资料

xunit,xstate和xdecision同属于开源低代码框架X-Series的一部分。关于xdecision,我会单独介绍。下面是其他一些资料:

低代码工具选项难题浅析

再要扯皮,就上Xstate

X-Series技术分享视频

X-Series ArchSummit PPT

X-Series Github地址

如果对X-Series感兴趣,欢迎加入技术支持群:

x-series支持群群聊二维码.png

希望我的工具能给广大的后端程序员带来些帮助。有什么问题咱们评论区见。