为什么省略花括号被认为是不好的做法?[关闭]


177

为什么每个人都告诉我编写这样的代码是一种不好的做法?

if (foo)
    Bar();

//or

for(int i = 0 i < count; i++)
    Bar(i);

关于省略花括号的最大论据是,有时花括号可能是花括号的两倍。例如,以下代码为C#中的标签绘制发光效果。

using (Brush br = new SolidBrush(Color.FromArgb(15, GlowColor)))
{
    for (int x = 0; x <= GlowAmount; x++)
    {
        for (int y = 0; y <= GlowAmount; y++)
        {
            g.DrawString(Text, this.Font, br, new Point(IconOffset + x, y));
        }
     }
 }
 //versus
using (Brush br = new SolidBrush(Color.FromArgb(15, GlowColor)))
    for (int x = 0; x <= GlowAmount; x++)
        for (int y = 0; y <= GlowAmount; y++)
            g.DrawString(Text, this.Font, br, new Point(IconOffset + x, y));

您还可以获得链接usings在一起的额外好处,而不必缩进一百万次。

using (Graphics g = Graphics.FromImage(bmp))
{
    using (Brush brush = new SolidBrush(backgroundColor))
    {
        using (Pen pen = new Pen(Color.FromArgb(penColor)))
        {
            //do lots of work
        }
    }
 }
//versus
using (Graphics g = Graphics.FromImage(bmp))
using (Brush brush = new SolidBrush(backgroundColor))
using (Pen pen = new Pen(Color.FromArgb(penColor)))
{
    //do lots of work
}

花括号的最常见参数围绕维护编程,以及在原始if语句及其预期结果之间插入代码会引起的问题:

if (foo)
    Bar();
    Biz();

问题:

  1. 想要使用该语言提供的更紧凑的语法是错误的吗?设计这些语言的人很聪明,我无法想象他们会使用一个总是很难使用的功能。
  2. 我们应该还是不应该编写代码,以便最低公分母可以理解并且在使用它时没有问题?
  3. 我还有其他说法想念吗?

6
我同意你的看法。忽略它们。期。
安德烈·里内(AndreiRînea)

67
谁在乎2010年有多少种产品?显示器的价格又便宜又高分辨率!我的显示器是2048 X 1152,我有两个!当您可以轻松引入难以发现的细微错误时,可读性比保存2条垂直线更为重要。

51
显示器是宽,价格便宜,但他们并不高大又便宜。垂直空间比水平空间稀缺。
亚当说-恢复莫妮卡

32
@AdamRuth侧向转动它们:)
Zachary Yates

16
因此,您不会像Apple那样在2014年2月发现SSL漏洞,大声笑。
Learnvst 2014年

Answers:


183

实际上,唯一一次真正困扰我的时间是在调试时,并注释掉了bar():

if(foo)
  // bar();
doSomethingElse();

除此之外,我倾向于使用:

if(foo) bar();

可以解决上述情况。

编辑感谢您澄清这个问题,我同意,我们不应该将代码写到最低公分母。


31
当然,这很粗糙,但是我认为对于维护人员来说,最大的问题是他们将添加第二行,并且即使它看起来确实应该看起来也不是条件语句的一部分。
danieltalsky

23
我不喜欢单一衬板样式,因为我总是去找下面的线圈套。
Nosredna,2009年

18
我发现单行样式比刺激性要有用,因为(特别是在深层嵌套中,等等)该语句很容易被过度理解,并且可能导致混乱。但是,我几乎专门将这种单语句ifs用于输入验证(即,早日返回)或循环控制(例如,忽略文件系统遍历中不相关的文件名),其中空行有助于将其与主代码区分开。
艾伦·梅

1
单行样式还从测试覆盖范围中隐藏了bar()。即使foo始终为false,它也会被覆盖。
Bohumil Janda13年

