ソースコード整形

私のアグリゲータに登録されている数少ないエントリ*1の1つ、id:atsushieno:20050102 さんのところより

mono on windowssvnからビルドしてフルに使いこなす道は、相変わらず厳しい道のりのようです。
(中略)
monoをsvnからビルドするには、cygwinを入れて、gccやmakeなど必要なパッケージを入れて、glibなどのWindowsネイティブパッケージをパスの通っている場所に置いて、それからsvnでチェックアウトして…といった作業が必要になるんですが…
(後略)

めんどくさいらしい?(ここまでは帰省前に書いた)


個人的には、Mono のソースコードは苦しくなるほど読みにくいので、整形ツールを通さないと読んでいられないというのが最大の問題点だと思うのだが、コード整形は好き嫌いの個人差でしかないので本質的な問題ではない。
しかし、ViewCVSWebDAV などといったインターフェスを利用してソースコードを閲覧する場合や、等号開発環境程度しかない環境や、何がインストールされているかわからない他人のPCや共有環境といったところで、ちょっとソースコードを開くときなど、ソースコードのコミットされるときの整形というのは結構重要なものである。
関わったことがあるいくつか……といっても15社程度……のソースコードの整形に関する規約でも、特にプログラマからシステムマネージメントへと役割が移行した人が、メモ帳などの簡易な環境で読むことが念頭に置かれている場合も多い。


いくつかの、よくある項目と自分の好みをあげてみよう。

インデントに利用する文字

タブ文字でインデントを行うか、空白文字で行うか、混在で行うかといった内容だが、私自身は空白のみでインデントを行っている。
UNIX 系や vi/Emacs の利用者が多い環境では、空白文字または混在になる傾向がつよく、Windows 環境がメインの場合はタブ文字でインデントされることが多いようだ。
これは、インデント量と編集ツールの設定差による影響が強いらしく、UNIX 系ではタブ文字を8桁へ展開することが多く、ソースコードのインデント量として8桁というのは大きすぎるという意識があるため、インデント量を4桁や2桁にするために空白が用いられることが多い。
これに対して、Windows 環境ではタブ文字の展開を2桁や4桁に変更して編集することが多いらしく、タブ文字をインデント階層にそのまま割り当てているため、インデントがすべてタブで行われていることが多い。
前述のように Web Browser など、タブ文字がそもそも展開されなかったり、展開幅を容易に変更できない環境があることや、タブ文字の幅を変更できる編集ツールの多くは、空白によるインデントもサポートしていることから、空白文字によるインデントを推奨したい。

{}の位置は?、省略可能な場合に省略する?

これはかなり各社各様というかんじだけど、自分の場合は対応する{と}が「同一行」または「同一桁」にあるという形が好みである。
また、省略可能な場合も同様に同一行に書ききれるようであれば省略する。

public int PROPERTY
{
  get { return this.prop;  }     // 同一行で閉じる
  set { this.prop = value; }
}                                // 同一桁で閉じる

public int PROPERTY2 { get { return this.prop; }}

public int func()
{
  if (bool_check) proc();        // 同一行なので省略
  if (bool_expr)
  {
    function(param, param, param); // 行をわけたので省略しない
  }
}

演算子と空白

単項演算子は空白をあけない、二項演算子とキャストは空白をあける、というかんじの規約がメジャーらしいが、私は単項演算子も空白をあけるようである。
仕事では、よく ! や ++ に空白を含めてしまってスタイルチェックでチクチク治している。

関数と引数と空白

「関数の後ろに空白をあけない」「単一引数の前後に空白をあける」「連続する引数はカンマの後ろに空白を入れる」というかんじが自分好み。

省略可能な()の記述

無駄に書くほうである。演算子の優先順位の理解が浅いというのも1つの要因だが、言語毎に微妙に違ったりして覚えるのも大変なんですもん。
演算子の優先順位に関する理解度が、自分と読み手で同じであるとは限らないし、読み違えてしまったら困るので、わかっている場合でもできるだけ括弧を書くようにしている。
さすがに

  if (((((x == ...

なんていう開き方を見ると、ちょっとイヤになるけど、そこは適度に空白と改行を混ぜてなんとか。

*1:もうすぐ10件