フラグ | 自分捜索記録

フラグ

 プログラミングをしたことの無い人は、「え?」っと思うかもしれませんが、自分で作製したプログラムは、どんな作りになっていて、どの様に記事したかを全く忘れてしまいます。ですので、納品後、数ヶ月経って、お客様から、「ここの部分をチョッと変えてもらいたいんだけど」と依頼を頂いても、直ぐには、自分のプログラムを思い出せず。自分で作ったプログラムを前にチンプンカンプンと言うのは、実は、当たり前なのです。

 そこで、チンプンカンプンから早く立ち直るためにシステム会社には、ドキュメントやルールが必要になります。(それだけではなく、他のシステム会社にシステムが引き継がれた場合に、引き継いだ会社がシステムを理解できるようにする目的もあります。) 今日は、その中のソースコードについてです。

 開発したシステムは、当然、納品後の修正やメンテナンスのために分かりやすいソースにしておく必要があります。コード規約と言う物が、大抵のシステム会社には存在していて、そのコード規約に沿ってプログラミングを記事することにより、そのコード規約を理解している人間であれば誰が見ても、そのプログラムを読みやすく理解できる様にしています。

 しかし、コード規約というものは、もともと、暗黙の了解でプログラマーが理解している常識によって構成されている事が多いです。上級プログラマーが、今までの経験で、メンテナンスしやすいコードの書き方がルール化されています。(ルール化した人たちの独断と偏見も多分に入っていますが・・・)

 つまりは、初級プログラマーが犯すメンテナンスしにくいコードを書いてしまう過ちをルールによって矯正するのが目的です。

 しかし、世の中には、多くのシステム会社やプライベーターが存在しており、そんなルールを持たない会社、素人に毛が生えたようなプライベーターや、逆に素人の集まりの様な会社も存在したりします。

 私の会社では、時々、現在、使っているシステム(当社が作ったシステムではない)の改修をお願いしますと依頼を受けたりします。そのシステムを解析しますと、ライブラリを使用しソースコードもきれいに書かれておりオブジェクト指向(プログラムの書き方)を駆使した理解しやすいプログラミングがされていると思わず、「お~。きれ~に作ってるな~。」と感嘆の声をあげてしまいます。作った人の技量が感じられ、逆に私が勉強させていただきます。

 しかし、その逆に、理解しずらく、特にスクリプト言語であるPHP、ASP等のソースで、HTMLの隙間にプログラムされている様なソースを見ると愕然とします。「○○○○~な~」と思わず口にしてしまいます。

 その中で、最も私が嫌うものがフラグの多様です。フラグとは、ある条件が成立したら立てておく目印です。例えば、文字が1文字でも入力されたらフラグを立てておき、送信ボタンが押された時に、そのフラグが立っているなら次の画面へ、立ってないなら、次の画面へは進まない。と使用します。それの何がいけないのか疑問に思うかもしれません。

 では、先程のフラグをaflagと名付けましょう。そして、もう少しフラグを追加してみます。上記の入力ですが、20文字を超えたら、他のフラグbflagを立てましょう。それと、文字の中に使ってはいけない文字が入ったら、また、他のフラグcflagを立てましょう。1文字以上で20文字以下、使用してはいけない文字を使用していなければ、次の画面に進めるとしましょう。じゃあ、次の画面に進めるのは、各フラグが、どういう状態ですか?

 答えは、aflagが立っていて、bflag、cflagは、立っていない状態です。まだ、理解できると思います。
 それでは、1文字も入力されていない、もしくは、20文字以上入力されていたら「入力文字数を確認下さい」と表示させます。1文字以上、20文字以下で、使用出来ない文字が入力されていたら「使用できない文字が入力されました」と表示させます。20文字以上入力されていて、使用できない文字が入力されていたら「入力条件を確認下さい」と表示します。
 これだけ条件が増えてくると分からなくなってきます。挙げ句の果てには、条件を紙に書き出したりします。特に何十行、何百行にもおよぶプログラムの途中で、突然、aflagに対しての条件処理が出てきたりした場合、「aflagって何だったっけ?」となります。

問題は、3つあります。
①フラグを使用する必要が無い

フラグを立てるときに何がしか関数等を使用してフラグを立てているのだからフラグを使用せずに、その関数等を使用すれば良い。


②フラグを使用してもフラグの命名が悪い

aflag、bflag、cflagで、何を意味するフラグか分かりませんね。zero_flag、twenty_flag、unusable_flagとすれば、少しは分かりやすくなります。


③フラグの個数が多すぎる

フラグを使用せずに、変数を使用し、それぞれの条件の時に、意味のわかる文字を値として保持させる。例えば、1文字も入力されていない、もしくは、20文字以上入力されていたら変数に「number」という文字を入れるという様にです。
 
 そう、一番最悪なのは、flagというフラグをプログラムに書く事です。完全に何のフラグか分からない事と、他の条件でも、このフラグを併用している可能性があることです。そうなると、解析には、かなり時間がかかる様になります。
 さあ、大分忘れましたかね、aflag、bflag、cflagが全て立っていない時は、何の処理をするんでしたか?