1
这是另一种说法,“如果源代码包含花括号,那么我在调试时就不会浪费时间。” -添加括号非常简单,并且避免给下一个人留下陷阱。唯一反对的是“可读性”,这是相当脆弱的,因为在这种情况下,如果您忽略它们,则会隐式发生某些事情。
2014年

156

阅读速度...

除了已经提到的内容。至此,我已经习惯于分析带有花括号和空格的if语句。所以我读到:

if (condition)
{
    DoSomething();
}

DoSomethingElse();

比我读的要快一点:

if (condition) DoSomething();

DoSomethingElse();

如果看起来像这样,我读起来会慢一些:

if (condition) DoSomething();
DoSomethingElse();

我读起来比以前慢得多:

if (condition) 
    DoSomething();
DoSomethingElse();

因为我不禁要再次阅读以防万一,想知道作者是否打算:

if (condition)
{
    DoSomething();
    DoSomethingElse();
}

已经全面介绍了,但是在阅读以下内容时,我将花相当长的时间研究此内容,以确保作者的意图。我什至可以找原始作者来确认。

if (condition) 
    DoSomething();
    DoSomethingElse();

29
当在第4个示例中,您只是在if语句之后放了一条空行以将其与DoSomethingElse()分开时,问题就解决了。这就是我要做的,可读性实际上与第一个示例相同(如果不更好,-P)另一件事是,将行分成2或3组非常有助于提高可读性,您只需更快地浏览代码即可。
2009年

6
也许是因为我已经习惯了Python,但是将第一个大括号与if语句放在同一行上可以使我更快地阅读和理解它。
Ponkadoodle

16
无支撑风格的问题使您浪费了宝贵的精力来考虑砌块是否具有支撑而不是更重要的事情。仅此一个理由就足以使用最简单的约定(总是大括号)。
Nate CK 2010年

2
括号本质上是明确的。我会坚持的,谢谢。
TheOptimusPrimus 2013年

2
在最后一种情况下,寻找原始作者并给他打屁股...;)
Per Lundberg

55

如果太小,可以这样写:

if(foo()) bar();

如果足够长,可以分成两行,请使用花括号。


是的,那也是我要做的。如果您添加另一行,它会强制您添加花括号,并且很明显,看到bar()实际上是if的一部分,因此,如果您将其注释掉,则会发生不好的事情。
jalf

10
但是,调试器并不十分友好。如何在“栏”部分设置断点?
Nemanja Trifunovic

9
@Nemanja:只需将光标放在bar()上;然后按F9 VS2005和VS2008都可以处理行内断点(如果它们是单独的“语句”)。
GalacticCowboy

4
GalanticCowboy:环境比您所知道的还要多。:-)

20
当然可以,但是由于上下文是C#,因此应该可以覆盖绝大多数用户……
GalacticCowboy

47

我还曾经认为最好在真正需要时才使用花括号。但现在不再是这样,主要原因是,当您拥有大量代码时,它确实使它更具可读性,并且当您具有一致的支撑样式时,可以更快地解析代码。

除了在if中添加第二条语句的人之外,始终使用花括号的另一个好理由是可能发生以下情况:

if(a)
   if(b)
     c();
else
   d();

您是否注意到else子句实际上是“ if(b)”的子句?您可能做到了,但是您相信任何人都可以熟悉此陷阱吗?

因此,如果只是为了保持一致性,并且因为您永远不知道当其他人(通常是其他愚蠢的人)更改代码时会发生什么意外情况,我总会花括号,因为这会使源代码更易读,并且解析起来更快。你的脑。仅对于最简单的if语句(例如,在哪里进行委派或类似于switch的情况),您知道该子句永远不会扩展的情况,我将省略括号。


12
这是我确实使用花括号的两种情况之一。否则不行。
安德烈·雷内(AndreiRînea)

3
首先,应该将其写为好像(a && b)...。
alexander.biskop

