クソコードの特徴

  • 同じコードがとにかく何度も続く。これが一番の特徴。
    • 色々な問題を1つの関数に持ち込んでいる。問題の分割がへたくそ。同じ問題を解くコードが複数個所に現れる。
    • for文が少ない。繰り返し構造を積極的に用いてない。クラスなどの抽象構造が少ない。
    • メソッド・関数の抽出をしていない。IDEリファクタリング機能に気づいていない。
    • 変数代入のタイミングが最悪。一度しか使わない式に変数を割り当て、複数回使う式に変数を割り当てない。
  • コメントに問題がある。
    • コメントが古い。嘘をついている。
    • コメントが日本語になっていない。書かないのと同じレベル。
    • コメントに大局的な処理の流れが書かれていない。
  • 一度書いたコードを見直している気配がない。
  • 複雑なものを簡潔に表現する試みがない。複雑なものを複雑なまま解こうとしている。
  • 古いコードのコメントアウトがある。部屋が散らかっているタイプと見た。
  • コードの中に、絶対に実行されない箇所がある。
  • ほとんど論理演算子や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という定数を割り当てる。マジックナンバーを禁止したらこれだ。リテラルを直接書いているより悪い。
  • ただのチェック判定メソッドが副作用を持っていたりする。

こういうクソコードの保守は頭が痛い。長ったらしいせいで内容が頭に入らない。こんなコードを書いておきながら、バグが連発したと困り果てた顔をしているのだ。救いようが無い。

クソコードが生まれる原因として考えられるのは、もちろんプログラマの未熟さもあるだろうけれども、意味の分からない、無駄に迫力だけあるコーディング規約も一役買っているだろう。

コーディング規約の意図するところが分からず、またコーディング規約自体も未熟なせいで、変なコードを書くプログラマが続出する。変な法律を作ったら、国民が驚き、国が変になるのと同じ。