1つのアルゴリズム、3つのコード

シェルソートを行う3つのソースコードを読んだ。
ネストの深さとwhile文の使用で読みやすさが向上することを実感。
どこがどう異なっていたのかまとめてみた。

A B C
読みやすさ 1 2 3
言語 JAVA C JAVA
行数 18 3 15
ループの最も深いネスト 3 3 4
最も長い変数のスコープ 9 6 5
意味のあるループ変数名の数 0 0 0
意味のある変数名の数 1 0 1
コードの分離 あり あり なし
コメント あり なし なし
トリッキーなfor文 なし あり なし


CodeCompleteには理解できるネストの深さは3までと書かれている。
ネストの深さが4となるコードCの理解しづらさはそれを裏付けている。
また、コードCではfor文の中に入っている処理が、コードA・Bでは別のループとして分離されている。

コードBはfor文が初期化、条件式の判定、処理を行うことを利用して、for文のみで処理を行う。
また、他のfor文では複雑な判定をしており分かりづらい。
行数は少ないが、読みやすさが犠牲になっている。
(for文の初期化部分が空白であることは当たり前にあるのだろうか?)

コードAはコードBのfor文をwhile文に置き換えたような内容になっている。
CodeCompleteでは、while文で複雑な判定を行うことを推奨している。
for文からwhile文への置き換えのいい例である。

コードAのみコメントが書かれていたが、コードをそのまま説明したものが多かった。
現実のオブジェクトに対してどういう操作がなされているのかを説明するものではなかった。
(コード中ではなくコード外(ホームページ上)では説明されていた)