1,不谈 json,绝大部分持久化协议都有类型系统。为什么?可能这些协议设计者规范制定者都是傻子吧!
2,json 大数字导致 js 解析失败的问题,是怪 json ?我扔个 20 位的字符串你 js 真的就能按 long 处理了吗?我扔个 2000 位的呢?我扔个 10^20 的大数字字符串把你内存撑爆了你是不是还是怪 json ?冤有头债有主,
https://www.npmjs.com/package/long 了解一下。要搞科学计算的,请自己实现大数字的解析和计算。别死抓着系统 json 解析库不放,却怪字段类型。
3,类型错误导致异常的同学,硬生生通过消灭错误的根源解决了错误。你们真厉害,跟 zf 一个处理思路。那值错误问题呢?想个办法也消灭掉?参数个数问题呢?变长参数嘛!参数顺序问题呢?调用时用字典传参写明 key/value 对嘛。参数名拼写问题呢?我编不下去了。。。不过我想聪明人应该能解决,办法总比问题多嘛!
——以上是恶搞,以下是正经分析——
其实还有一点是非常重要的:信息抹除。原接口设计和数据 /参数持久化是携带了类型信息的,被硬生生抹除了。
接口 a 需要一个 int,传了个"0",
接口 b 需要一个 string,传了个"0",
接口 c 需要一个 bool,传了个"0"。
他们默默做类型转换的时候,揣摩通透服务端的意图了吗?万一服务端真的 bug 了,就输出了一个错误的类型,你能察觉吗?
这是信息抹除带来的第一个问题:错误被掩盖。
第二个问题可能是某些人习以为常的:文档上说入参均为 string,但其实具体实现中会对他们做对应的转型操作。转错了程序当然没法正确执行。这使得人们更依赖所谓的文档,却直接丢弃了语言 /协议 /架构 /方案自身的自描述和自检能力。“最好的文档就是代码本身”这句话的价值不是为懒得写文档找借口,而是真正的金玉良言。
第三个问题随着第二个问题而来,文档缺失和过期大概是实际项目中的常态,信息抹除所带来的额外信息恢复工作就变成了一项困难的事,增加更多不必要的成本和风险,以及团队沟通成本、技术管理成本。
那么为什么很多“给别人用的接口”反而倾向于这样设计呢?容错性表面上能稍微好一点,而额外带来的风险和成本又不必自己承担。典型的就是给第三方用的接口、给其他部门用的接口、给其他团队用的接口。后端给 app 扔个这样的接口,不必沟通,不必争论,暂时性的增加了双方的幸福感。有种让他在团队内部同一项目内声明一堆 Object... args 的方法?怕不被自己人打死。
说白了,这就是懒惰+短视+自私的人性抉择。