我们正在与我的同事讨论内部任务,例如:
return result = myObject.doSomething();
或者
if ( null == (point = field.getPoint()) )
这些是可以接受的还是应该用以下内容代替,为什么?
int result = myObject.doSomething();
return result;
或者
Point point = field.getPoint();
if ( null == point)
我们正在与我的同事讨论内部任务,例如:
return result = myObject.doSomething();
或者
if ( null == (point = field.getPoint()) )
这些是可以接受的还是应该用以下内容代替,为什么?
int result = myObject.doSomething();
return result;
或者
Point point = field.getPoint();
if ( null == point)
内部作业更难阅读,也更容易错过。在复杂的情况下,它甚至可能被遗漏,并可能导致错误。
例如。如果条件评估阻止为变量赋值,这将是一个很难发现的错误:
if (i == 2 && null == (point = field.getPoint())) ...
如果i == 2为 false,则点变量稍后将没有值。
if ( null == (point = field.getPoint()) )
优点:
缺点:
point' 的范围限制在语句及其代码块中。缺点超过优点 4 / 1,所以我会避免它。
这主要与代码的可读性有关。避免内部分配以使您的代码可读,因为内部分配不会有任何改进
功能 Not Necessarily.
上的可读性 Definitely Yes
应该避免它们。减少每行标识符/操作的数量将增加可读性并提高内部代码质量。这是关于该主题的有趣研究:http ://dl.acm.org/citation.cfm?id=1390647
所以底线,分手
return result = myObject.doSomething();
进入
result = myObject.doSomething();
return result;
将使其他人更容易理解和使用您的代码。同时,如果在您的代码库中散布一些内部分配,只要它们在它们的上下文中易于理解,它就不会是世界末日。
好吧,第一个不完全是内部分配,但在第二种情况下......它降低了可读性......但在某些情况下,如下所示,
while ( null == (point = field.getPoint()) );
这样写很好
在这两种情况下,第一种形式都更难阅读,并且每当您想在调试器中检查值时都会让您想要更改它。我不知道在逐步调试时我诅咒“简洁”代码的频率。
在极少数情况下,内部赋值会降低程序复杂性,例如在if (x != null && y != null && ((c = f(x, y)) > 0) {...}复杂条件下执行的情况下,您真的只需要赋值。
但在大多数情况下,内部分配会降低可读性,并且很容易被遗漏。
我认为内部赋值是 70 年代 C 编程语言的第一个版本的遗留物,当时编译器没有做任何优化,优化代码的工作留给了程序员。在那个时候内部赋值更快,因为没有必要再次从变量中读取值,但是今天有了快速的计算机和优化的编译器,这一点不再重要了。然而,一些 C 程序员已经习惯了它们。我认为 Sun 将内部赋值引入 Java 只是因为他们希望与 C 类似,并使 C 程序员更容易转换为 Java。
始终以代码可读性而不是可写性为目标。类似这样的东西也是如此,a > b ? x : y;
可能有很多开发人员在阅读您的第一个代码片段时没有问题,但他们中的大多数人已经习惯了第二个片段。
更详细的形式也使得在 Eclipse 等调试器中更容易理解。我经常拆分单行分配,以便更容易看到中间值。
尽管 OP 没有直接要求,但类似的情况是函数调用,因为方法参数可以节省行数,但更难调试:
myFunction(funcA(), funcB());
不显示返回类型,并且更难单步执行。如果两个值属于同一类型,也更容易出错。
我发现使用内部分配没有任何害处。它节省了几行代码(尽管我确信它不会改善编译或执行时间或内存)。唯一的缺点是对其他人来说可能看起来很麻烦。