web-dev-qa-db-ja.com

K&RとOne True Brace Style(1TBS)のスタイルの違いは何ですか?

インデントスタイルに関するウィキペディアの記事 を読みましたが、それでもわかりません。 K&Rと1TBSの違いは何ですか?

48
GavinR

K&RとOne True Brace Style(1TBS)の最大の違いは、1TBSのすべてのifelsewhile、およびforステートメントです。必要がない場合でも、開始と終了のブレースがあります。目的は、新しいステートメントを簡単に挿入し、それらがどのようにグループ化されるかを正確に把握することです。

例として:

K&R:

int i;
for (i = 0; i < 10; i++)
  printf("Hi.");

1TBS:

int i;
for (i = 0; i < 10; i++) {
  printf("Hi");
}
76
Thomas Owens

K&Rは次のようなものです。

if (x) 
    a();
else {
    b();
    c();
}

つまり、中括弧は必要な場所でのみ使用され、制御ステートメントと同じ行で中括弧を開き、それ自体の行で中括弧を閉じます。

「1つの正しいブレーススタイル」(1TBSまたはOTBS)は、単一の制御されたステートメントを中括弧で囲むことにより、複合ステートメントに変換します。

if (x) {
    a();
} else {
    b();
    c();
}

オールマンスタイルは1TBSよりも少し進んでおり、オープニングブレースを単独で行に配置することにより、垂直方向の間隔を強制しています。

if (x) 
{
    a();
}
else 
{
    b();
    c();
}

編集:

「デニスリッチーは非常に賢い人で、優れた言語を発明しただけでなく、本当に優れたブレースも生み出しました。それのためのスタイル。」

とにかく傲慢であると主張する人のために、ここで小さな課題があります。Sourceforge、Github(など)に行き、K&Rブレーススタイルを使用してプロジェクトを選択します。バグとコミットの記録を調べて、使用したブレーススタイルによって引き起こされたsingleバグを見つけてみてください。

それほど多くの作業を行いたくない場合は、簡単な統計分析を試してください。さまざまなブレーススタイルを使用してプロジェクトを比較し、「二峰性」(ブレーススタイルと相関するバグ数(重大度など)の統計的に有意な差)を示すことができるかどうかを確認します。

私はこれらの両方を数年前に行いましたが、ブレーススタイルに起因すると思われる単一のバグを見つけることができず、2つの間の統計的に有意な相関に近づくものを見つけることができませんでした。平均して、K&Rブレースを使用するユーザーの方がバグはわずかに少なかったが、その差は小さすぎて統計的に有意であると見なすことができなかった。

取り上げられたので、マルチステートメントマクロの状況についてコメントします。複数のステートメントを含むが、それらを中括弧自体で囲まないマクロにはバグがあります。私の仕事はnotで、そのバグを隠すコードを書くことです。全く逆に、私の仕事はそのバグをできるだけ早く見つけて根絶することです。

診断されずに修正されないままになるようにバグを隠蔽することを期待してコードを作成するのは実に悪です。必要に応じてその傲慢さを呼んでください、しかし私はこれを交渉可能に近いとさえ見ていません。バグは発見され、修正される必要があります。存在期間が長いほど、修正がはるかに困難で費用がかかる可能性が高くなります。

20
Jerry Coffin

一般的にKRブレーススタイルの問題は、コードのリファクタリングにあります。コードを移動するとき、何かの周りにブレースがないことを見落としがちで、それを誤って移動し(または条件付きで実行されていると考えてその下で何かを移動し)、何かが機能しなくなったときに頭を引っ掻くか、不幸にして中に入るコード領域は十分にテストされておらず、ブラックハットがコードを悪用する方法を見つけるまで、バグは気付かれません。デバッガーにすばやく移動すると、気づいたら問題は簡単に見つかりますが、気付かない場合は...

10
Justin Swanhart