8
@ alexander.biskop:当然不能,因为!a || !b与使用(!a)或不使用(a && !b)加上大括号的情况相比,else块具有不同的含义()。
Ben Voigt

1
@Ben Voigt:是的!失败了;-)半年零两个投票之后,有人意识到我的陈述是错误的……猜想我没有足够注意细节,主要是因为我的评论背后的意图与指出的意图不同。从句的技术上正确的转换。我的意思是,嵌套的内联if语句通常会大大降低可读性(尤其是控制流的可追溯性),因此应该合并为一个语句(或完全绕开)。干杯
alexander.biskop

3
@ alexander.biskop:同时,使用嵌套的ifs和更简单的条件使调试更加容易,因为您可以单步执行。
Ben Voigt


35

线路便宜。处理器功能便宜。开发人员时间非常昂贵。

通常,除非我开发一些绝对对资源/速度有严格要求的应用程序,否则我总是会在编写代码时犯错

(a)任何其他开发人员都可以轻松了解我在做什么

(b)注释可能需要的特定代码部分

(c)如果出现问题,易于调试

(d)如果将来需要的话,很容易修改(即添加/删除代码)

从业务的角度来看,代码的速度或学术上的优雅是这些因素的次要因素。这并不是说我开始编写笨拙或丑陋的代码,但这是我的优先顺序。

通过在大多数情况下省略花括号,对我来说,这会使(b),(c)和(d)更加困难(但请注意,并非没有可能)。我会说是否使用花括号对(a)无效。


9
您对(a)的最后声明是一种观点,很多开发人员(包括此处的其他发布者)都会提出意见。
凯利·法国

34

我更喜欢大括号提供的清晰度。您确切地知道这是什么意思,而不必猜测是否有人只是愚弄了他们并留下了他们(并引入了一个错误)。我唯一的遗漏是将if和action放在同一行上。我也不经常这样做。我实际上更喜欢通过将花括号放在自己的行上而引入的空格,尽管经过多年的类似K&R C的编程,如果IDE不强制使用花括号结束行是我必须努力克服的一种做法。我。

if (condition) action();  // ok by me

if (condition) // normal/standard for me
{
   action();
}

23

我认为这取决于您正在从事的项目和个人喜好的准则。

我通常会在不需要它们时省略它们,但以下情况除外:

if (something)
    just one statement; // i find this ugly
else
{
    // many
    // lines
    // of code
}

我更喜欢

if (something)
{
    just one statement; // looks better:)
}
else
{
    // many
    // lines
    // of code
}

15

C / C ++宏的过去很早就让您伤心。我知道这是一个C#问题,但是编码标准经常会遗留下来而不是首先创建该标准的原因。

如果您在创建宏时不太谨慎,则最终可能导致if语句不使用{}的问题。

#define BADLY_MADE_MACRO(x) function1(x); function2(x);

if (myCondition) BADLY_MADE_MACRO(myValue)

现在,请不要误会我的意思,并不是说您应该总是{}以避免在C / C ++中出现此问题,但是由于这个原因,我不得不处理一些非常奇怪的错误。


2
如果只有所有代码都这样声明自己…… 感叹
Nathan Strong,

15

我曾经以同样的方式思考。

直到一天(为什么总有一天会永远改变您的生活?),我们花了整整24到36个小时不进行睡眠调试生产代码,才发现有人没有把牙套与搜索/替换相结合。

是这样的。

 if( debugEnabled ) 
      println( "About to save 1 day of work to some very important place.");
 saveDayData();

后来发生的是

 if( debugEnabled ) 
 //     println( "About to save 1 day of work to some very important place.");
 saveDayData();

事实证明,该系统每天生成500 mb的日志,并要求我们停止它。调试标志还不够,因此必须进行搜索和替换println。

仍然当应用程序投入生产时,调试标志关闭,并且从未调用过重要的“ saveDayData”。

编辑

现在,唯一不使用花括号的地方是if / try构造。

