更好的Java方法语法?回来早还是晚?

Gan*_*alf 6 java coding-style return-path

重复: 函数是否只有一个return语句?

通常情况下,您可能会有一个检查众多条件并返回状态的方法(现在就说布尔值).最好定义一个标志,在方法中设置它,并在结尾返回它:

boolean validate(DomainObject o) {
  boolean valid = false;
  if (o.property == x) {
     valid = true;
  } else if (o.property2 == y) {
     valid = true;
  } ...
  return valid; 
}
Run Code Online (Sandbox Code Playgroud)

或者,一旦你知道方法的结果,简单地返回会更好/更正确吗?

boolean validate(DomainObject o) {

  if (o.property == x) {
     return true;
  } else if (o.property2 == y) {
     return true;
  } ...
  return false; 
}
Run Code Online (Sandbox Code Playgroud)

现在显然可能有try/catch块和所有其他类型的条件,但我认为这个概念很清楚.意见?

Seb*_*Seb 9

如果这是一种你将要拨打数千次的方法,那么提前返回会更好地实现[稍微提高]性能.

如果没有,那么我更喜欢迟到,因为它提高了可读性.

记住程序员通常比编写代码花更多的时间阅读,所以你可以做的任何事情都可以提高可读性.

  • 后期如何回归更具可读性?对我而言,回归迟到是令人费解的.我从中推断出,如果没有返回,该方法没有做它需要做的事情. (26认同)
  • 我发现标记方式的可读性不太准确,因为你必须完全遵循每个条件,方法调用等来知道是否有人在返回之前触摸了标志,而另一种选择你确定当属性等于x时你会无论发生什么,都会变成现实. (7认同)
  • 很明显,守卫代码是在 Java 中尽早返回的好地方。您不会“在中间切断流程”,因为流程尚未启动,并且您避免将方法的主体包装在 if 块中。当然,有时在保护代码之后抛出异常是合适的。多个嵌套块是可读性的敌人,而不是提前返回(但如果您有多个嵌套块,则提前返回会使情况变得更糟)。 (5认同)

Jon*_*eet 9

我更喜欢早退,避免深度筑巢.这是特别的方式开始真正正确的:测试什么,很简单,并获得了(或抛出异常),如果你能做到这样真的早.

如果它在方法的中间,它更像是一个判断调用.

请注意,我会立即重构您的示例以使用单个if:

boolean validate(DomainObject o) {    
  if (o.property == x || o.property2 == y) {
     return true;
  } ...
  return false; 
}
Run Code Online (Sandbox Code Playgroud)

我意识到这只是一个玩具示例,但我的观点是,总是值得寻找更多方法来简化代码:)


Bil*_*ard 5

与大多数编码风格一样,这实际上是一个偏好问题,但许多人认为保护条款是最佳实践.