ident协议高级程序员的任务


高级程序员的任务

高级程序员的任务,是找出问题的共性,不是学会流行工具的使用。

举个例子:
在与银行等第三方进行对接时,由于历史原因,其提供的数据没有组织成json、xml等通用结构,而是自己定义的。可能例子如下:

01|张三|20210501|30;

整体数据以分号结束,字段之间用竖线分割,第一个字段表示操作类型,比如:1代表存款。

从这样的字符串中分离出需要的数据,常规做法是编写专门程序。

与第一家银行对接,写了一堆程序,换第二家,又写了一堆。

仔细看这类问题,其实这类问题本质就是语法分析。上述内容,完全可以用文法表示如下:

命令::=存款命令|取款命令
存款命令::=01 &39; 姓名 &39; 日期 &39; 金额 &39;

但是,即使文法结构有了,如果每次针对不同文法,完全用程序手工实现语法解析,岂不是更麻烦。

能不能把底层基础做好,语法解析用组合的方式,而不是手工代码的方式。比如,上面的两条文法,程序如下:

// 对所有命令进行解析 // 对文法中或者结构进行最直观表述
// 用运算符&39;,表示文法的或者关系
mand() | mand()
}

// 存款解析
mand() {
// 用运算符&39;,表示文法的连接关系
ident(&39;) + oper(&39;) + name() + oper(&39;) + date() + oper(&39;) + money()
}

其中,ident、oper是系统提供的基本函数。ident表示取标识符,oper表示取操作符。

这样,针对不同接口,把规定的协议转换成文法,然后再用文法组合的方式进行处理。

这么做的最大好处是,极大的减少了bug发生的可能。

对特定数据进行语法解析的做法,不仅仅可以用于参数解析,日志记录分析也可以用。

上述做法,我们已经用rust实现。

如果转到java来实现,因为java不支持运算符重载,也不支持把二元参数函数做成中缀表达式,组合的形式可能只能如下:


1、用or函数表示或者关系
or(mand(), mand())

2、用and函数表示连接关系
and(ident(&39;), oper(&39;), name(), oper(&39;), date(), oper(&39;), money())

这类找到参数解析的共性,并提供基础函数的工作,是高级程序员该干的活。