Java私有方法签名清晰度和更好的实践

时间:2015-05-07 05:32:57

标签: java code-readability

我收到了以下代码段的代码审核评论 -

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();内调用
  1. doMoreWork。因此签名变为doMoreWork(a, b),这一点更清楚。
  2. 我的问题 -

    由于doMoreWork()在循环中发生,我将服务对象传递给它。 doMoreWork()只是代码中的一个私有逻辑单元,它可以很好地携带" service"作为方法参数。这种方法永远不会公开。这种情况下的指导原则是什么?这里的清晰度或可读性如何受到影响?

    (注:

    1. getService()来电没有太大的性能开销,所以性能不是我的标准。
    2. 此处不提供服务注入。需要按照示例中显示的方式获取它。
    3. doMoreWork()不只是调用service.doingMoreWork()。它有一些预先步骤可以遵循。

7 个答案:

答案 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);
    }
}