クソコードの特徴
- 同じコードがとにかく何度も続く。これが一番の特徴。
- コメントに問題がある。
- コメントが古い。嘘をついている。
- コメントが日本語になっていない。書かないのと同じレベル。
- コメントに大局的な処理の流れが書かれていない。
- 一度書いたコードを見直している気配がない。
- 複雑なものを簡潔に表現する試みがない。複雑なものを複雑なまま解こうとしている。
- 古いコードのコメントアウトがある。部屋が散らかっているタイプと見た。
- コードの中に、絶対に実行されない箇所がある。
- ほとんど論理演算子やbooleanをうまく扱っているためしがない。
- こういう特徴はreturnに現れる。
boolean ret = false; if(condition){ ret = true; } return ret; // => return condition;
-
- booleanをfalseなどと比較する。
- || や && が忘れられている。
if(condition_a){ statements; } if(condition_b){ statements; } // => if(condition_a || condition_b){ statements; }
-
- if文のネストが異常に多い。
if(condition_a){ if(condition_b){ } } // => if(condition_a && condition_b)
- 殆どの変数に不要な初期化が施されている。
Object o = null; if(condition_a){ o = expr; }else{ o = expr2; }
- 無駄にセーフなコードにしようとする。レイヤが違うセーフティ判定を持ち込む。そのために本質的な処理をどんどん奥に埋もれさせる。
- intの0や1にZEROやONEといった定数を割り当てたり、""にEMPTYという定数を割り当てる。マジックナンバーを禁止したらこれだ。リテラルを直接書いているより悪い。
- ただのチェック判定メソッドが副作用を持っていたりする。
こういうクソコードの保守は頭が痛い。長ったらしいせいで内容が頭に入らない。こんなコードを書いておきながら、バグが連発したと困り果てた顔をしているのだ。救いようが無い。
クソコードが生まれる原因として考えられるのは、もちろんプログラマの未熟さもあるだろうけれども、意味の分からない、無駄に迫力だけあるコーディング規約も一役買っているだろう。
コーディング規約の意図するところが分からず、またコーディング規約自体も未熟なせいで、変なコードを書くプログラマが続出する。変な法律を作ったら、国民が驚き、国が変になるのと同じ。