- 默认参数的函数,特别是默认有效枚举
默认参数一般只适用于数字意义的整型(0)和文本意义的字符串(""),否则全局都搜不出的问题枚举很难想到是这个问题。此类问题很容易出bug,尽量避免设计默认枚举的函数,
- 从0开始定义有效枚举
结构体的枚举默认值如果就是有效枚举的话,相当于空数据会被默认为有效数据,譬如该枚举作为“类别”的意义时,开发人员不够敏感的话,会在该类别的逻辑上浪费很长的时间debug。
- 仅在二级以上的缓存做逻辑判断
这类问题也不少见,有的设计是在表层缓存数据完成更新,然后用一定的策略层层同步数据。有的设计是最表层直接更新且把结果返回客户端,同时再更新下层的缓存。但是有可能同步的队列还未完成时,新的update请求又发下来(同时发两个逻辑依赖的耗时操作),新的请求可能在下层发生错误,比如先add一个队列后立刻update这个队列,下层会找不到队列中的首个数据而update失败。此类架构的解决方法只能是延时操作或者使用「请求响应」模式,而不是「通知维护」模式。
- 用32位数据放时间戳
考虑越界问题
type | limit | time |
---|---|---|
int | 2147483647 | 2038-01-19 11:14:07 |
unsigned int | 4294967295 | 2106-02-07 14:28:15 |
- 用整型数据储存53位以上的二进制数据
比如常见的用一个int值来表达某个类似TI本子道具的某50位等级奖励领取状况,但是一些客户端用的动态语言的“number”类型实质上就是默认double64,比如Unity常用的lua和JavaScript。
按照IEEE浮点标准 决定了第54位起的有效数字会被忽略,即恒为零。
网友评论