buguge - Keep it simple,stupid

知识就是力量,但更重要的,是运用知识的能力why buguge?

导航

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

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

 

posted on 2024-10-22 09:28  buguge  阅读(6)  评论(0编辑  收藏  举报