Entry

プログラミングメモ - オレベストプラクティスはただの横着か

2009年07月07日

こちらの話を読ませていただいて。あまり定式化するもんでもねんでね?とか思うんだけれども。

この「#ifdef #ifは使っちゃダメ」は前々から思っていたことで、最近、あるソースに手を入れた際に思いを強くした。CRIチャンネルに掲せようと冒頭部分が書きかけだった。

それとは別に、時を同じくして、会社メンバー4人で昼食ソバを食べたときに「#ifの入ったソースはメンテがきつい」という若手Uの声。そこでの情報も加えつつ記事を完成。

いわいまさかチャンネル - プ:#ifdef #ifは使っちゃダメ

メンテがきついのは,#if ディレクティブを使ってるからではなくて,単純にソースコードの管理手法が身に付いていないだけなんじゃないかなぁ……とかつらつら。いや,こゆ話はここでの話に限らなくて,なんつか,ネットの「オレベストプラクティス」とかを見ていると,経験不足の責(せめ)を何か別のものに転嫁している気がして仕方がなかったりします。

例えば,#if ディレクティブの場合,引用のような制御構造に使うのは論外で,普通は条件コンパイルに使います。ある程度 C/C++ をやっている人からすると当たり前なんだけれども,例えば,次のような場合に #if ディレクティブは必須だったりします。

  • リリースビルドとデバッグビルドで挙動を変える必要がある。
  • ヘッダの二重 include を防止するために,include ガードを入れる必要がある。
  • 処理系依存の記述を分ける必要がある。

この点,各種処理系では,#if ディレクティブを使うことが前提になっている定義マクロもあったりする。例えば,VC++ を使っている場合は _MSC_VER が自動的に定義されるし,インテルコンパイラ(ICC)も GNU の C/C++ 処理系(GCC)もそれぞれ,__ICL や __GNUC__ が定義されます。インクルードガードは,VC++ だと #pragma once ディレクティブが使えるけれど,普通は #ifndef なんかを使って実現します。

この他にも,例えば,オプションのライブラリとリンクしてビルドする場合(Unicode サポートつきのビルドとか)とそうでない場合とで,コンパイルの方法を分けたいこともあるだろうし,処理系ではなく OS 環境でコンパイル方法を分ける(32 bit OS と 64 bit OS を分けるとか)こともありえます。ひとつのソースで多種類のビルドを作るために #if ディレクティブを使いこなすことは,基本中の基本だと言っていいはずです。

で,冒頭の話。なんつか,こういった基本的な経験なり知識なりは,無ければ無いなりに新しく身に付ければいいし,無い人がいるならコーディングさせる前に身に付けさせればいいと思うんですね。けれど,どうも巷の「オレベストプラクティス」を見ていると,「難しいから使わない(使わせない)」とかいった具合に,禁止する方向でルール付けされている気がして仕方ありません。先日,C++ で代入演算子禁止みたいな話を出したけれども,こゆのを突き詰めると何もできなくなってしまう。それって本当に「ベスト」なプラクティスなんだろうか。

また,こういったルールなり作法なりが一旦出来上がると,それを機械的に守ることこそが善である,といった奇妙な行為規範が生まれます。ま,それにも一理あるとは思うんですけどね。どう見てもおかしな形骸化したルールが,大手を振って通用しているのを見ると,なんつかトホホ。

さらにひどい例になると,形骸化したルールが誤解されて,亜流のルールができることがあります。例えば,「グローバル変数を作るのはいけない」とかいったルールが形骸化して,「グローバル定数を作るのもいけない」みたいな話になったり……。もちろん,グローバル定数を作ることがマズい場合もあるわけだけれども,それは変数の場合とは理由が異なります。形式的に「グローバルはマズい」とか言っている人の中で,グローバル定数がどういう場合になぜマズいのか,ちゃんと説明できる人はいるんだろうか。

オレベストプラクティスが,ただの横着のためのルールなっている場合は結構多いと思っています。便利な機能があってもあえて使わない。なぜならオレが理解できないから,みたいなことがあるんじゃないだろうか。理解さえすれば別のところでもっと横着できるのに,と思ったりもするんですけど,どんなもんなんでしょ。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN