一个更加的KISS设计
翻开UNIX圣经《UNIX编程艺术》一书中,第107页第五段落写着:“当你很想设计一个很复杂的二进制文件格式,或一个复杂的二进制应用协议时,通常,明智的做法是躺下来等待这种感觉过去,如果担心性能问题,就在应用协议之上或者之下的某个层面上压缩文件协议流,最终产生的设计会比二进制协议更干净,性能可能也更好(文本压缩起来更好,更快)”——《UNIX编程艺术》
我们以前的一个项目中。就有这样的需求,就是客户端和服务器的协议设计问题。比如移动的营销案优惠信息数据:有多个营销案模版,每一个营销案模版有多个营销案信息。以前我们的做法是,将所有的营销案模版数据打包成为二进制信息,放在CCmEngine对象内存中。
CCmdEngine是一个具体的包的一个抽象。一个具体包中还分有多个字段域。每一个字段域放入一个CmdEngine模版对象,在版对象的字段域中,放入多个营销案信息。这样有多个CmdEngine对象层层组成了一个树型的数据结果。比如以前我们营销案信息查询1000001
命令字一样。
从传统的UNIX的设计者哲学来说,肯定有很多不如人意的地方。主要问题是,整个协议数据密不透风。出了BUG,很难调试。
后来设计优惠信息查询1000026命令字的时候,我努力坚持要废掉这样的设计。而尽量使用可视的文本流,使用分隔符分割的协议。就是每一个模版信息使用分号“;”隔开,而同一个模版之间的营销案信息使用 波浪号“~“隔开。那么整一个营销案优惠信息就变成了使用;
号和~号隔开的文本,然后将整个文本放入CmdEgnine对象的某一个字段域既可。还可以将整个文本打印在日志中,方便以后的调试和查找BUG。
不过这存在一个潜在的问题就是:假如营销案信息中存在~和;字符的话就会破坏整个协议的约定内容。所以还必须对营销案的信息内存进行base64编码然后用~和;符隔开。
整个开发都非常顺利。调试都非常方便,设计很简洁,所有的bug都无所遁形。客户端方面的同事也很满意。
最大的好处,还是大家都节省了时间和精力,每天下班以后都可以准时的打卡走人