if( object != null ) try { 
     object.close();
} catch( .....

看完超级巨星开发者之后。


3
我不明白 您有一个控制调试的变量(debugEnabled),并且仍然使用注释来禁用调试???为什么不将debugEnabled设置为false?
伊戈尔·波波夫

这不完全是这种情况,但是您提出了一个很好的观点。愚蠢的事情(例如未将debug设置为false)确实会创建细微和愚蠢的bug,比“显而易见的” bug更加难以发现。在这种情况下,不使用花括号没有太大帮助。
OscarRyz

1
@igor怎么样,因为他们只是想删除一行日志而不是删除所有日志行?
gman

14

我很高兴能够:

foreach (Foo f in foos)
  foreach (Bar b in bars)
    if (f.Equals(b))
      return true;

return false;

就我个人而言,我不明白为什么

foreach (Foo f in foos)
{
  foreach (Bar b in bars)
  {
    if (f.Equals(b))
    {
      return true;
    }
  }
}

return false;

更具可读性。

是的,行是免费的,但是当它可能只有一半大小时,为什么还要滚动浏览页面和代码页?

如果在可读性或可维护性方面存在差异,那么可以肯定地放括号...,但是在这种情况下,我看不出有任何理由。

另外,如果嵌套的其他位置,我将始终在嵌套的位置放置大括号

if (condition1)
  if (condition2)
    doSomething();
  else (condition2)
    doSomethingElse();

if (condition1)
  if (condition2)
    doSomething();
else (condition2)
  doSomethingElse();

非常令人困惑,所以我总是这样写:

if (condition1)
{
  if (condition2)
    doSomething();
  else (condition2)
    doSomethingElse();
}

只要有可能,我都会使用三元运算符,但绝不会 嵌套它们


刚刚在我的代码中看到了这几乎发生的事情:)我想看看一下,瞧瞧……它已经在那里了:)
Noctis 2014年

13

坦率地说,我将其视为:

优秀的程序员可以防御性地编程,劣质的程序员则不可以。

由于上面有几个示例,而我自己也有与忘记括号相关的错误的相似经历,因此我学会了始终使用括号的困难方法。

除了安全以外,其他任何事情都是选择个人风格,这显然是不好的编程方法。

乔尔甚至在使代码看起来不正确时提到了这一点

一旦由于缺少花括号而被bug咬住,您就会知道缺少花括号看起来是错误的,因为您知道它是另一个bug发生的潜在场所。


如果将开放的括号单独放置在行上,那么在没有括号对的情况下缩进两行或更多行的任何地方都会看起来是错误的,任何不匹配的括号对也会如此。在if语句控制一个块的情况下,这种用法将花费空行,但是在if语句控制一个动作而不是一个块的情况下,则无需使用块。
2014年

10

我同意“如果您足够聪明,可以让某人付钱给您编写代码,那么您应该足够聪明,不要仅仅依靠缩进来查看代码的流程。”

但是,可能会出错,这是调试的麻烦……尤其是当您要查看别人的代码时。


10

我的理念是,如果它使代码更具可读性,为什么不这样做呢?

显然,您必须在某些地方划界线,例如在简洁明了的变量名之间找到快乐的中介。但是方括号确实可以避免错误并提高代码的可读性。

您可以说,足够聪明的人可以成为编码员,他们将足够聪明,以避免引起无括号声明的错误。但是您能诚实地说您从未被拼写错误之类的简单事情绊倒吗?这样的Minutia在查看大型项目时可能会让人不知所措。


7
当然这是非常主观的。暂时不要使用它们可以提高可读性。
Brian Knoblauch

没错,如果我不把括号放在一边,我会像其他人一样坚持一条路线。我被咬了很多次,但是多行无括号声明。即使您知道要注意它,它仍然偶尔会吸引您。
James McMahon

10

总是有例外,但是我反对仅在其中一种形式时才省略括号:

