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;

Object 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)
{
  ...
}

しばらくして、読みやすさを優先して、あちこちに 1 行を保存しようとするのをやめました。

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

好みは人それぞれです。私の場合、Pascalを学ぶ前にModula-2を学びました。Modula-2にはBEGINキーワードがなく、すべてのブロックに必要なENDがあります。したがって、コードは次のようになります(Modula-2は大文字のキーワードで大文字と小文字を区別します):

IF x = y THEN
    ....
END;

Pascalでコーディングを始めたとき、これは次のようになりました。

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

このように、コードは、許容可能なPascalコードの領域内にありながら、私が見慣れていたもののように見えました。

私にとって、これらの初期の印象は、私が使用した他のほとんどすべての言語の好みのブレースとインデントスタイルに影響を与えました。CやPascalにはないのと同じように、C#コードには実際には特定の「規範」はありません。

従うべき唯一の実際のルールはこれです:既存のコードで作業するときは、既存のスタイルを使用してください。新しいコードで作業するときは、好みのスタイルを使用してください。

于 2008-11-14T10:37:49.320 に答える
2

私はDelphiでこれを行う傾向があります:

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

if x=y then z;

余分な改行よりも読みやすいと思うからです。明らかに、私が他の人と作業している場合は、合意した標準 (または現在のコード ベースで使用されている標準) を使用しますが、(個人的なプロジェクトのように) 私だけがそれに取り組んでいる場合は、私はこのようにします。

于 2008-11-14T13:49:19.587 に答える
1

私は常に IF と ELSE を並べ、BEGIN/END ブロックをインデントする傾向があります。複数の条件 IF がある場合は、それを複数の行に分割します。自分が深くなってしまった場合は、自分がコーディングしているものを再考するか、複数の方法にリファクタリングします。したがって、私のコードは次のようになります。

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

または条件付きの場合はより複雑です。

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 に答える
1

C の世界では、閉じ括弧を次のいずれかの開始ステートメントに揃えることが標準です。

if (I am nuts) {
    Psychiatry
}

または、開始ブレースを独自の行に配置することもできます。

if (I am nuts)
{
    Psychiatry
}

一部のスタイルでは、ブレースのインデントが異なります。

if (I am nuts)
  {
    Psychiatry
  }

あるいは

if (I am nuts)
    {
    Psychiatry
    }

私は長い間 Perl で最初のスタイルを使用してきました。

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

しかし、Lisp に触れた後では、すでに適切にインデントしている場合に中括弧を独自の行に配置しても、追加の価値はありません。

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

ただし、これらの考えで従来の C のやり方を変えることは期待できません。

余談ですが、Python は中かっこを完全に捨てて、インデントのみに依存していますが、ラムダが 1 つのステートメントしか持てないなど、ばかげたことにつながるため、私の謙虚な意見ではこれは行き過ぎです。

于 2008-11-14T14:07:24.777 に答える
0

私は週末のプログラマーなので、プロジェクトに取り組んでいるのは、特定のコーディング規約に従わない余裕がある唯一の人です。幸運なことに。

コードの可読性に関しては、Castaliaの構造的な強調表示が非常に役立ちます。CnPackにも同様の機能がありますが、間違いではありません。

于 2008-11-15T22:16:55.100 に答える
0

ほとんどの場合、IDE をインデントさせてください。

于 2009-07-06T12:21:40.250 に答える
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

これはすべてかなり面白いです。奇妙なことに、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 Code Format のようなコード フォーマッタを使用します。

于 2008-11-15T02:25:58.140 に答える
0

そのようにコード(あなたの2番目の例)を書くことは決してありません。どちらかになります(推奨)

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;

終わり;

時々、(2 番目のケースのように) このような折りたたみを使用して、if と try..finally を組み合わせます。

x := GetMeTheObject;
if assigned(x) then try
  ...
finally FreeAndNil(x); end;
于 2008-11-14T11:22:23.863 に答える
0

個人的には、結合ステートメントを 1 行に圧縮することを好みます。たとえばend else、1 行で。ステートメントの次のブロックが現在のステートメントに関連していることを明確にします。

于 2008-11-14T13:48:12.710 に答える
0

内の単一のステートメントであっても、 将来の混乱を防ぐためifに常に複合を使用します。 また、私はそれぞれの後に置きます。begin-end
// ifend;

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

キーワード (構文と論理の両方のキー) が可能な限り公開されていると、コードが読みやすくなります。

これは私にとって非常に重要であるため、(IMO) かなり型破りなことに頼ることがあります。

これは次のようになります。

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

これにより、コードを変更するのが少し不便になる可能性があることは認めます。endステートメントの途中で「ぶら下がっている」が見つかり、ifと同じように配置されているためif、やや混乱しています。である場合end、それは (ステートメントの) 最後のステートメントでなければなりませんelse

thenそして、ブロックが複合である場合、私は通常、それを許可しませんが、ブロックはelse単一のステートメントです。条件を反転してブロックを再配置することは、私にとって決して大したことではありません。begin ... end単一のステートメントをsでラップすることに関しては、私は非常に厳格なので、なおさらです。私の見解と経験では、豊富な「begin-end」は冗長な「begin-end」であることがほとんどです。ステートメントに明示的な終了キーワードがある場合は好きですがcaserepeat常にお気に入りです。:)

ifs (およびそれに関する s) に関するもう 1 つのことwhileは、多数のデッカー状態の場合、次の行にthen( 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 trys (ええ、これも上記のタイトフィストの性質と関係があるかもしれません) など、外国人ではない私がここで既に言及したことがいくつかあります。

全体として、コードの強調表示とインデント、特に後者に頼りすぎている可能性があります。インデントがなかったら、私は常にbegins を選択したいと思います。

もう 1 つのポイント: 誰かの書式設定スタイルは、そのプログラミング スタイルに起因する可能性が非常に高い場合があります。同様に、非常に大きなルーチンを嫌い、可能な限り因数分解する傾向がある人もいれば、コード自体に集中することを好み、複数の画面にまたがる複合ブロックを気にしない人もいます。これらは非常に異なるアプローチであり、異なるフォーマットの習慣になる可能性があります。 .

于 2010-08-27T13:00:33.753 に答える
0

少し前に私が使用した

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

しかし今、私は標準に従っています

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

Object Pascal スタイル ガイドのように

于 2008-11-14T15:14:27.403 に答える
0

誰かが次のように書くと投稿しました:

if x=y then z;

これは私は本当に好きではありません。美学とは何の関係もありません。x、y、および z が関数であると仮定します。コードをステップ実行する場合、上記は、x および y をステップ オーバーして z にステップ インできないことを意味します。

1   if x=y then
2     Z;

ライン 1 に足を踏み入れずに、ライン 2 に足を踏み入れることができるようになりました。

于 2008-11-14T14:39:32.340 に答える
0

あなたの例のように、私は常にBegin/Endsを並べます。(ただし、後でコードを追加する場合に備えて、For ステートメントの周りにも Begin/End を配置します。)

とにかく、コードが複数レベルの深さである場合、複雑すぎるため、開始/終了をどこに置くかは問題ではありません。たとえば 3 レベルの深さに達した場合は、停止して単純化します。物事をクリーンアップするためのサブルーチンを作成します。

CodeComplete は、まさにこの種のものに関する最良の参考書です。その本を読んで何かを学ばなければ、帽子を食べてしまいます。

于 2008-11-14T14:53:05.620 に答える