9

作为一个长期的 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# 世界的标准是什么?

编辑 :

有人指出,这是不应该在 SO 上提出的问题类型。我不明白为什么不。我正在建立一个编码指南文档。我知道我会对某些事情产生一些阻力,我希望在这里能得到一些答案,这样我就可以准备好正面应对这种阻力。

4

18 回答 18

6

我个人使用:

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

请参阅对象 Pascal 样式指南

在复合 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;
于 2008-11-14T13:36:46.117 回答
4

我曾经在 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
  ...
于 2008-11-14T13:30:28.457 回答
2

我倾向于在 Delphi 中这样做:

if a=b then begin
  c;
end else begin
  d;
end;

if x=y then z;

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

于 2008-11-14T13:49:19.587 回答
2

每个人都有不同的喜好。就我而言,我在学习 Pascal 之前学习了 Modula-2。Modula-2 没有 BEGIN 关键字,并且每个块都需要 END。所以代码可能看起来像这样(Modula-2 恰好对大写关键字区分大小写):

IF x = y THEN
    ....
END;

当我开始用 Pascal 编码时,这变成了:

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

通过这种方式,代码看起来更像我以前看到的,同时仍然在可接受的 Pascal 代码范围内。

对我来说,这些早期印象影响了我使用过的几乎所有其他语言的首选大括号和缩进样式。C# 代码实际上没有任何特定的“规范”,就像 C 或 Pascal 没有任何特定的“规范”一样。

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

于 2008-11-14T10:37:49.320 回答
1

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 只能有一个语句这样荒谬的事情。

于 2008-11-14T14:07:24.777 回答
1

我倾向于总是排列我的 IF 和 ELSE 并缩进我的 BEGIN/END 块。如果我有多个条件 IF,我将其分成多行。如果我发现自己越来越深入,那么我会重新考虑我正在编码的内容或重构为多种方法。所以我的代码如下所示:

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;
于 2008-11-14T15:55:36.807 回答
0

我发现当关键词(句法和逻辑上的键)尽可能多地暴露时,代码更具可读性。

这对我来说非常重要,以至于有时我会诉诸(IMO)非常非常规的事情。

这是它的样子:

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

我承认,这会使修改代码变得不那么方便。只是我end在语句中间发现“悬空” if,并且与 相同if,有点令人困惑。如果是end,它必须是最后一个(对于语句),否则我期望else在该位置的下一个语句的开头或开头。

then当块是复合的时,我通常不会让它出现,但else它是一个单一的语句。颠倒条件并重新排列块对我来说从来没有什么大不了的。更是如此,因为我在用begin ... ends 包装单个语句时非常吝啬。在我的观点和经验中,丰富的'begin-end'往往是多余的'begin-end'。虽然我喜欢当一个语句有一个明确的结尾关键字时,所以caserepeat是我一直以来的最爱。:)

关于ifs (以及whiles )的另一件事是,在无数层条件的情况下,我倾向于将then( do) 放在下一行并与语句的起始关键字对齐。

像这样:

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

另外,这里已经提到了一些我不是外国人的东西,比如单线else ifs(适当时)或for ... do with ... do trys(是的,这可能又与我上面提到的紧握拳头的本性有关)。

总的来说,我可能过于依赖代码高亮和缩进,尤其是后者。也许如果不是为了缩进,我宁愿总是挑出begins。

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

于 2010-08-27T13:00:33.753 回答
0

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

于 2008-11-14T13:48:12.710 回答
0

我永远不会那样写代码(你的第二个例子)。这将是(首选)

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;
于 2008-11-14T11:22:23.863 回答
0

哈!拿着这个!;)

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;
}
于 2008-11-17T12:10:43.030 回答
0

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

if x=y then z;

现在这个我真的不喜欢,和审美无关。让我们假设 x、y 和 z 是函数,如果我单步执行代码,上面的意思是我不能跨过 x 和 y 并进入 z。

1   if x=y then
2     Z;

我现在可以跨入第 2 行而无需踏入第 1 行。

于 2008-11-14T14:39:32.340 回答
0

我总是像你的例子一样排列开始/结束。(除了我在 For 语句周围还有一个 Begin/End ——以防你稍后再添加代码。)

无论如何,如果你的代码有多个层次,那么你把开始/结束放在哪里并不重要,因为它太复杂了。如果您发现自己超过了 3 个级别,请停止并简化。创建子例程来清理东西。

CodeComplete 是这方面的最佳参考书。如果你没有从那本书中学到东西,那我就吃掉我的帽子。

于 2008-11-14T14:53:05.620 回答
0

前段时间我用

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

但现在我按照标准

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

对象帕斯卡风格指南

于 2008-11-14T15:14:27.403 回答
0

这一切都很有趣。我有自己独特的对齐方式,奇怪的是,我在多种语言中都使用了这种方式,包括 Pascal、C 甚至 COBOL(虽然这种方式用不了多久)。

我想我第一次看到它是在 Ken Orr 的课上。我的版本也非常像有一个越位规则(类似于 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

于 2008-11-15T01:05:23.497 回答
0

使用一些代码格式化程序,例如来自http://jedicodeformat.sourceforge.net/的 JEDI 代码格式

于 2008-11-15T02:25:58.140 回答
0

即使它是 中的单个语句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#,我遵循Java 编程语言样式复合语句的代码约定。

if (condition) {
    statements;
} // if

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

对于 Delphi 和 C#,连接逻辑运算符位于下一行的开头。

于 2008-11-15T10:22:15.653 回答
0

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

在代码可读性方面,Castalia 的结构突出显示非常有用。CnPack有一个类似的功能,我没有弄错。

于 2008-11-15T22:16:55.100 回答
0

在大多数情况下,只需让您的 IDE 为您缩进即可。

于 2009-07-06T12:21:40.250 回答