10

我们正在与我的同事讨论内部任务,例如:

return result = myObject.doSomething();

或者

if ( null == (point = field.getPoint()) )

这些是可以接受的还是应该用以下内容代替,为什么?

int result = myObject.doSomething();
return result;

或者

Point point = field.getPoint();
if ( null == point)
4

11 回答 11

20

内部作业更难阅读,也更容易错过。在复杂的情况下,它甚至可能被遗漏,并可能导致错误。

例如。如果条件评估阻止为变量赋值,这将是一个很难发现的错误:

if (i == 2 && null == (point = field.getPoint())) ...

如果i == 2为 false,则点变量稍后将没有值。

于 2012-06-27T08:26:18.717 回答
8

if ( null == (point = field.getPoint()) )

优点:

  • 少一行代码

缺点:

  • 可读性较差。
  • 不将point' 的范围限制在语句及其代码块中。
  • 据我所知,没有提供任何性能改进
  • 可能并不总是被执行(当它前面有一个评估为假的条件时。

缺点超过优点 4 / 1,所以我会避免它。

于 2012-06-27T08:34:25.867 回答
6

这主要与代码的可读性有关。避免内部分配以使您的代码可读,因为内部分配不会有任何改进

于 2012-06-27T08:26:37.583 回答
5

功能 Not Necessarily. 上的可读性 Definitely Yes

于 2012-06-27T08:27:14.267 回答
5

应该避免它们。减少每行标识符/操作的数量将增加可读性并提高内部代码质量。这是关于该主题的有趣研究:http ://dl.acm.org/citation.cfm?id=1390647

所以底线,分手

return result = myObject.doSomething();

进入

result = myObject.doSomething();
return result;

将使其他人更容易理解和使用您的代码。同时,如果在您的代码库中散布一些内部分配,只要它们在它们的上下文中易于理解,它就不会是世界末日。

于 2012-06-27T08:37:07.117 回答
3

好吧,第一个不完全是内部分配,但在第二种情况下......它降低了可读性......但在某些情况下,如下所示,

while ( null == (point = field.getPoint()) );

这样写很好

于 2012-06-27T08:27:28.317 回答
3

在这两种情况下,第一种形式都更难阅读,并且每当您想在调试器中检查值时都会让您想要更改它。我不知道在逐步调试时我诅咒“简洁”代码的频率。

于 2012-06-27T08:28:14.790 回答
3

在极少数情况下,内部赋值会降低程序复杂性,例如在if (x != null && y != null && ((c = f(x, y)) > 0) {...}复杂条件下执行的情况下,您真的只需要赋值。

但在大多数情况下,内部分配会降低可读性,并且很容易被遗漏。

我认为内部赋值是 70 年代 C 编程语言的第一个版本的遗留物,当时编译器没有做任何优化,优化代码的工作留给了程序员。在那个时候内部赋值更快,因为没有必要再次从变量中读取值,但是今天有了快速的计算机和优化的编译器,这一点不再重要了。然而,一些 C 程序员已经习惯了它们。我认为 Sun 将内部赋值引入 Java 只是因为他们希望与 C 类似,并使 C 程序员更容易转换为 Java。

于 2012-06-27T08:44:57.957 回答
2

始终以代码可读性而不是可写性为目标。类似这样的东西也是如此,a > b ? x : y; 可能有很多开发人员在阅读您的第一个代码片段时没有问题,但他们中的大多数人已经习惯了第二个片段。

于 2012-06-27T08:27:48.613 回答
2

更详细的形式也使得在 Eclipse 等调试器中更容易理解。我经常拆分单行分配,以便更容易看到中间值。

尽管 OP 没有直接要求,但类似的情况是函数调用,因为方法参数可以节省行数,但更难调试:

myFunction(funcA(), funcB());

不显示返回类型,并且更难单步执行。如果两个值属于同一类型,也更容易出错。

于 2012-06-27T08:32:12.493 回答
1

我发现使用内部分配没有任何害处。它节省了几行代码(尽管我确信它不会改善编译或执行时间或内存)。唯一的缺点是对其他人来说可能看起来很麻烦。

于 2012-06-27T08:27:25.243 回答