代码之家  ›  专栏  ›  技术社区  ›  Steve

如何在delphi和c中设置复合语句的格式?[关闭]

  •  9
  • Steve  · 技术社区  · 17 年前

    作为一个长期的pascal和delphi开发人员,我总是将开始和结束排成一行:

    begin
      if x = y then
      begin
         ...
         ...
      end
      else
        for i := 0 to 20 do
        begin
          ...
          ...
        end;
    end;
    

    让我发疯的是这样的代码格式:

    begin
      if x = y then begin
         ...
         ...
      end
      else
        for i := 0 to 20 do begin
          ...
          ...
        end;
    end;
    

    当有几个层次的复合语句时,我发现这很难理解。上面的代码没问题,因为没那么复杂,但是为了一致性,我希望所有的开始和结束都对齐。

    当我开始使用c_时,我发现自己也在对齐花括号。C世界的标准是什么?

    编辑:

    有人指出这是不应该问的问题。我不明白为什么不。我正在建立一个编码指南文档。我知道我会遇到一些阻力,我希望能在这里得到一些答案,这样我就可以准备好迎头面对阻力了。

    19 回复  |  直到 17 年前
        1
  •  6
  •   Eugene Yokota    14 年前

    我个人使用:

    if Condition then
    begin
      DoThis;
    end else
    begin
      DoThat;
    end;
    

    Object Pascal Style Guide 是的。

    在复合if语句中,将每个 一个新的 行:示例:

    // INCORRECT
    if A < B then begin
      DoSomething; 
      DoSomethingElse;
    end else begin
      DoThis;
      DoThat;
    end;
    
    // CORRECT
    if A < B then 
    begin
      DoSomething; 
      DoSomethingElse;
    end 
    else 
    begin
      DoThis;
      DoThat;
    end;
    

    以下是一些被认为有效的变体:

    // CORRECT
    if Condition then
    begin
      DoThis;
    end else
    begin
      DoThat;
    end;
    
    // CORRECT
    if Condition then
    begin
      DoThis;
    end
    else
      DoSomething;
    
    // CORRECT
    if Condition then
    begin
      DoThis;
    end else
      DoSomething;
    
        2
  •  4
  •   Bruce McGee    17 年前

    我以前在Delphi中使用“悬挂”开头:

    if (SomeCondition) then begin
      ...
    end;
    

    奇怪的是,我没有用c,因为我发现这个更容易阅读:

    if (SomeCondition)
    {
      ...
    }
    

    过了一会儿,为了便于阅读,我不再试图在这里或那里保存一行:

    if (SomeCondition) then 
    begin
      ...
    end;
    

    我还使用了显式的开始/结束块,我认为它提高了可读性。我不需要“聪明”。我需要能够遵循代码的意图一目了然。更重要的是,每个可能阅读/维护它的人都是如此。

    if x = y then 
    begin
      ...
      ...
    end
    else
    begin
      for i := 0 to 20 do 
      begin
        ...
        ...
      end;
    end;
    

    我通常不介意是否有一个明确的声明

    if (SomeCondition) then
      ...
    
        3
  •  2
  •   Greg Hewgill    17 年前

    每个人都有不同的偏好。在我的例子中,我在学习帕斯卡之前学习了模2。modula-2没有begin关键字,每个块都有一个必需的结束。所以代码可能是这样的(modula-2碰巧对大写关键字区分大小写):

    IF x = y THEN
        ....
    END;
    

    当我开始用pascal编写代码时,它变成了:

    if x = y then begin
        ....
    end;
    

    这样,代码看起来更像我以前看到的,同时仍然在可接受的pascal代码的范围内。

    对我来说,这些早期的印象影响了我对几乎所有其他语言的首选大括号和缩进样式。对于C代码并没有什么特别的“规范”,正如对于C或Pascal也没有一样。

    唯一要遵循的规则是:在处理现有代码时,使用已经存在的样式。在处理新代码时,请使用您喜欢的样式。

        4
  •  2
  •   Michael Madsen    17 年前

    我倾向于在德尔菲这样做:

    if a=b then begin
      c;
    end else begin
      d;
    end;
    
    if x=y then z;
    

    只是因为我发现它比额外的换行符更可读。显然,如果我和其他人一起工作,我会使用我们同意的任何标准(或当前代码库使用的任何标准),但是当我是唯一一个在工作的人(如在个人项目中)时,我会这样做。

        5
  •  1
  •   Svante    17 年前

    C世界的标准是将右大括号与以下任一开始语句对齐:

    if (I am nuts) {
        Psychiatry
    }
    

    或者甚至把开口撑放在自己的线上:

    if (I am nuts)
    {
        Psychiatry
    }
    

    在某些样式中,大括号有不同的缩进:

    if (I am nuts)
      {
        Psychiatry
      }
    

    甚至

    if (I am nuts)
        {
        Psychiatry
        }
    

    我在Perl中很长一段时间使用了第一种样式,这是我在Else延续中的方法:

    if (I am nuts) {
        Psychiatry
      } else {
        I am free
    }
    

    但在暴露于lisp之后,当我已经正确缩进时,将大括号放在它们自己的行上并没有看到额外的价值:

    if (I am completely nuts) {
        Psychiatry }
      else {
        I am free } 
    

    不过,我不希望用这些思想来改变传统的c方式。

    顺便说一下,python已经完全抛弃了大括号,只依赖缩进,但是在我看来这太过分了,因为它导致了像lambda这样的荒谬的事情,只能有一个语句。

        6
  •  1
  •   skamradt    17 年前

    我总是把if和else排成一行,然后缩进begin/end块。如果我有一个多重条件,如果,我把它分成多行。如果我发现我的自我深入,那么我会重新思考我正在编写的代码或重构成多个方法。所以我的代码如下:

    if condition1 then
      begin
        // do something
      end
    else // not condition1
      begin
        // do something else
      end;
    

    或者更复杂的if条件。

    if condition1 or
      condition2 or
      condition3 and
      ( condition4 or
        condition5 )
    then
      begin
        // do something
      end
    else // not conditions
      begin
        // do something else
      end;
    
        7
  •  0
  •   Community Mohan Dere    8 年前

    这是以前问过的。例如 c-coding-standard-best-practices 是的。

        8
  •  0
  •   gabr    17 年前

    我绝不会那样写代码(你的第二个例子)。或者(首选)

    begin
      if x = y then begin
         ...
      end
      else begin
        for i := 0 to 20 do begin
          ...
       end;
      end;
    end;
    

    begin
      if x = y then begin
         ...
      end
      else for i := 0 to 20 do begin
         ...
      end;
    

    结束;

    有时我使用这种折叠(如第二种情况)来组合if和try..finally。

    x := GetMeTheObject;
    if assigned(x) then try
      ...
    finally FreeAndNil(x); end;
    
        9
  •  0
  •   Brian    17 年前

    就我个人而言,我更喜欢将连接语句压缩到一行。例如。 end else 在一条线上。使下一个语句块更清楚地与当前语句块相关。

        10
  •  0
  •   Steve    17 年前

    有人发帖说他们会写以下内容:

    if x=y then z;
    

    现在这个我真的不喜欢,和美学无关。假设x,y和z是函数,如果我正在单步执行代码,上面的意思是我不能单步执行x和y,然后单步执行z。

    1   if x=y then
    2     Z;
    

    我现在可以不进入第1行而进入第2行。

        11
  •  0
  •   Darian Miller    17 年前

    我总是像你的例子那样把开头/结尾排成一行。(除了我在for语句周围还有一个begin/end,以防以后添加代码。)

    不管怎样,如果你的代码是多层的,那么你把开始/结束放在哪里并不重要,因为它太复杂了。如果你发现自己结束了,比如说,3个层次深,停下来,简化。创建子例程来清理东西。

    codecomplete是这方面最好的参考书。如果你在读那本书时学不到什么,那我就把帽子吃了。

        12
  •  0
  •   orcmid    17 年前

    这很有趣。我有自己独特的对齐方式,奇怪的是,我用在几种语言中,包括pascal、c,甚至cobol(虽然用不了很长时间)。

    我想我第一次看到它是在肯·奥尔的一节课上。我的版本也非常像有一个越位规则(类似于python和f_),在这里你可以使用缩进来显示嵌套。

    不管怎样,下面是我的例子:

    begin  if x = y 
           then begin (* stack to avoid getting too much indentation *)
                ...     
                ...  
                end  
           else for i := 0 to 20 
                 do begin      
                    ...      
                    ...    
                    end;
           end;
    

    是的,c/c++/java/c的风格应该是

      {  if (x == y)
              {  ...   /* Space as if 'then' is there */  
                 ...  
                 }
         else for (int i = 0; i<21; i++)
                  {  ... /* space as if 'do' is there */
                     ...  
                     }
         }
    

    我经常用这个。你可以像我开始和结束那样堆叠{和},但我发现更令人高兴的是能够看到一个边并确认匹配的括号和缩进组的结尾。为了避免缩进过多,为了避免有太多的“{”和“}”单独存在于空白的海洋中,我做了很多改变。

    我不是在宣扬这个。没有人抱怨能读懂它。将“{”放在一行的末尾似乎是对ratfor预处理器的一种保留,类似于python在某些地方需要(更愉快的)“的方式。当我可以更有效地使用左边缘对齐时,我不想把不规则的右边缘扫描到代码下面。

    就像我们说的,Ymmv

        13
  •  0
  •   Anonymous    17 年前

    使用一些像jedi这样的代码格式化程序 http://jedicodeformat.sourceforge.net/

        14
  •  0
  •   Eugene Yokota    17 年前

    即使是一个单独的陈述 if ,我总是用化合物 begin-end 以防止将来的混乱。
    我也把 // if 每次之后 end; 是的。

    if A < B then 
    begin
      DoSomething; 
    end; // if
    

    其他陈述也一样:

    with qryTemp do
    begin
      First;
    
      while not Eof do
      begin
        if (A < B)
          or (C < D)
        begin
          DoSomething;
        end else
        begin
          DoSomethingElse;
        end; // if-else        
    
        Next;
      end; // while
    end; // with
    

    对于c,我跟随 Code Conventions for the Java Programming Language 复合语句的样式。

    if (condition) {
        statements;
    } // if
    

    if ((condition1 && condition2)
            || (condition3 && condition4)
            ||!(condition5 && condition6)) {
        doSomethingAboutIt();
    } else {
        doSomethingElse();
    } // if-else
    

    对于delphi和c,连接的逻辑运算符出现在下一行的开头。

        15
  •  0
  •   Alin Sfetcu    17 年前

    我是一个周末程序员,所以,作为唯一一个在项目中工作的人,我负担得起不遵循特定的编码约定,幸运的是我。

    当谈到代码可读性时,castalia的 structural highlighting 非常有用。 CnPack 有一个相似的特点是我没有错。

        16
  •  0
  •   Oliver Giesen    17 年前

    哈!拿着这个!;)

    try
      if Condition1
      or (    Condition2
          and Condition3) then
        begin
          DoSomething
          DoSomeMore;
        end
    
      else if Condition4 then // I only do this if the nested "if" has "case"-like characteristics
        begin                 // otherwise the if would obviously be indented and on its own line
          DoSomethingElse;
    
          if Condition5 then
            begin
              DoThisToo;
              DoFoo;
            end;
        end
    
      else
        DoTheWholeShebang;
    
      case Whatever of
        A: DoIt;
    
        B, C, D:
          begin
            DoSomethingSlightly;
            MoreComplicated;
          end;
    
      else
        begin
          DoWhatever;
          DoLastResort; 
        end;
      end;
    except
      on ESomeException do
        begin
          HandleIt;
          raise;
        end;
      on ESomeOtherException do
        DealWithIt;
    
      else
        DoWhateverItTakes;
    end;
    

    但奇怪的是,在使用大括号语言编写时,我也更喜欢使用后大括号布局:

    if (condition) {
      doSomething;
    } else {
      doSomethingElse;
    }
    
        17
  •  0
  •   Pablo Fernandez    16 年前

    在大多数情况下,让ide为您缩进。

        18
  •  0
  •   Andriy M    15 年前

    我发现当 钥匙 单词(在语法和逻辑上都很关键)尽可能多地暴露出来。

    这对我来说非常重要,有时我会求助于(imo)非常不传统的事情。

    这就是它的样子:

    if (condition) then begin
      statement;
      ...
      statement; end
    else begin
      ...
    end;
    

    我承认,这会使修改代码不太方便。只是我发现了“悬挂” end 在一个 if 语句,并与 如果 ,有点混乱。如果是的话 结束 ,它必须是最后一个(对于声明),否则我希望 else 或者下一个陈述的开头。

    我通常不会让它 then 块是复合块,但是 其他的 一个是单一的陈述。对我来说,反转条件并重新排列块并不重要。更糟的是,我在用 begin ... end 在我看来,丰富的“开始-结束”是多余的“开始-结束”往往是多余的。虽然我喜欢语句有一个显式的结束关键字,所以 case repeat 是我的最爱。:)

    还有一件事 如果 S(和 while 是不是在一个无数的情况下,我倾向于 然后 ( do )在下一行并对齐语句的起始关键字。

    这样地:

    if (some_long_conditional_expression) or
       (some_other_long_conditional_expression) or
       (some_even_longer_conditional_expression)
    then
      Exit;
    

    还有,这里已经提到了一些我不是外国人的事情,比如单行本 else if S(适当时)或 for ... do with ... do try S(是的,这又可能和我上述的吝啬天性有关)。

    总的来说,我可能过于依赖代码突出显示和缩进,特别是后者。如果不是凹痕的话,我宁愿选择 begin S.

    另一点:某些人的格式化风格很可能是由他们的编程风格造成的。例如,有些人讨厌非常大的例程,并倾向于尽可能地考虑因素,而另一些人更喜欢专注于代码本身,而不介意那些跨越屏幕的复合块-我发现这些是非常不同的方法,这可能会导致不同的格式化习惯。

        19
  •  0
  •   Gerry Coll    14 年前

    前一段时间我用

    if <cond> then
      begin
      ShowMessage('balablala');
      exit;
      end;
    

    但现在我按照标准

    if <cond> then
    begin
      ShowMessage('balablala');
      exit;
    end;
    

    就像在 Object Pascal Style Guide

    推荐文章