如果条件允许,最可读的格式化长条格式?[关闭]


43

if尽可能避免长绕组条件,但有时我们最终都会编写它们。即使这是一个非常简单的条件,有时所涉及的语句也很罗condition,因此整个条件最终变得非常冗长。格式化这些格式最可读的方式是什么?

if (FoobarBaz::quxQuux(corge, grault) || !garply(waldo) || fred(plugh) !== xyzzy) {
    thud();
}

要么

if (
    FoobarBaz::quxQuux(corge, grault)
 || !garply(waldo)
 || fred(plugh) !== xyzzy
) {
    thud();
}

要么

if (FoobarBaz::quxQuux(corge, grault)
    || !garply(waldo)
    || fred(plugh) !== xyzzy) {
    thud();
}

要么

thudable = FoobarBaz::quxQuux(corge, grault);
thudable ||= !garply(waldo);
thudable ||= fred(plugh) !== xyzzy;

if (thudable) {
    thud();
}

或其他任何偏好?

Answers:


30

通常,如果条件较长,则是需要重构的代码的标志,但有时您无法避免。在这种情况下,我更喜欢第一个:

if (bar || baz || quux) { ... }

因为您能够分辨出一行发生了什么。但是,在可能的情况下,我宁愿做这样的事情:

function foo() {
  return bar || baz || quux;
}

if (foo()) { ... }

3
滚动到侧面还是垂直方向几乎不是过去的糟糕
比尔2010年

2
并为该功能赋予一个有意义的(业务)名称,以便人们了解此处测试的内容。
Matthieu M.

19

我喜欢让运算符结尾指示继续:

if (the_function_being_called() != RETURNCODE_SUCCESS &&
    the_possibly_useful_recovery_strategy() == RETURNCODE_EPICFAIL &&
    this_user_has_elected_to_recieve_error_reports)
{
    report_error();
}

1
我想我喜欢这个。我使用很多括号来确保我也能理解优先顺序。
Jasarien'9

5
我更喜欢将逻辑运算符放在行的开头,这样当我阅读一行时,我可以很容易地看到它是有条件的一部分,而不仅仅是常规的代码行。

11

我非常喜欢有意义的变量名:

const bool isInAStrangeCondition =
    FoobarBaz::quxQuux(corge, grault) ||
    !garply(waldo) ||
    fred(plugh) !== xyzzy;

if (isInAStrangeCondition) {
    thud();
}

或根据功能进行重构,如上所述。


7

我将这些更复杂的子表达式(或全部)分解为布尔变量。然后,可以弄清楚“ if”语句的顶级布尔逻辑。在我从事的工作中,并非总是将ORed或ANDed结合在一起。

bool goodblah = some_mess < whatever;
bool frobnacious = messy_crud != junky_expression;
bool yetanother = long_winded_condition;

if (goodblah || (frobnacious && yetanother))   {
    ...
}

这在调试器中特别好,我可以在执行“ if”之前查看所有的布尔值。


我也喜欢它,但是您确实失去了一个好处:不再可能使昂贵的比较短路。

...而且您必须
整天

6

我倾向于在新行的开头对齐运算符,所以我记得我是如何组合术语的(长逻辑和长算术)。像这样:

if (first_attempt(data) == SUCCESS
    || (reusable(data) && second_attempt(data) == SUCCESS)
    || (still_reusable(data) && third_attempt(data) == SUCCESS))
  return SUCCESS;

仅当我缩进2个空格或将环境设置为缩进多行谓词时,这才起作用,否则很难判断谓词在哪里结束并且有用的代码开始。


0

我是以下人群的粉丝:

if (really_long_expression && another_really_really_long_expression && 
            another_very_long_expression_OMG_id_it_long){
    bugs();
}

这样,它仍然看起来像一个if表达式,而不是细分的if表达式。缩进有助于显示它是前一行的延续。

您也可以缩进它,直到左方括号在上一行的末尾为止,这样它就应该在if表达式的末尾。


1
我真的很喜欢您的bugs()方法:D
乔·菲利普斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.