走查我们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对象。