これ、フラグじゃないの? | 悪態のプログラマ

悪態のプログラマ

とある職業プログラマの悪態を綴る。
入門書が書かないプログラミングのための知識、会社の研修が教えないシステム開発業界の裏話は、新人プログラマや、これからプログラマを目指す人たちへのメッセージでもある。

フラグ(flag)とは旗のことである。プログラミングの世界では、「真」と「偽」のように2つの状態をとるものを、旗の揚げ下げに例えて、フラグと呼んでいる。

プログラム言語によっては、2つの値しか取らない型があり、フラグを変数としたい場合は、その型を使う。例えば、C++ の bool や Java の boolean がそうである(※1)。

 boolean flag = true;
 flag = false;

といった感じだ。

言語に boolean のような2値の型がない場合は、整数型などで代用する。例えば、C言語がそうだ。この場合、変数に0か1(場合によっては、0か-1)のどちらかの値しか入れない、というルールを決める(※2)。

そして、この場合、その変数がフラグであることが分かるように、変数に flag という名前を付けるのである。

 #define BOOL int
 #define TRUE (1)
 #define FALSE (0)
 
 /* BOOL である flag には TRUE か FALSE しか代入しない */
 BOOL flag = TRUE;
 flag = FALSE;

このような習慣があるので、逆に変数名に flag という名前をつけるのであれば、2つの値しか入れないでほしいのである(※3)。

ソースを読んでいるときに、

 int flag = OK;
 ...
 flag = NG;
 ...
 flag = ERROR;

とかいう記述が出てくると、あれ? と思う。これまでフラグだと思って読んでたのに、これ、フラグじゃないの? ということになってしまう。

心当たりのある方は、以後、気をつけていただきたい。





※1
boolean は「ブーリアン」と読む。たまに「ブーリーン」と読む人がいるが、間違い。

※2
言語に enum という考え方がある場合はそれを使う場合もある。

※3
実際には、「偽と真」は、「0とそれ以外」と定義されることが多い。しかし、それは値を判定をするときの話で、「真」の値を代入する場合は決められた値だけを入れるべきである。また、変数の各ビットをフラグとみなすような場合には、3つ以上の値を代入することになるが、そのような場合には、変数名を工夫をすべきだろう(例えば、「flags」と複数形にするとか)。



美しいCプログラミング見本帖―ポインタ手習い指南
柏原 正三
翔泳社 (2004/04)
売り上げランキング: 123,467
おすすめ度の平均: 5
5 買ってよかった
5 初心者から一歩前に進むために


Code Complete第2版〈上〉―完全なプログラミングを目指して
スティーブ マコネル Steve McConnell クイープ
日経BPソフトプレス (2005/03)
売り上げランキング: 4,432
おすすめ度の平均: 4.8
5 これを読まずしてソフトウェア開発ができるか?
5 職業プログラマーになりたいですか?
5 1歩上を目指す全ての開発者へ