格式化if语句

这不是一场圣战,这不是“哪个更好”的问题。

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

if (x) print "x is true"; if(x) print "x is true"; 

相反

 if (x) { print "x is true"; } if(x) { print "x is true"; } 

如果你格式化单个语句ifs没有括号或知道程序员那么做,是什么导致你/他们首先采用这种风格? 我对这给你带来的好处特别感兴趣。

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

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

我发现这个:

 if( true ) { DoSomething(); } else { DoSomethingElse(); } 

比这更好:

 if( true ) DoSomething(); else DoSomethingElse(); 

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

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

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

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

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

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

 if (condition) do_something(); else do_something_else(); 

这一切都很好。

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

 if (condition) if (condition2) do_something(); else do_something_else(); 

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

 if (condition) if (condition2) do_something(); else do_something_else(); 

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

我总是用

 if(x) { print "x is true"; } 

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

我用

 if(x)
 {
    做一点事();
 }

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

 if(x)
   做一点事();
其他
    DoSomethingElse();

我发现外部括号在视觉上令人反感,而且在添加另一个声明时我从未犯过上述错误之一而不添加括号。

 if { // code } else { // else code } 

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

如果我编码:

 if(x) print "x is true"; 

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

 if(x) print "x is true"; print "x is still true"; 

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

 if(x) { print "x is true"; print "x is still true"; } 

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

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

 if (x) { ...statement1 ...statement2 } 

 if (x) ...statement else ...statement 

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

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

优点:

  • 字符更少
  • 清洁的样子

缺点:

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

如:

 if(x) print "x is true"; print "something else"; 

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

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

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

我用

 if (cond) { ... } else { ... } 
  • 一切都应该有大括号。 即使现在我在if块中只有一行,我后来添加了更多。
  • 我没有把括号放在自己的线上,因为这是毫无意义的浪费空间。
  • 我很少将块放在与可读性条件相同的行上。

Joel Spolsky撰写了一篇很好的文章: 错误的代码看错了

他专门解决了这个问题……

 if (i != 0) foo(i); 

在这种情况下,代码是100%正确的; 它符合大多数编码惯例并且它没有任何问题,但是if语句的单语句主体没有用括号括起来这一事实可能会让你烦恼,因为你可能会想到你的后脑,天哪,有人可能会在那里插入另一行代码

 if (i != 0) bar(i); foo(i); 

…并忘记添加大括号,从而不小心让foo(i)无条件! 因此,当你看到不在括号中的代码块时,你可能会感觉到一种微小的,不均匀的汤,会让你感到不安。

他建议你……

…故意设计你的代码,使你的不洁之举使你的代码更可能是正确的。

我不喜欢在不需要时使用牙箍。 我觉得它会使方法中的行数膨胀并使其无法读取。 所以我几乎总是采取以下措施:

 if (x) print "x is true" for (int i=0; i<10; i++) print "y is true" 

等等。 如果有人需要添加另一个语句,那么他可以添加大括号。 即使你没有R#或类似的东西,这也是一个非常小的交易。

尽管如此,在某些情况下我会使用大括号,即使语句中只有一行,也就是说,如果行特别长,或者我需要在'if'中注释。 基本上,我只是使用看起来更好看的东西。

空白是你的朋友….

但是,再一次,我喜欢:

 if (foo) { Console.WriteLine("Foobar"); } 

说真的,当你最后一次在任何代码中出现错误时,有人会这样做:

 if (a) foo(); bar(); 

是的,永远不会…… *这里唯一真正的“专业人士”就是要与周围代码的风格相匹配,并将美学斗争留给刚走出大学的孩子们。

*(告诫当foo(); bar();是一个宏扩展,但这是一个问题w /宏,而不是花括号w / ifs。)

 if (x) { print "x is true"; } else { do something else; } 

我总是打字。 这只是一个好习惯。 与思考相比,打字不是“工作”。

注意条件之前的空格。 这有助于它看起来不像方法调用。

其他方式是写:

 (a==b) ? printf("yup true") : printf("nop false"); 

如果要存储比较简单条件的值,这将是实用的,如下所示:

 int x = (a==b) ? printf("yup true") : printf("nop false"); 
 if (x) { print "x is true"; } 

在同一列中打开和关闭支架,可以轻松找到不匹配的支架,并在视觉上隔离块。 在与“if”相同的列中打开大括号可以很容易地看到该块是条件的一部分。 由包含大括号的行创建的块周围的额外空白区域使得在浏览代码时可以轻松地从逻辑结构中选择它。 总是明确地使用大括号有助于避免人们稍后编辑代码时出现问题,并误读哪些语句是条件的一部分而哪些不是 – 缩进可能与现实不符,但总是将括号括在括号中。

在方法开始时参数检查变量的唯一时间似乎是接受无支撑:

 public int IndexOf(string haystack, string needle) { // check parameters. if (haystack == null) throw new ArgumentNullException("haystack"); if (string.IsNullOrEmpty(needle)) return -1; // rest of method here ... 

唯一的好处是紧凑。 当程序员非常明显地表明以下情况时,程序员不必涉及不必要的{}。

  • 该方法退出任何真正的分支
  • 很明显这些都是1-liners

也就是说,出于其他人所说的理由,我总是{}用于程序逻辑。 当你放下牙箍时,如果它不在那里就很容易心理支撑并引入微妙的代码缺陷。

H8ers被诅咒我不是真正的教条规则。 在某些情况下,如果它没有超过一定宽度,我实际上更喜欢紧凑性,例如:

 if(x > y) { xIsGreaterThanY(); } else if(y > x) { yIsGreaterThanX; } else { xEqualsY(); } 

这比我更容易理解:

 if( x > y ){ xIsGreaterThanY(); }else if( x < y){ yIsGreaterThanX(); }else{ xEqualsY(); } 

这有一个额外的好处,鼓励人们将逻辑抽象为方法(就像我已经完成的那样),而不是将更多的逻辑集中到嵌套的if-else块中。 它还占用三行而不是七行,这可能使得不必滚动以查看多个方法或其他代码。

我更喜欢括号的样式,主要是因为它给眼睛一个明确的开始和停止点。 它可以更容易地查看语句中实际包含的内容,并且它实际上是一个if语句。 也许是一件小事,但这就是我使用它的原因。

只要它在你工作的团队中保持一致,那么它就没那么重要了

每个人都这样做是主要的

如果在某些情况下,您(或其他维护或更改代码的编码人员)需要在该条件块的某些部分添加语句,那么包含您的单行if语句具有相当明智的保护您免受头痛的优势。

如果您这样做:

 if(x) { somecode; } else { morecode; } 

这对于长期存在的代码的源代码控制和预处理器指令更有效。 更容易添加#if左右而不会无意中破坏语句或不得不添加额外的行。

习惯这有点奇怪,但过了一段时间后效果很好。

如果它是if的一行(以及可选的一行其他行),我宁愿不使用括号。 它更具可读性和简洁性。 我说我更喜欢它,因为它纯粹是一个偏好的问题。 虽然我认为试图强制执行一个必须始终使用括号的标准是有点傻。

如果你不得不担心有人在if语句的主体上添加另一行而不添加(只有当时需要的)大括号,我认为你有比拜占庭编码标准更大的问题。

 /* I type one liners with brackets like this */ if(0){return(0);} /* If else blocks like this */ if(0){ return(0); }else{ return(-1); } 

我从不在标签之外使用多余的空格,但总是包括括号可以节省大量时间。

我不喜欢使用follow关键字在同一行上关闭大括号:

 if(x){
    打印“x是真的”;    
 } else {
    做别的事;
 }

这使得删除/注释掉else子句变得更加困难。 通过将follow关键字放在下一行,我可以利用编辑器,让我选择一系列行,并一次注释/取消注释。

 if(x){
    打印“x是真的”;    
 }
 //其他{
 //做别的事;
 //}

我总是喜欢这个:

 if (x) doSomething(); if (x) { doSomthing(); doOtherthing(); } 

但总是依赖于语言和你正在做的行动。 有时我喜欢戴牙箍,有时候不喜欢。 依赖于代码,但我编写的代码必须写一次,重写十次,读一百次; 所以,就像你想要的那样,想要更快地阅读和理解

无论如何,这就是我的方式! 它看起来最好。

 If(x) { print "Hello World !!" } Else { print "Good bye!!" } 

如果你很好奇各种代码格式样式的名称是什么,维基百科有一篇关于缩进样式的文章。