« 複雜なシステムとは單純なものの積み重ね | Main | プログラミングを始めるには »

June 21, 2014

プログラムに固定値を書いてはいけません

いい歲をしたSEにこんなことをドヤ顏で言うな!(笑)

プログラマだってこんなことを頭ごなしに言われたら、ヘソを曲げて何でもかんでもデファイン値にすれば良いんだろう?と思うに違いない。過去の經驗で一番笑えたのは、8ビットの0は0x00で、16ビットの0は0x0000というデファイン定義。なんで0x00だと8ビットなの?(爆笑)

まあ、C言語だとさしずめこんな感じ。

#define ZERO8 0x00
#define ZERO16 0x0000
#define ZERO32 0x00000000

こんなくだらない話はいまどきジョークにもならない。

そしてデータ型に關しては、こんなことをする人たちもいる。

typedef unsigned char BYTE;
typedef unsigned short WORD;

このようにヘッダファイルに定義しておけば、符號なし8ビットを表す型の名前が變わっても、ソースファイル(C言語では~.cのファイル)を書き換える必要がなくなるということらしい。こういうことを言う人たちは、それが一體どういうメリットをもたらすか考えたことがあるのだろうか。假にシステムのハードウェア更改があったとして、ハードウェア仕樣の差異に關わる部分のヘッダファイル書き換え、およびリコンパイルだけで對應出來たので、試驗をする必要がなくなるということなのか。

基本的に、ソースファイルをリコンパイルしたら試驗はやり直しだ。もしも私が顧客ならそれを要求する。ところが上記のような記述をすれば移植性が高いと思い込んでいる人々は、定義變更によるリコンパイルだけなら試驗をする必要がないという根據のない說明をしようとすることが多い。そもそも、見積に試驗やり直しの工數は積んでいないのだ。もしそれを見込むのであれば、移植性の高いプログラムの面目は丸潰れだ。

システム全體に關わるようなヘッダファイルの定義を變更しておいて、それで當然のことながらすべてのソースファイルのリコンパイルがかかったにも關わらず、全く試驗しなくて良いという理屈はあり得ない。こういう勘違いは、プログラムの移植性とソースファイルのメンテナンス性を混同しているということに他ならない。

さらに、ソースファイルに固定値を書くな!というのもよくある話だ。冒頭の0をZEROとデファインするのはその類である。これにもヘッダファイルと同樣のことが言えるが、もっと重要な問題がある。もともと、デファイン定義というのはプリプロセッサが固定値に置き換えるので、システム上はデファイン定義しても固定値であることに變わりはない。

もし本當に固定値ではいけないというのであれば、システム稼働中にその値を自由に變更可能にし、變更後もシステムの正常動作を保證しなければならないが、そんなことを實現出來ているシステムがあるのだろうか?

プログラム中に固定値が出現する場合、その値を變更したら動作しない可能性が高い。たとえば數値を入力する機能において、最大入力桁數を10桁にしている場合、入力が10桁以内かどうかをチェックする處理には、まさに10桁以内かどうかを調べるためのプログラムが書き込まれている。それを20桁まで許容するように變更する場合、プログラムに固定値で書かれていなければ簡單に變更出來ると考えるのは明らかに誤りだ。それは、その入力を受け付けて一時的に退避するデータ領域のサイズも入力に應じて可變でなければならないし、最終的にデータベースに書き込まれる場合は、その項目の屬性がそのような變更をも許容するようになっていなければならない。プログラム中に固定値が書いてあるかどうかなど、實に些細なことなのだ。

このようなことをシステム全體においてやろうとすると、おそらく開發に莫大な費用がかかるだろう。またシステム保守費用も當然高くなるだろう。もちろんそのようにして出來上がったシステムなら、些細な變更が發生してもベンダに對應を依賴する必要はなく、運用擔當者が好きなように變更可能になるのかもしれない。しかし、それで今までにない機能まで對應出來るというわけでもないので、機能追加はベンダ對應にならざるを得ないが、固定値にしてはいけないという條件を踏襲すると、大した機能でもないのに高くつくことになる。固定値が可變になったとして、運用中にどの程度變更するものなのか。

實はこのようなことは、時と場合に應じて適切にバランス良く行われているものであり、そこに口出しをするとおかしなことになるという典型例なのだ。賢い人なら、どれかを可變にして他はどうでも良いと言うはずである。

|

« 複雜なシステムとは單純なものの積み重ね | Main | プログラミングを始めるには »

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/74224/59852637

Listed below are links to weblogs that reference プログラムに固定値を書いてはいけません:

« 複雜なシステムとは單純なものの積み重ね | Main | プログラミングを始めるには »