发现问题就解决,往往是低效的方式。关于对象参数的赋值取值问题

简介: 在审查中台task服务代码时,发现TaskVO对象的industryTypeName字段在某些方法调用中未进行空值检查,导致潜在bug。提出两种解决方案:一是在方法③中增加对industryTypeName的空值判断;二是改变方法③的参数类型,避免外部调用方直接设置industryTypeName,从而减少错误发生的可能性。

走查我们zhongtai-task(中台的task服务,注意,这个task不是Spring/Java里的task,而是我司业务中的企业用工任务)代码时发现一个问题。

 

先看下面的方法调用关系

TaskJobProxy#updateTaskStatus

 

TaskLevyReviewServiceImpl#levyAudit

 
 

TaskApplyServiceSync#auditCreateTaskApplySync(TaskVO,...)

 

 

然后,看方法③所调用的部分方法。

 

TaskApplyServiceSync#auditCreateTaskApplySync

 
 

TaskApplyServiceSync#batchSaveTaskApply(TaskVO,...)

 

RecommendService#bosskgRecommend(TaskVO)

 

说明:

  • 方法③接收的一个参数是 TaskVO对象,并将这个对象向下传递给 方法④ 和⑤。
  • TaskVO 有一个field叫 industryTypeName。方法④ 和 ⑤ 都用到了它。其中,方法 ⑤ 里判断了 industryTypeName为空的情况,而④未判断。
  • 再回头说方法①和②。 方法①未对 industryTypeName 赋值。方法②有对 industryTypeName 赋值。

 

 

问题来了,方法④显然出现bug了。

 

那么,如何解决这个bug?

 

哪里出问题就解决哪里。 ------->修改方法④,做成与方法⑤那样,加上判断 industryTypeName为空的情况。

 

发现问题就解决,往往是低效的方式。

试想,假如日后需求迭代,要求方法③再调用一个方法⑥,同样传递 TaskVO对象,⑥里同样会用到 industryTypeName。 谁会注意  industryTypeName 是否为空呢?

 

那,当如何解题呢???

 

解题方式一:

解铃还须系铃人。我们把目标聚焦在方法③,既然要使用 TaskVO#industryTypeName,那就在方法③的起始行对入参TaskVO对象的 industryTypeName 进行空值判断。如果为空,则可根据数据关系来为其赋值,或直接返回错误,具体视业务需要而定。

 

解题方式二:

我们依然是把目标聚焦在方法③。我们要分析这个方法的职责,如果理应由它来为 industryTypeName 赋值,那就不要对外暴露 industryTypeName。就是说,要么去掉TaskVO的industryTypeName 属性,要么不暴露 TaskVO类型的对象。


通过分析,的确不应该由调用方来为 industryTypeName 赋值。因此,我们变更方法③的入参,将参数类型由TaskVO改为更加原子的Task。然后,在这个方法内部内部构造TaskVO对象。

 

目录
相关文章
|
7月前
|
Java
值类型相关函数与对象类型相关函数内存调用过程
值类型相关函数与对象类型相关函数内存调用过程
|
7月前
|
C++
成员初始化表的执行顺序与顺写顺序无关
成员初始化表的执行顺序与顺写顺序无关
55 0
|
4月前
|
Go 数据处理
深入理解函数返回多个值的机制
【8月更文挑战第31天】
12 0
|
7月前
|
C++
【C++】istream类型对象转换为逻辑条件判断值
【C++】istream类型对象转换为逻辑条件判断值
【C++】istream类型对象转换为逻辑条件判断值
|
7月前
|
JavaScript 前端开发
分享函数中 this 在不同场景下的指向与默认值,动态指定函数 this 值的方法
分享函数中 this 在不同场景下的指向与默认值,动态指定函数 this 值的方法
|
7月前
2020-10-10 数组和对象的区分方法
2020-10-10 数组和对象的区分方法
默认移动构造、默认移动赋值自动生成的条件
默认移动构造、默认移动赋值自动生成的条件
170 0
|
监控 Cloud Native Java
字节码编程,Byte-buddy篇二《监控方法执行耗时动态获取出入参类型和值》
在前面的ASM、Javassist 章节中也有陆续实现过获取方法的出入参信息,但实现的方式还是偏向于字节码控制,尤其ASM,更是需要使用到字节码指令将入参信息压栈操作保存到局部变量用于输出,在这个过程中需要深入了解Java虚拟机规范,否则很不好完成这一项的开发。但!ASM也是性能最牛的。其他的字节码编程框架都是基于它所开发的。
707 0
字节码编程,Byte-buddy篇二《监控方法执行耗时动态获取出入参类型和值》
|
Java
JAVA数组批量设值(初始化)的办法
JAVA数组批量设值(初始化)的办法
147 0
判断某个值是否在多维关联数组中 返回该值的所在的关联数组
判断某个值是否在多维关联数组中 返回该值的所在的关联数组
89 0