中括弧の配置についてすでに議論されている空白についてのいくつかの発言がありました。
私自身は、「論理」グループにまとめられるものを分離し、次の人が先ほど作成したコードを読みやすくするために、コードに空白行を振りかける傾向があります。
実際、私はコードを次のように構成します。数行以内(間違いなく10行未満)の段落を作成し、各段落を自己完結型にしようとします。
例えば:
全体として、私はめったに4/5行以上がクラスター化されていないため、コードが非常にまばらです。
実際にはインデントを使用しているため、実際にはコードを構造化するためにこの空白を使用しているため、この空白をすべて無駄にすることはありません。
例えば:
for (int i = 0; i < 10; ++i)
{
if (i % 3 == 0) continue;
array[i] += 2;
}
2つのステートメントには明確な明確な目的があるため、明確にするために分離するに値すると考えます。
では、実際にコードで空白行をどのように使用する(または使用しない)のでしょうか。
空白は、読み取り可能なコードをきれいにするために重要です。空白行(または2行)は、コードの論理ブロックを視覚的に区別するのに役立ちます。
たとえば、レイアウトとスタイルの Steve McConnell's Code Complete、Second Edition の章から:
プログラムのインデントがまったくない場合よりも、プログラムが2から4スペースのインデントスキームを使用した場合の理解度テストの被験者のスコアが20〜30%高くなりました。同じ研究で、プログラムの論理構造を強調しすぎたり強調しすぎたりしないことが重要であることがわかりました。最も低い理解スコアは、まったくインデントされていないプログラムで達成されました。 2番目に低いのは、6スペースのインデントを使用したプログラムで達成されました。この研究は、2〜4スペースのインデントが最適であると結論付けました。興味深いことに、実験の多くの被験者は、スコアが低くても、6スペースのインデントは小さいインデントより使いやすいと感じていました。 6つのスペースのインデントが楽しいように見えるためです。しかし、見た目がきれいかどうかに関係なく、6スペースのインデントは読みにくくなります。これは美的魅力と読みやすさの衝突の例です。
明確にするためにはい。
この答えで私がしたように。
私はそうしますが、
(This line intentionally left blank.)
ライン上
はい、しかし私はそれを乱用しません。
メソッド内のすべてのコード行が空白行で区切られているコードを見てきました。論理的に区切られている場所では2つの空白行が使用されています。それは私の意見ではそれをさらに読みにくくします。私はまた、次のような狂った位置合わせをするために使用される空白を見ました:
//Prot. Return type Name Arg1 Arg2
//===== ============================== ==================== =========== ========
private int AMethodWithALongName(string s, object o)
{
...
}
private IDictionary<MyLongObject, int> SomethingCrazy (string s)
{
...
}
protected void Foo (string str, object o)
{
...
}
水平空白の同じ誤用は、垂直空白にも適用できます。他のツールと同様に、賢く使用してください。
私はすべて、コードをできるだけ明確にすることに専念しており、空白はその取り組みにおいてしばしば有用なツールです。しかし、リファクタリングを忘れないでください:
- クラスでは、一緒に行くメソッドをグループ化し、それらを次のグループから空白行で区切ります。
いくつかの関連するメンバーがいるので、それらは新しいクラスの候補です。
- コメントを書く必要がある場合は、コメントの前に空白行を入れます
コメントが必要なほどコードが不明確な場合はいつでも、コメントを必要としないほどコードを明確にするためにリファクタリングできるかどうか尋ねます。
- メソッドでは、プロセスのステップごとに1つの段落を作成します
「段落」ごとに1つのメソッドを作成しませんか?
クラスに多数のメソッドが含まれる場合は、新しいクラスの抽出に関する上記の私のメモを参照してください。
はい。ファイルを視覚的にスキャンするのが簡単になります。特に、コメントがどの行にあるかが明確になります。
Some code here
// Which line does this comment go with?
More code here
// It's pretty clear which line this comment goes with
More code here
Still more code here
この方法でコードを記述したことで、多くの批判を受けます。なぜ誰もがこのようにしないのか理解できません。
しばらくしてからプロジェクトに戻ってくると、読みやすさが非常に重要です。「次のコードを読んでいる人があなたの場所を知っているサイコパスである場合は、常にコードを書く」という言葉を聞いたことがあります。
いつもソフトウェアを書いているわけではありませんが、明確にするために、空の行を使用しています。
私は空白行を控えめにそして一貫して使用し、一貫して控えめよりも一貫して重要です。しかしながら:
そのほとんどはひどく物議を醸すものではありません。次は何でしょう。行末に開き中括弧があるK&R表記の後ろに空白行が続くことがよくあります。私は個人的には行の終わりにあるブレースを嫌い、ブレースの後に空白行と混ぜることで表記法(IMNSHO)が意味をなさなくなります。左中括弧を次の行に単独で置くと、大部分が空白行になります(IMNSHO、より読みやすいコードになります)。行の終わりにK&Rブレースを使用する必要がある場合は、余分な空白行によって垂直方向のスペース節約を浪費しないでください。
// I don't like this
if (something == anotherthing) {
print ...
update ...
}
// I much prefer this
if (something == anotherthing)
{
print ...
update ...
}
// I loathe this - not least for its inconsistent spacing
if (something == anotherthing) {
print ...
update ...
}
// I loathe this too, for its absurd waste of vertical space
if (something == anotherthing) {
print ...
update ...
}
最も読みやすく、意外性のないものを書きます。
function validEmail($addr) {
$regex = "/.../";
return preg_match($regex, $addr);
}
この関数は、12行のdocコメントを必要としません。
実際、コメントは必要ありません。
または空白行。
彼らはその本質を損なうでしょう。
関数内? まれに
明確に異なるブロックがある場合、それは新しい関数にリファクタリングしています。いくつかのケースではそれの価値がありません。
私にとって、関数内の空白行は最も間違った「ベストプラクティス」の1つです。
一度に、コード全体に自由に空白行を散らしていました。今日、私はより控えめになる傾向があります。これは、Steve Yeggeが話していた内容の一部だと思います here :
うまくいけば、これまでに描いたシーンは、なぜコードを見て、すぐに嫌いになるのかを理解するのに役立ちます。あなたがn00bなら、経験豊富なコードを見て、それが現代のソフトウェアエンジニアリングの本質を学んだことのない人によって書かれた不可解で規律のないがらくただと言うでしょう。あなたがベテランなら、n00bコードを見て、それがインターンが一晩の大酒飲みで書いたかもしれない過度にコメントされた装飾的な綿毛だと言うでしょう。
こだわりは、耐圧縮性です。キャリアを通じてコードを書くとき、特にそれが非常に異なる言語や問題のドメインにまたがるコードである場合、コード圧縮に対する許容度が高まります。それは、巨大なテキストを含む児童書を読むことから、より小さなテキストとより大きな単語を含むますます複雑な小説への進歩と同じです。
...
圧縮に対する高い許容度を持つプログラマーは、実際には画面全体のストーリーテリングによって妨げられます。どうして?コードベースを理解するためには、可能な限り多くのコードを頭に詰め込む必要があるからです。複雑なアルゴリズムの場合、ベテランプログラマは画面全体を確認したいと考えています。これは、空白行とインラインコメントの数を減らすことを意味します。特に、コードが何をしているのかを単純に繰り返すコメントです。これは、n00bプログラマが望むものとは正反対です。 n00bsは、一度に1つのステートメントまたは式に焦点を当て、それらの周りのすべてのコードを非表示にして、集中できるようにし、大声で叫びたいと思っています。
私は基本的に彼に同意します。 1つの画面でできるだけ多くのコードを配置できるようにするために、コードを圧縮する方がはるかに優れています。空白行を絶対に使用しないとは限りません。あなたが作成しようとしているグループ化が読みやすさを大幅に向上させない限り、それは良いことよりも害を及ぼすと思うだけです。
名誉教授が2つの素晴らしいアドバイスを提供した
同様に処理されるコードの論理ブロックに使用します。コメントを追加したら、別のステップを実行していることを示します。それでは、メソッドを抽出します。
適切な空白
{
int x = computeX();
x += ADJUSTMENT_FACTOR_X;
int y = computeY();
y += ADJUSTMENT_FACTORY_Y;
setPosition(x, y);
}
無効な空白
{
//Open a connection
String serverAddress = lookupAddress();
Connection connection = openConnection(serverAddress);
connection.login(user, password);
//Go get stuff from the server
item1 = connection.get(1);
item2 = connection.get(2);
//Close connection
connection.close();
//log data
log(item1);
log(item2);
//Update client
gui.updateView(item1, item2);
}
対
{
Connection connection = openConnection();
updateData(connection);
closeConnection(connection);
logUpdate();
updateGui();
}
対
{
updateDataFromServer();
logUpdate();
updateGui();
}
空白を使用するだけでなく、わかりやすくするために中括弧を使用しています。
これらが潜在的に関数である可能性があると私が使用するブレース。
code
{
code
code
code
code
}
{
code
code=code
code
code
code()
code()
}
空白はパラグラフと同じように考えるのが好きです。 1つのアイデアに貢献する行をグループ化します。
新しいアイデアまたは同じアイデアの新しいファセットを開始する場合は、次のように新しい段落を開始します。
命令型コードでは、1つのまとまりのあるタスクを実行するタスクをグループ化します。宣言型コードでは、アイデアの1つのまとまりのあるステートメントを記述するコードをグループ化します。
あなたは明らかに英語でそれをすることに問題がない(一部の人々はパラグラフ化に恐ろしい)ので、少し練習すれば、同じスキルをコードに適用することはまったくストレッチにならないはずです。
空白行は私の意見では必須です。それらを使用して、コードの異なる論理ブロックを分離します。コードを読みやすくします。読みやすいコードは良いコードです;)
私の理想的なコードは、空白行で区切られた各論理ブロックと、主要なロジックを持つ各ブロックの上のコメントです。
もちろん、人々がどこにでも複数の空白行を追加することによってそれをやりすぎると、私はそれを非常に苛立たせます:(
関数/メソッド内で空白文字のみを使用して、宣言とコードを分離しています。
いくつかのロジックを実装するコードのサブブロックを分離するためにいくつかの行が必要であると感じた場合、それらは別の関数/プライベートメソッド内にあるはずです。オーバーヘッドが大きくなりすぎないようにするのは、コンパイラ次第です。
通常、peusdoコードで:
def function(arg1, argn, ...)
INITIALIZERS
CODE
BLOCK_START
INITIALIZERS
CODE
BLOCK_END
CODE
end
役に立たない空白を見つけた場合、私はたいていうんざりします。
私の経験則はこれらです:
昨日書いたコードを読むのに問題がある場合は、おそらくメソッドを1つまたは3つ抽出する必要があります。
クラス定義が長すぎて簡単に読み取れない場合は、おそらくモジュール/インターフェース/オブジェクトを抽出する必要があります。
メソッド定義:行を追加する
モジュール/クラスの定義:2行追加
はい。読みやすさのため。時々、私が書いていないコードに空白行を入れることさえあります。空白行を介した論理的なグループ化があると、コードを理解しやすくなります。たとえば、uがコードを「スピードリード」できるからです。
手紙を書くときと同じように、コードブロックの間に空白行を使用する必要があります。
たとえば、関数間、またはループを終了するときの関数内...
彼らはそれをメンテナンスする必要がある場合人々はあなたにきれいなコードに感謝します;)
Microsoft StyleCopが推奨するホワイトスペースを使用しています。読みやすさと一貫性は別として、コードが適切にレイアウトされている(クラスサイズが小さい)ことで、チームのさまざまな人がたまたま同じ領域で作業しているときに、マージを管理しやすくなります。
それが私の想像力だけなのかどうかはわかりませんが、適切にレイアウトされたときにマージすると、差分ツールの方が、同等のコードがどこから始まり、どこで終了するのかを認識するのに適しています。うまくレイアウトされたコードはマージする喜びです。 OK、それは嘘でした-しかし、少なくとも痛みは管理可能なレベルに保たれています。
これが取引です... E = MCのような複雑なコードを書くオタク2は、プログラミングスキルを披露するのに優れています。
さて、6か月先に進みましょう。朝は2:00 AMであり、6か月間見られなかったシステムはE = MC2。これをデバッグするのはほとんど不可能です...誰もがびくびくしています。
コードが次のようになっているとします...
See Dick
See Jane
See Dick and Jan
午前2時でコードが壊れている場合。一目見ると、3行目が表示されているはずです
See Dick and Jane
問題が解決しました。
結論...空白を使用します。
ファイル全体ではなく、決して空白行を入れないでください。これは、コードに改行がないと言っているのではありません。
code;
//
morecode;
空白行は、コードのセクションを開いて作業するためのものです。エディターには、前/次の空白行に移動するためのいくつかのホットキーがあります。
他の多くの人が述べたように、空白行はコードを読みやすくします。ただし、この標準を適用する言語がいくつかあります。私が頭の上から考えることができるものの1つ(空白行についてはそれほど多くはありませんが、適切なインデント)はPythonです。
私は同意します、私は同じように空白を使います。ただし、空白を使用してメソッドを多くの部分に分割している場合は、そのコードを複数のメソッドにリファクタリングする必要がある可能性があります。メソッドの論理セクションが多すぎると、メソッドのテストが困難になる可能性があります。
それらを使用して、コードを論理ユニットに分離します。空白行を使用しないコードサンプルはほとんど見たことがありませんが、もちろん難読化は除外されています。
サイコパスの答えが最善ですが、次の人がばかであると仮定し、彼らがあなたがそうであると仮定し、あなたが彼らを間違っていることを証明したいと思うだろうと私はそれを置き換えます。
読みやすさにとって重要なのは、コメントの使用です。各関数またはサブルーチンをコメントブロックで開き、クリアテキスト、それが何であるか、何をするか、引数が何であるか、および予期される結果(エラー条件のリストを含む)を説明します。それから、それが何を意図しているか、および/または何をするように設計されているかについては疑問の余地はありません。それが達成することは変わるかもしれませんが、それはさらに進んでいます。
非常に多くのコーダーが、コードの「修復」を行うのは彼ら自身であると想定するか、単に気にしないかのどちらかだと思います。
空白行は重要です。ただし、左中かっこで空白行全体を無駄にすると、画面全体に表示されるコードの量が減ります。する必要があります:
for (int i; i < 10; ++i)
{ if (i % 3 == 0) continue;
array[i] += 2;
}
(ブレース '{'を 'for'と同じ行に置くことから始めないでください...それはMeshuggahです)。