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

简介: 在审查中台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
值类型相关函数与对象类型相关函数内存调用过程
值类型相关函数与对象类型相关函数内存调用过程
|
Android开发 C++
C++使用初始化列表的方式来初始化字段
C++使用初始化列表的方式来初始化字段
62 0
|
1月前
如何处理构造函数中参数的默认值?
设置合理的默认值可以增加代码的灵活性和易用性,同时减少在调用构造函数时必须传递所有参数的要求。在处理默认值时,要确保其合理性和一致性,避免出现意外的行为或错误。你还想了解关于构造函数的其他方面吗?比如参数的验证等
36 1
|
7月前
|
C++
【C++】istream类型对象转换为逻辑条件判断值
【C++】istream类型对象转换为逻辑条件判断值
【C++】istream类型对象转换为逻辑条件判断值
|
7月前
|
JavaScript 前端开发
分享函数中 this 在不同场景下的指向与默认值,动态指定函数 this 值的方法
分享函数中 this 在不同场景下的指向与默认值,动态指定函数 this 值的方法
|
6月前
|
Java
java反射-属性赋值取值
java反射-属性赋值取值
|
7月前
|
存储 C#
C# 方法详解:定义、调用、参数、默认值、返回值、命名参数、方法重载全解析
方法是一段代码,只有在调用时才会运行。 您可以将数据(称为参数)传递给方法。 方法用于执行某些操作,也被称为函数。 为什么使用方法?为了重用代码:定义一次代码,然后多次使用。
150 0
|
7月前
自定义封装一个方法让这个方法可以判断所有的数据类型并返回
自定义封装一个方法让这个方法可以判断所有的数据类型并返回
40 0
|
Java 编译器
重载的方法能否根据返回类型进行区分?
重载的方法不能根据返回类型进行区分。方法的重载是基于方法名称和参数列表来进行区分的,与返回类型无关。这是因为在Java中,编译器在确定要调用哪个重载方法时,仅根据传递给方法的参数来进行决策。
381 0
|
JavaScript 前端开发
不同类型的循环
不同类型的循环
83 0