我刚与同事讨论过,我们不同意以下哪些代码段更简单:
public boolean foo(int x, int y) {
if (x < 0)
return false;
if (y < 0)
return false;
// more stuff below
}
OR
public boolean foo(int x, int y) {
if (x < 0 || y < 0)
return false;
// more stuff below
}
显然哪个更短;很明显,他们的cyclomatic complexity是相同的(因此对于“简单”的定义,当然,它们是相同的)。
你有什么感受,为什么?哪个更具可读性;哪个更容易调试?
答案 0 :(得分:4)
在你描述的完全通用的情况下,我会选择第二个,因为我讨厌重复代码。
但在现实生活中,我会根据两项测试是否相关来做出决定。
例如
if (user.isDisabled() || user.isSuspended())
return false;
两个测试都是关于用户是否可以做某事。
但
if (user.isDisabled())
return false;
if (catalog.isClosedForOrders())
return false;
一个测试是关于用户,一个是关于系统;为了便于维护,我将它们分开,以便以后能够独立改变。
答案 1 :(得分:1)
那么,在很大程度上取决于我当时的心情。
我认为最客观的考虑因素是x&amp; amp;年。检查一个变量是否为高和低;低范围 - 一个如果。检查一个字符串是否为null,一个int是否为范围 - 两个ifs。
答案 2 :(得分:0)
我会选择第二个,只有一个变化:
public boolean foo(int x, int y) {
if ((x < 0) || (y < 0))
return false;
// more stuff below
}
原因在于它遵循人类用自然语言表达的方式(我们会说“如果两者中的任何一个是否定的,那么答案就是'不'”而不是“如果第一个是否定,答案是'不';如果第二个是否定的,答案也是'不'“。
答案 3 :(得分:0)
我认为这些风格提出了不同的建议:
if (x < 0)
return false;
if (y < 0)
return false;
如果x < 0
完成了y < 0
和其他事情,则表示已完成某项工作。
而
if (x < 0 || y < 0)
return false;
暗示如果其中一个条件为真,则完成一件事。
所以这取决于实际的代码。显然,如果两个表达式都应该这样做,你就不会拆分语句,因为这会导致代码重复,只会感觉错误。
答案 4 :(得分:0)
更好的名字,然后真的很清楚......
public boolean foo(int x, int y) {
var hasInvalidArgument = (x < 0 || y < 0);
if (hasInvalidArgument)
return false;
// more stuff below
}
您不需要查看表达式......变量名称告诉您测试是什么