if(x == y)
   for(/* loop */)
   {
      //200 lines
   }

//rampion's example:
for(/* loop */)
{
   for(/* loop */)
      for(/* loop */)
      {
         //several lines
      }
}

否则,我没有问题。


4
不好的例子。在这两种情况下,我都会将200行for循环分解为自己的方法,最好是几种方法。
亚当·贾斯基维奇

2
是的,但确实如此。另外,任何时候只要一个块长超过阅读器屏幕的高度,就会出现此问题。而且您无法控制代码阅读器的屏幕高度。他们可能在每一侧只看到几行。
风铃草

2
它确实发生了。那并不意味着它应该发生。
亚当·贾斯基维奇

3
@AdamJaskiewicz对。它确实发生了。我们必须想想确实发生,而不是什么应该发生。如果我们可以将自己限制在应该发生的事情上,则无需担心错误。
Beska 2012年

10

我偶尔会使用最底层的代码(多个using语句),但除此之外,我总是将花括号放进去。我只是发现它使代码更清晰。从不仅仅是缩进就可以明显看出,语句是块的一部分(因此可能是if等的一部分)。

我看过

if (...)
    foo();
    bar();

臭虫咬我(或者更确切地说,“我和他的同事” -我其实没有引进的bug)一次。尽管事实上我们当时的编码标准建议在所有地方都使用花括号。我花了很长的时间才能发现-因为您看到了想要看到的东西。(大约是10年前。也许我现在发现它的速度更快。)

当然,如果您在行尾使用“花括号”,则可以减少多余的行数,但是我个人还是不喜欢这种样式。(我在工作中使用它,发现它不像我预期的那样令人讨厌,但是仍然有点不愉快。)


我总是认为一致性比实际样式更重要,为什么我们仅在使用情况下才例外?
鲍勃

@Bob:好点,我只是偶尔这样做。我不想假装我有实际的原因:)实际上,有一个合理的原因-这样嵌套使用(并且仅使用)是很明显的,您仍然会遇到一个块。我看不到危险。
乔恩·斯基特

当然,这并不是说没有任何危险。
乔恩·斯基特

1
解决此错误的最佳方法:使用Python。(当然是开玩笑)
乔尔·维特尔曼

10

当您跳过单行代码中的大括号时,我对计算机编程领域的同行(您很多)印象深刻,并对此感到印象深刻。

我想这意味着我不聪明。我多次犯过这个错误。我已经解决了其他人的错误。因为这个原因,我已经看到软件附带了一些错误(RDP到运行VS2002的计算机上,并且您的监视窗口字体会变得很奇怪)。

如果我看一下我犯过的所有错误,这些错误可以通过更改编码样式来避免,那么清单很长。如果我在每种情况下都没有改变自己的方法,那么我可能永远不会成为程序员。再说一次,我想我并不聪明。为了弥补这一点,我长期以来一直是单行代码块上的括号的坚定用户。

也就是说,当今世界上发生了一些变化,这使得“您应在单行代码块上使用大括号”的规则如今比摩西将它带给我们时不再重要:

  • 某些流行语言通过使计算机读取缩进来解决问题,就像程序员一样(例如Python)。

  • 我的编辑器会自动为我设置格式,因此大大减少了因缩进而误导我的可能性。

  • TDD意味着,如果由于单行代码块而使我感到困惑,那么我更有可能迅​​速发现该错误。

  • 重构和语言表达能力意味着我的代码块要短得多,而单行代码块的发生频率要比过去更多。假设,如果无情地应用ExtractMethod,则整个程序中可能只有一行代码。(我想知道那会是什么样吗?)

实际上,无情地重构并在单行代码块上省去括号有一个明显的好处:当您看到括号时,您的头部会发出一个小警报,说“这里很复杂!当心!”。想象一下这是否是规范:

if (condition) Foo();   // normal, everyday code

if (condition) 
{
    // something non-trivial hapening; pay attention!
    Foo();
    Bar();
}

