いいコーディング規約、悪いコーディング規約?

スラッシュドットのネタ。コーディング規約関係の話ってのは歳や言語を問わずに面白い。

悪いコーディング規約として挙げられているものを、ちょっとだけピックアップしてみた。若干編集済み。

  • 変更する場合には、変更前のコードを全てコメントで残して日付・変更者を記載すること
  • 関数名は連番
  • 引数の使用は禁止。値の受け渡しはグローバル変数で行う(引数を理解できない開発者がいるから)
  • 関数の行数を短くするために、if 文改行無し
  • ローカル変数が使用禁止(スタックオーバーフローを未然に防ぐため)
  • 「コーディング規約が守られているか、コードを全部プリントアウトして確認しろ」という規約
  • 三項演算子は使わない
  • 規約の見直しについて言及されていない規約
  • 複数リターン文禁止
  • インデントはタブで行う
  • テクニックに走らず、誰が見てもわかりそうな構文を使う
  • できるだけ省略しないで書く
  • SQL 使用禁止
  • ハンガリアン記法
  • 変数名 / 関数名などのタイプイン禁止(全部コピペして使う)
  • Ruby: Block やイテレータ使わない(for 文でやる)
  • DB: View を使わない
  • PHP: class を使うな(誰一人 class を知らない / 使えないので)
  • VB / VC: コントロール名を省略形に打ち直す(Form1 → frmMain)

…うーん。

個人的に経験があって、絶対に勘弁してほしいのは「変更する場合には、変更前のコードを全てコメントで残して日付・変更者を記載する」系の規約。コードの殆どがコメントアウトされた過去のコードの残骸って状態のコードを渡されると、とにかく読み解くのが大変で死ぬ。

一所懸命コードを修正したにも関わらず、コンパイルしたら以前と動作が全く変わらないってこともあった。おかしいなぁと思ってよくよく調べてみたら、2,000 行くらい上に「#if 0」って書いてあった…なんて笑えない話もあった。コメントアウトならシンタックスハイライトで判断がつくんだけど、「#if 0」ってやられるとそれさえ使えない。これで更に if マクロの入れ子なんかがあった日には、本当に何を信じていいのか分からなくなるよ。

三項演算子禁止」とか「do 〜 until 構文の禁止」ってのもよく見るなぁ。三項演算子を理解出来ないプログラマなんか雇うなって言いたいくらいだ。「関数名は連番」ってのは経験ないけど、DB のテーブルの命名規約が連番っていうのは一度経験がある(でも、二度と経験したくない)。

「インデントはタブかスペースか」ってのは意見が分かれるところで、私自身はずっとスペース派だったんだけど、最近はタブでもいいかもなぁ…って思い始めてきた。というのはここ最近、コードをプロポーショナルフォントで表示させるようにしているから*1。最初はちょっと違和感があるけど、慣れるとこっちのほうがずっと読みやすい。コードは常にノンプロポーショナルフォントっていうのも、そのうち時代遅れのプラクティスになるのかもしれない(って勝手に考えてる)。

「良いコーディング規約」に類するモノはあんまり上がっていなかった気がするけど、気になったのはこの辺りか。

  • 適切なルール破りが合法化されている規約
  • 嘘のコメントを書かないように
  • コードを見ればわかるコメントは書くな
  • 変数名・関数名は英語の文法にのっとって、SVO や SVC
  • いっそのこと一切のコメントを禁止
  • 「恥ずかしいコード、禁止」

「コードを見れば分かるコメントは書かない」ってのは徹底させたいよなー。

*1:これは Eclipse 上での話。Emacs 上では相変わらずノンプロポーショナルフォント