読者です 読者をやめる 読者になる 読者になる

アーキテクチャをスマートに。

株式会社ネオジニア代表。ITアーキテクトとしてのお仕事や考えていることなどをたまに綴っています。(記事の内容は個人の見解に基づくものであり、所属組織を代表するものではありません)

if elseのコメントの書き方

プログラミング

プログラミングの話題です。
if〜else構文のコメントを書くときって、みなさんどのように書きますか?

単純 if 文の場合

単純if文の場合は、ブロックの直前に書くことがよくあると思います。

例えば、C系の言語で言うと以下のような書き方です。

// ゼロの場合
if (value == 0) {
    funcA();
}

たまに、ブロックの中にコメントを置く人も見かけます。
個人的には好きじゃないですが、まぁそんなに目くじら立てて言うほど悪い書き方でもないと思います。

if (value == 0) {
    // ゼロの場合
    funcA();
}

if else の場合

では if else の場合はどうなるかというと、それぞれのブロック内にコメントを置くのが普通だと思います。
ブロックの直前には、if else 全体の説明となるコメントを書いたりします。
(コメントの内容はともかく、位置に注目してください)

// 場合わけ
if (value == 0) {
    // ゼロの場合
    funcA();
} else {
    // そうでない場合
    funcB();
}

または、右側の余白を活用して、

// 場合わけ
if (value == 0) {    // ゼロの場合
    funcA();
} else {             // そうでない場合
    funcB();
}

といった感じです。

ところが

ある現場にいったとき、これをこんな風に書く人が結構いてびっくりしました。

// ゼロの場合
if (value == 0) {
    funcA();
// そうでない場合
} else {
    funcB();
}

実際には if else じゃなくて if 〜 else if 〜 else if … って長々と続く形式のコードでした。
つまり、

// ゼロの場合
if (value == 0) {

    funcA();

// 1の場合
} else if (value == 1) {

    funcB();

// 2の場合
} else if (value == 2) {

    funcC();

// 3の場合
} else if (value == 3){

    funcD();

}

こんな感じです。

カルチャーショック

初めてこの書き方を見たとき、僕はちょっとしたカルチャーショックを覚えました。

はっきり言ってすごいです。こんなの今まで見たことないです。

ブロックもインデントも無視、修正したりコピーしたりするときにミスを誘発するし、こんな書き方をすることなんて絶対に有り得ないです。

なぜこんな書き方をするのか全然理解できなくて、ずっと疑問に思っていたところ、最近になって有力な一つの仮説にたどり着きました。

それは、彼らはVB系の言語を先に習得した人たちではないか、ということです。
(実際にそうなのかはわかりません)

VBの場合

VBで同じような書き方をすると、次のようになります。

' ゼロの場合
If (value = 0) Then

    Call FuncA

' 1の場合
ElseIf (value = 1) Then

    Call FuncB

' 2の場合
ElseIf (value = 2) Then

    Call FuncC

' 3の場合
ElseIf (value = 3)) Then

    Call FuncD

End If

不思議なことに、ブロックの構文にブレース {} がないためか、C系の言語よりは自然に見えませんか

それでも、ブロックという観点で考えると、やっぱりおかしい書き方に見えてくるのですが、彼らはそこまで深く考えなかったのか、全く疑問にも思わずに習慣となっていったのでしょう。

いずれにしても

他にもいろいろ突っ込みどころ満載なプログラムを書いていた彼らのことですから、当たらずとも遠からず、その程度のレベルのプログラマだったことは確かです。

その現場ではコードレビューやコードインスペクションをする習慣もなかったので、悪い書き方を正されることなく、別の言語を習得しても同様の書き方を続けてしまう、という経緯があったかもしれません。

問題の根本原因は、彼らのプログラミングスキルではなく、開発の現場でソースコードのインスペクションが行われていない、ということなのですが、それはまた別の機会に。