我的想法是将编码约定更改为“单行块可能永远都没有括号”或“如果您可以将块与条件放在同一行,并且都可以容纳80个字符,省略括号”。我们拭目以待。


作为一名前Java程序员,我必须完全同意自动格式化是解决问题的真正方法。您甚至不必让编辑器自动添加大括号-单独的自动缩进可以帮助避免很多歧义。当然,既然我已经切换到Python,那么我首先已经习惯了正确格式化我的代码。
艾伦·梅

我对牙套也有同样的感觉。这都是关于复杂性。理想情况下,我们只有一个线块。这就是我所说的可读性,而不是不必要的花括号。
伊戈尔·波波夫

9

在以下三个约定中:

if(addCurleyBraces()) bugFreeSofware.hooray();

和:

if(addCurleyBraces())
    bugFreeSofware.hooray();

和(代表使用开括号和闭括号的任何缩进样式):

if(addCurleyBraces()) {
    bugFreeSofware.hooray();
}

我更喜欢最后一个:

  • 如果所有的if语句都以统一的方式编写,我会更容易阅读。
  • 它可能会使软件更加健壮并且没有错误。但是,所有现代IDE和高级文本编辑器都具有不错的自动缩进功能,我认为只要不破坏注释格式或不违反团队标准,每个人都应该使用(在很多情况下,可以创建自定义格式方案并与团队分享)。我的意思是,如果正确完成缩进,则引入错误的风险会有所降低。
  • 我更喜欢布尔表达式和语句在不同的行执行。我希望能够将行标记为调试目的。即使我使用的IDE可以标记语句并逐步执行它,这也是一个交互式操作,并且我可能会忘记我在哪里开始调试,或者至少要花一些时间才能遍历几个代码。次(因为我必须在调试期间每次手动标记位置)。

8

反对使用花括号的主要论据是它们使用附加的行,并且需要附加的缩进。

行(几乎)是免费的,将代码中的行数减少到最小不是一个目标。

缩进与大括号用法无关。在您的级联“使用”示例中,我仍然认为即使省略括号也应缩进它们。


8

我坚信编写简洁的代码,但我总是会使用花括号。我发现它们是快速查看特定代码行存在范围的便捷方法。没有歧义,只是明确地摆在您面前。

有人可能会说这是优先选择的情况,但是我发现,如果程序的逻辑流程在内部是一致的,则容易遵循,并且我不认为编写这样的IF语句是一致的。

if(x < y)
    x = y;
else
    y = x;

另一个像这样;

if(x < y)
{
    x = y;
    x++;
}
else
{
    y = x;
    y++;
}

我更喜欢选择一种通用样式并坚持使用它:)


7

主要问题之一是当您具有一个衬里和一个不衬里的区域,以及与控制语句的分隔(forif您拥有什么)和语句末尾的分离。

例如:

for (...)
{
  for (...)
    for (...) 
    {
      // a couple pages of code
    }
  // which for block is ending here?  A good text editor will tell you, 
  // but it's not obvious when you're reading the code
}

4
无论如何,为什么您的for循环中有几页代码?
亚当·贾斯基维奇

b / c我是一个麻木不仁的人,所以我着迷于摆脱函数调用的“成本”。:)
猖ion

4
通常,这几页代码应位于单独的函数中。
乔纳森·莱夫勒

1
对不起,我是说我在扮演这种斗篷。但是,我认为,通过较小的视口查看时,较短区域也会出现相同的问题。这超出了编码人员的控制范围。
风铃草

7

我曾经是“花括号是必须的!”的大力支持者,但是自从采用单元测试以来,我发现我的单元测试可以防止无括号的语句免受以下情况的影响:

if (foo)
    snafu();
    bar();

通过良好的单元测试,我可以放心地将花括号省略为简单的语句,以提高可读性(是的,这可能是主观的)。

