前两天,因为一个接口的参数问题,和一位前端工程师产生了一些分歧,需求很简单:
根据一个数值类型(type 取值范围1,2,3)来查询数据,如果没这个值,就是查询所有的数据;
这个需求很常见吧!但是在"没这个值"的问题上,想法不太一样:
- 接口定义的规范是,查询所有时,那就不传这个type,我后端拿到的就是null,在MyBatis的配置里面,通过if标签,对type判空,来决定是否带type这个条件:
<select id="query" parameterType="java.lang.Integer" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from order_info where 1 = 1
<if test="type != null">
AND TYPE = #{type,jdbcType=INTEGER}
</if>
</select>
- 前端工程师的意思是,没有值的话,那我就给你传默认值了,数值类型的默认值是:0,后端就需要根据type是否是0来查询所有;如果这么做,MyBatis中 type 就需要加上大于0的判断
<if test="type != null and type > 0">
AND TYPE = #{type,jdbcType=INTEGER}
</if>
虽然按着前端的想法,也确实可以实现,但是这个思路,似乎并没有很强的说服力;因为 0 本身就是一个具体的值,并不符合 type 的取值范围,在 Controler 层的参数校验,就应该被干掉;如果某一天因为需求调整,将 0 也表示为某个具体类型之后,这里代码就需要做调整,同时查询所有和查询这个新增 0 的类型就会混淆,前端的展示也会受到影响;
0 和 null 对象在本质上还是有很大区别的;
在各执一词的背景下,我在技术交流群里面和各位大佬简单交流了一下,不想因为的我的执着影响到其他人;
大部分大佬的做法和我想的是一致的!最终也让前端按我的要求做了对应的调整;
那这个问题的根源,还是出在数值类型的默认值上;加上群里面几天讨论了几次相关的一些问题,这里就汇总说一下;
在阿里巴巴Java开发手册中有这样的一条规范,跟我们今天说的问题,也有一些关联:
-
【强制】所有的