大型商用项目中会使用哪些内置数值类型?
举两个例子: 由于我们几乎一直在 lua 下使用它,所以可以按需定制,但也不局限于 lua 使用。这两天,我便构思了下面的东西: 我们只需要提供 boolean integer (32bit signed int) string id (64bit unsigned int) 四种基础类型,和 array 以及 struct 两种用户定义的复合类型即可。 为什么没有 float ? 因为在我们这几年的项目中,使用 float 的地方少之又少,即使有,也完全可以用 string 传输。 为什么没有 enum ? 因为在业务层完全可以自己做 int 到 enum 的互转,没必要把复杂度放在通讯协议中。 为什么不需要 union ? 因为按 protocol buffer 的做法,结构中的每个域都可以用一个数字 tag 来标识,而不是用数据布局来指示。不需要传递的域不需要打包到传输包中。 为什么不需要 default value ? 我们的项目中,依赖 default value 的地方少之又少,反而从我维护 pbc 的大量反馈看,最容易被误用的用法就是通讯协议依赖一个字段有没有最终被打包。所以干脆让(不打包)等价于 default value 就好了。明确这个(在 google protocol buffer 中是错误的)用法。
在高并发的环境下,往往低到一个bit也是锱铢必较的。否则由于基数过大对IO造成的影响远不可估量,所以对数据类型的要求往往是控制很严格的,该是byte的就不能用word。而对于精度要求高的领域(如金融等),IEEE 754中的常见浮点数类型(如float、double)也难以达到要求,这种时候就要换个思维,要尽可能的先满足业务需求,所以就要各种高精度decimal类型涌上来。
同样的比如要保存精准时间点有ISO 8601 Datetime类型,同时也有timestamp这种东西,只要一个整数就可以了。权衡利弊的话,timestamp对空间占用较小,方便存储和传输,反过来问题就是没有Datetime那样灵活,而且还可能会出现Year 2038 problem。
另外,即便是对于云风来说,他所设计的ejoyproto(sproto)也是根据自身的需求来的:
所以,数据类型这种东西,在拿来做比较严肃的不那么闹着玩儿的东西的时候,除非你深有经验体会,能够把业务模型了解透彻。否则还是几个人一起老老实实的把需求和逻辑捋清楚了搞一套具体、详细的规格吧。