另外,对于上述内容,我可能会将其内联为:

if (foo) snafu();

这样,需要在条件中添加bar()的开发人员将更易于识别花括号的不足,并添加它们。


2
您说“我不需要”,然后给出了使用它的理由:可读性!
tvanfosson

4
我不会依靠单元测试来找到那个。也许是,单元测试不行!
克里斯汀2009年

2
@Kristen-单元测试的想法是断言方法的行为。如果行为发生了变化(如上所述),则单元测试将失败。我看不到问题所在。
Liggy

但是,为什么要依靠单元测试来获取在使用UT之前应该修复的显而易见的东西呢?
安德鲁(Andrew)

7

使用一些个人判断。

if (foo)
  bar();

本身就很好。除非您真的担心白痴以后再放入这样的东西:

if (foo)
  bar();
  baz();

如果您不担心白痴,那很好(我不是-如果他们不能正确使用基本代码语法,那么这是他们问题中最少的)>

作为交换,它更具可读性。

其余时间:

if (foo) {
  bar();
  baz();
}

只要我记得,这就是我的最爱。另外:

if (foo) {
  bar();
  baz();
} else {
  qux();
}

为我工作。

垂直空间本身并不十分相关,但可读性却很重要。一行上的左大括号本身只是停止了语法元素的对话,直到您的视线移到下一行为止。不是我喜欢的


我唯一喜欢第一种样式的时间是当我必须立即返回或在出现错误的情况下抛出错误时。像if (parameter == null) return null;
nawfal 2014年

7

好的,这是一个古老的问题,已经死了。我要补充一点。

首先,我只需要说“大括号”即可。它们只能帮助提高可读性,除非您正在编写汇编,否则优先级列表上的(对于您自己和他人!)可读性应该很高。始终不可读的代码始终会导致错误。如果发现花括号使代码占用太多空间,则您的方法可能太长。如果操作正确,大多数或所有方法都应适合一个屏幕高度,并且Find(F3)是您的朋友。

现在我要补充:这有一个问题:

if (foo) bar();

尝试设置仅在bar()将要运行时才会命中的断点。您可以在C#中通过将光标放在代码的后半部分来执行此操作,但这并不明显,而且有点麻烦。在C ++中,您根本无法做到。因此,我们从事C ++代码开发的最资深的开发人员之一坚持将“ if”语句分成两行。我同意他的看法。

这样做:

if (foo)
{
    bar(); //It is easy to put a breakpoint here, and that is useful.
}

2
右键单击栏,然后选择“插入断点...一点也不难”。了解您的工具。
鲍勃(Bob)

右键单击指示器栏无任何作用;您的意思是右键单击文本?无论如何,如果只希望在“ if”语句为true且“ bar()”位于其自己的行上时击中断点,则可以将光标放在该行中的任何位置,然后按F9键,或者单击鼠标左键。指标保证金。但是,如果所有代码都在一行上,则必须将光标定位在“ bar()”上,或者在按F9之前右键单击该位置,然后单击指标边距将不起作用(将断点放在'如果')。它不是“硬”的,但是当代码在两行时,它需要较少的精力。

哦,哈哈,右键单击“ bar()”。你的意思是文字。知道了 当然可以,或者只是按F9 ...
石头

>>您必须将光标定位在“ bar()”上,或者在按F9之前右键单击(我的意思是将光标定位在按F9或右键单击之前的精确位置)
stone

7

为了使带有花括号的代码不占用大量空间,我使用《代码完整》一书中推荐的技术:

if (...) {
    foo();
    bar();
}
else {
    ...
}

我不明白为什么它被低估了,所以我一直使用它的每一对括号都节省了一行
Eric

