出くわすことはかなりレアだと思うが、プログラミングのアンチパターンの経験談(あくまでネタ)として書き残しておこう。
これは何のお話?
大分昔の話なので、使っていたプログラム言語が何か?とか、具体的なソースコードは思い出せないが、記憶を頼りにポイントだけでも伝われば、と。
当時ワシは新人プログラマ数名を従えてシステム開発をしており、その中で、画面の動きがバグっているが、どうも不安定で何がどうバグっているか説明できない。という、新人が開発したバギーな画面のフォローに入った時のこと。
それはフラグが舞い踊る楽園あるいは地獄
そのソースコードを一度流し読み…、んー、分からん。読むのが苦痛で頭に入ってこない。意図が読めない。ダメだ、これは作った本人にまずヒアリングだな。
なぜなら、そのソースコードの問題箇所は、50〜60行程度のサイズだったと思うが、その中には2桁はあろうかという数の boolean
型の「フラグ」変数が定義されていたからだ。fl_flg
pr_flg
など謎の命名のフラグの中には、flg
flg2
という全くもって無機質・没個性なフラグも存在していた。連番もアリか。。ある呼び出しが行われたらフラグを設定してフラグを判定して、結果をフラグに設定して・・って、え?!
その新人さん曰く、「あ、そのフルフラグは〇〇ボタンを押した時に立つフラグで、プレフラグはフルフラグの1つ前の状態を持っていて、ただのフラグは△△画面から来た時に立つフラグです。プレフラグがオフでフルフラグがオンで、フラグがオンの時はこの処理が…(あー聞こえない聞こえない意識が遠のく)」
アイ、アンダースタン
状況は理解した。。
この新人さんは、入社後に受けた新人向けプログラミング研修で教わった、 「フラグに状態を保存しておき、後の処理の判断で使う」 という基本を忠実に守り、これでもか!と言わんばかりに駆使しまくって業務機能を実現しようとし、結果壮大なフラグの森を築き上げてしまった、と。
ワシはRPG開発でもない限り、こんなに林立した荘厳なフラグの森に出会うことはないと思い込んでいたのだが、事実それは目の前にあった。無垢な心によってうっかり樹立したソレは、来る者を拒み、迂闊に立ち入った者は出てくることはないだろう。『変数はフラグ縛り』でプログラミングしたかのような感じだな。出口が見えない。
ソリューション
「このフラグとそのフラグがオンになると、オンになるフラグ」のように、フラグたちは相互に関連を持ち、独立した概念ではないので、より一層複雑さに拍車をかけていた。
- 1つ1つのフラグの意味を明らかにする
- フラグ同士の関係性を明らかにする
という整理作業の中で、「フラグ」という概念が2値しか取れないために、起こりうる状態が1つの変数では表現しきれず、苦肉の策で複数のフラグを用いて脳内ビットを増やして実現してることが判明。まさに修羅の道。これかのフラグをまとめて伐採し、適切な状態区分として再定義した。
ワシ「よし、ここのフラグたちの代わりに、〇〇区分という変数を定義して、はじめは0、△△なら1、◽︎◽︎なら2、××なら3を設定することにしよう」
新人「あの、2とか3て何ですか?2,3も使っていいんですか?」
ワシ「いいんだよ(泣」
- 3値以上を表したい変数はフラグじゃなくて区分値(変数型は
int
とかString
)として定義し直す - 変数名は自分ルールで略称にせず、意味が伝わる名称にリネーム
-
pr_flg
->is_previous
-
flg2
->can_update
-
- 直後の
if
文で使っているだけで、変数として定義する必要を感じないのものは単純に伐採
リザルト
結果、フラグは独立したシンプルな意味合いのものが2,3残るだけで、見通しが良くなったプログラムは、リファクタリングの過程でバグを幾つも解消し、健全に動く画面機能を果たすようになりました、とさ。
ワシは懇切丁寧に1つ1つのリファクタポイントを説明してあげたが、その後、その新人さんがどうなったかは、覚えていない。
勇敢なプログラミング戦士たち、フラグの森に気をつけろ!