我收到了以下代码段的代码审核评论 -
public void doWork(String a, Integer b) {
..
..
SomeService service = getService();
for (Integer i : numbers) {
doMoreWork(a, b, service);
}
}
private void doMoreWork(String a, Integer b, SomeService service) {
...
...
...
service.doingMoreWork(a, b);
}
审核建议 -
SomeService service = getService();
内调用doMoreWork
。因此签名变为doMoreWork(a, b)
,这一点更清楚。 我的问题 -
由于doMoreWork()
在循环中发生,我将服务对象传递给它。 doMoreWork()只是代码中的一个私有逻辑单元,它可以很好地携带" service"作为方法参数。这种方法永远不会公开。这种情况下的指导原则是什么?这里的清晰度或可读性如何受到影响?
(注:
getService()
来电没有太大的性能开销,所以性能不是我的标准。)
答案 0 :(得分:2)
如果您将doMoreWork()
重构为以下内容:
private void doMoreWork(String a, Integer b) {
SomeService service = getService();
service.doingMoreWork(a, b);
}
然后,您doMoreWork()
依赖于getService()
的功能。如果您想使用其他方法获取SomeService
对象,则必须重构此代码。因此,您可能希望坚持使用原始实现。
如果您使用像Spring这样的框架,可以将SomeService
注入到您的类中,如下所示:
@Autowired
private SomeService service;
// use the injected service here
private void doMoreWork(String a, Integer b) {
service.doingMoreWork(a, b);
}
答案 1 :(得分:0)
如果建议合适,则只需public class ResponseWrapper {
private Response response;
@JsonProperty("current_observation")
private CurrentObservation currentObservation;
// ...and so on
}
方法中的Service
对象。因此,只有在doMoreWork
方法中执行您的操作才能获得Service
对象。
如果在doMoreWork
之后添加了更多语句,那么loop
对象将持续很长时间,直到其范围存在(直到没有遇到关闭Service
),它将不会是垃圾因此,您应该在}
中致电getService()
并在doMoreWork
中传递2个参数。它会更容易理解。
答案 2 :(得分:0)
从代码清晰度的角度来看,doMoreWork
是知道其服务的类中的实例方法(即,它具有getService()
方法)。将Service
放在签名中会让读者想知道这种方法所指的是什么Service
,所以它有些令人困惑。但是,这样的签名在一个具有多种服务的类中具有完美的意义,并且必须对其中的几种进行相同类型的工作。
答案 3 :(得分:0)
老实说,除了doMoreWork
方法之外,声明变量是没有用的。这就是原因:
doWork
getService()
似乎始终返回SomeService
根据getService
是否只是一个字段的getter,那么最好直接使用该字段而不是通过该方法。但是,你真的不需要将这个值传递给方法。
答案 4 :(得分:0)
如果getService()
每次都返回一个新实例,那么将服务作为参数传递是有意义的,但其名称应该是createNewService()
。
在当前场景中,似乎getService()
总是返回相同的实例,因此将Service作为参数传递并没有任何区别,只会让读者感到困惑。
进一步添加,getService()
在同一个类中定义,而doMoreWork()
是私有方法,因此它总是引用相同的服务,而不是为什么要添加额外的步骤来传递{{1}每一次!
另一件事,如果Service
所做的只是调用doMoreWork()
,除了最好只删除这个方法并直接在循环中调用它,如下所示:
service.doingMoreWork(a, b);
答案 5 :(得分:0)
我同意代码审核,newStrings.length
应该在getService()
。
此外,我建议将服务作为您班级的依赖,也就是说,服务可以是您班级的一个字段。一些DI框架可以为您注入服务,例如 Spring framework 。
如果是这样,可以在班级的每个方法中引用doMoreWork()
。
答案 6 :(得分:0)
doMoreWork()
被标记为private
,这是该类的隐藏细节。
由于它不是public
,因此它不属于public
API或合同,因此它是一个可以更改的实现细节。
所以签名是什么并不重要,你问题中给出的理由只是个人偏好。
你永远不会在循环中创建一个新的JDBC连接,这将是非常低效的,即使有一个良好的连接池,这也是错误的。
不需要private
方法,只会增加混淆和意见。
public void doWork(@Nonnull final String s, @Nonnull final Integer i)
{
final SomeService service = getService();
for (final Integer n : numbers)
{
service.doingMoreWork(s, i);
}
}