2
这是俗称的K&R风格。基于Kernighan和Ritchie的《 The C Programming Language》一书:en.wikipedia.org/wiki/The_C_Programming_Language_( book 。而且它不应该让您失望。
jmucchiello

谢谢!我认为这只是个人品味。我曾经觉得这种语法很烦人,但是在阅读了Code Complete之后,我才采用了它,现在就很喜欢它。
内森·普拉瑟

我正在阅读以上所有关于此问题的答案,认为“为什么没有人提出这个建议???” 它使右括号与要关闭的块对齐,即“ if”或“ while”等,而不是无意义的“ {”。+1。
尼克

如果将开括号始终if单独放在行上,则可以在视觉上将括号后跟单个缩进线的内容识别为控制单个语句,而无需任何括号。因此,在if语句控制语义上是单个动作的内容(不同于仅包含单个步骤的一系列步骤)的情况下,逐个打开样式可以节省空白。例如,if (someCondition)/`throw new SomeException(...)`。
超级猫2014年

6

假设您有一些代码:

if (foo)
    bar();

然后其他人出现并添加:

if (foo)
    snafu();
    bar();

根据其编写方式,bar(); 现在无条件执行。通过包括花括号,可以防止这种意外错误。代码的编写方式应使错误难以或不可能发生。如果我在进行代码审查时发现缺失的花括号,尤其是分布在多行中的花括号,则会造成缺陷。在合理的情况下,请将其放在一行上,以使发生这种错误的机会再次保持在最低水平。


问题已经提到了这一点。
Mike Scott

实际上不完全是。是的,他提到了这种错误的可能性,但我在谈论的是使您的代码防错,并作为最佳实践的一部分消除错误的可能性。
Elie

真的有防错代码之类的东西吗?
鲍勃

不可以,但是您可以增加难度。阅读Jason Cohen撰写的“ Peer Code Review的最佳保留的秘密”(请参阅​​此处某些页面的链接),以更好地了解为什么要这样做。
Elie

这是麦克·斯科特(Mike Scott)是谁,他为什么回答警察?人们不得不陈述显而易见的事实,这总是使我感到震惊。那么,迈克(Mike)为什么不继续对用户发布的有关此问题的附加说明发表评论。并非所有答案都与问题有关吗?
bruceatk

6

减少行数并不是放括号的好理由。如果您的方法太大,则可能应该将其重构为较小的片段或进行重组。这样做无疑将比简单地取出括号来增加可读性。


5

我总是在适当的时候省略它们,例如您的第一个示例。一眼就能看到和理解的简洁代码比维护,调试和理解的代码要容易浏览,逐行阅读。我认为大多数程序员都会同意这一点。

如果您开始进行多个嵌套,if / else子句等等,很容易失控,但是我认为大多数程序员应该能够确定在哪里画线。

我认为这有点像if ( foo == 0 )vs 的论点if ( 0 == foo )。后者可以防止新程序员的错误(甚至对于退伍军人来说可能是偶然的),而前者在维护代码时更容易快速阅读和理解。


4

无论是公司还是FOSS项目,大多数时候它都是作为编码标准而根深蒂固的。

最终,其他人将需要使用您的代码,这对于每个开发人员来说都要弄清楚他们正在处理的代码部分的特定样式是一个主要的时间浪费。

另外,假设某人一天不止一次地在Python和Cish语言之间切换...在Python中,缩进是该语言的块代名词的一部分,并且像引用的错误一样容易犯错。


+1以评论有关python的信息。当在各种语言之间不断切换时,我总是感到多么愚蠢。
Kena

3

更安全的一面是错误-只有一个潜在的错误可能不需要修复。

如果我所有的纸巾都卷成卷,我个人会感到更加安全。即使对于单行代码,这些都是简单的符号,很容易防止出错。从某种意义上说,您可以清楚地看到块中的内容,以免使块的主体与该块之外的以下语句混淆,从而使代码更具可读性。

如果我有一个内衬,通常将其格式化为:

if( some_condition ) { do_some_operation; }

如果该行太麻烦了,请使用以下命令:

if( some_condition )
{
    do_some_operation;
}
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.