格式化if语句

Ala*_*orm 8 c if-statement

这不是一场圣战,这不是"哪个更好"的问题.

如果块,使用以下格式的单个语句有什么优点.

if (x) print "x is true";

if(x) 
    print "x is true";
Run Code Online (Sandbox Code Playgroud)

相反

if (x) { print "x is true"; }
if(x) {
    print "x is true";    
}
Run Code Online (Sandbox Code Playgroud)

如果您将单个语句格式化为无括号或者知道程序员是什么,那么是什么导致您/他们首先采用这种风格?我特别感兴趣的是这给你带来了什么好处.

更新:由于最受欢迎的答案忽略了实际问题(即使它提出了最合理的建议),这里是一个无支架专业人员的综述.

  1. 紧凑
  2. 一些人更可读
  3. 括号调用范围,在某些情况下具有理论开销

Mat*_*ard 49

我发现这个:

if( true ) {
    DoSomething();
} else {
    DoSomethingElse();
}
Run Code Online (Sandbox Code Playgroud)

比这更好:

if( true )
    DoSomething();
else
    DoSomethingElse();
Run Code Online (Sandbox Code Playgroud)

这样,如果我(或其他人)稍后回到此代码以向其中一个分支添加更多代码,我将不必担心忘记用括号括起代码.我们的眼睛会在视觉上看到缩进作为我们想要做的事情的线索,但大多数语言都没有.

  • 我更喜欢第二块.所有括号只是纠缠了代码,如果你把它们搞砸就很容易发现错误.如果陈述方法多年来我一直是"无懈可击"的,并且从未遇到过在添加新行时忘记添加括号的问题. (18认同)

Don*_*eld 48

我非常不喜欢任何将if的测试和身体放在同一条线上的风格.

这是因为共享该行使得在许多调试器中无法在if的主体上设置断点,因为断点通常是基于行号的.


Fer*_*cio 34

总是使用大括号是一个好主意,但标准答案总是给出"如果有人添加一行代码并忘记添加大括号会怎么样?" 是一个相当薄弱的原因.

有一个微妙的错误,可以通过从一开始就没有括号引入.它发生在我身上几次,我发现它发生在其他程序员身上.

用一个简单的if语句开始,天真无邪.

if (condition)
    do_something();
else
    do_something_else();
Run Code Online (Sandbox Code Playgroud)

这一切都很好.

然后有人来了,并为if添加了另一个条件.他们无法使用&&将其添加到if语句本身,因为逻辑不正确,因此他们添加了另一个if.我们现在有:

if (condition)
    if (condition2)
        do_something();
else
    do_something_else();
Run Code Online (Sandbox Code Playgroud)

你看到了问题吗?它可能看起来正确,但编译器看到的方式不同.它看起来像这样:

if (condition)
    if (condition2)
        do_something();
    else
        do_something_else();
Run Code Online (Sandbox Code Playgroud)

这意味着完全不同的东西.编译器不关心格式化.其他与最近的if一起去.另一方面,人类依赖于格式化,很容易错过这个问题.

  • ps ...如果它们还没有添加大括号,则不要添加大括号.有人可能会做作者所说的概念伤害了我的灵魂. (3认同)

小智 21

我总是用

if(x) 
{
    print "x is true";    
}
Run Code Online (Sandbox Code Playgroud)

如果他们在当前行之后添加一行,那么遗漏大括号可能会导致有人错误地认为他们正在添加if子句.

  • 旁白:这就是为什么我也喜欢 Python 的缩进意识。无论如何,你都会缩进,不妨让它有意义。此参数仅出现在将阻塞字符(本例中为 { })设为可选/条件的语言中。 (2认同)

Mat*_*t H 14

我用

if (x)
{
    DoSomething();
}

对于多行,但我更喜欢无支架的一个衬垫:

if (x)
   DoSomething();
else
   DoSomethingElse();

我发现无关的括号在视觉上令人反感,而且在添加另一个语句时,我从未犯过上述错误之一而不添加括号.

  • +1.似乎人们似乎反对无括号的主要论点,如果声明担心他们会在添加新的代码行时忘记添加括号.然而,我从来没有听说过有人这样做的真实世界.自从我开始编程以来,我一直都是"无支架",并且从未遇到过忘记添加括号的问题. (3认同)

Dar*_*opp 7

if
{
// code
}
else 
{
// else code
}
Run Code Online (Sandbox Code Playgroud)

因为我喜欢代码块排队(包括他们的大括号).

  • 这是反对代码美学的恐怖主义!我不想使用该代码. (2认同)

Con*_*oyP 7

如果我编码:

if(x) 
    print "x is true";
Run Code Online (Sandbox Code Playgroud)

并且6个月之后需要添加一个新的线条,花括号的存在使我输入的可能性大大降低

if(x) 
    print "x is true";
    print "x is still true";
Run Code Online (Sandbox Code Playgroud)

这会导致逻辑错误,而不是:

if(x) { 
    print "x is true";
    print "x is still true";
}
Run Code Online (Sandbox Code Playgroud)

我发现,如此花括号使得这些逻辑错误更易于阅读和避免.


小智 7

像马特(上面3),我更喜欢:

if (x)
{
    ...statement1
    ...statement2
}
Run Code Online (Sandbox Code Playgroud)

if (x)
    ...statement
else
    ...statement
Run Code Online (Sandbox Code Playgroud)

我觉得很奇怪,以为有人可能会在以后出现并且没有意识到他们必须添加大括号以形成多行if块.如果这超出了他们的能力,我想知道其他的东西是什么!


Mat*_*ula 5

如果块缺少大括号,则单个语句:

优点:

  • 字符更少
  • 清洁的样子

缺点:

  • 均匀性:并非所有块看起来都一样
  • 在向块添加语句时可能存在错误:用户可能忘记添加大括号,if语句不会覆盖新语句.

如:

if(x) 
    print "x is true";
    print "something else";
Run Code Online (Sandbox Code Playgroud)


joh*_*hnc 5

当我在函数开始时测试中断条件时,我倾向于只使用单行,因为我希望保持这段代码尽可能简单和整洁

public void MyFunction(object param)
{
     if (param == null) return;

     ...
}
Run Code Online (Sandbox Code Playgroud)

另外,如果我发现我确实想要避免使用大括号并内联if子句代码,我可以对它们进行单行处理,这样对于任何添加新行的人都很明显,如果需要添加括号