« FindFirstPrinterChangeNotification使用例 | トップページ | TA7368 »

2011年5月15日 (日)

VB版"危険なプログラム"

1年ほど前にある開発会社と組んで開発したシステムの、その開発会社の社員が担当したプログラムが1年経っても安定しない(ちょくちょくバグが見つかる。そのつど修正はしているが安定に向かっている印象が無い。)ので、ついに私がプログラムソースに目を通すことにしました。

プログラムはVB6で書かれているのですが、いやはやものすごいコードです。どこがすごいか、箇条書きにしてみると。

(1) グローバル変数依存症。iとかjとかの変数がグローバルで定義されていて(しかもVariant型)、それらの変数に重要な値がセットされプログラム内の随所で参照されている。
(2) ローカル変数がほとんど無い。Forループもグローバルで定義されたkとかlとかを使っている。あるいは関数の中でkとかlとかがいきなり参照されている。呼び出し元かどこかで値がセットされているらしい。
(3) そもそも関数の数が多くない。ボタンのClickイベントハンドラにいきなり長大な処理を書いている。
(4) 隠れグローバル変数がある。Form上に不可視のテキストボックスを置き、それをワーク変数として使っている。(Option Explicit指定していないので他にも隠れ変数があるかもしれない)
(5) コピー&ペースト愛好症。類似のプログラムブロックが随所に見える。
(6) 混乱したインデント。内側ループが外側ループと同じレベルにあったり、インデントのサイズが4(の倍数)で揃っていない。

上記文中の「グローバル変数依存症」「コピー&ペースト愛好症」は、”危険なプログラムの処方箋”(宮坂電人著、ソフトバンククリエイティブ)の第二章”三大疾病”にある言葉ですが、本当に宮坂氏の言う「汚いプログラム」「ダメなプログラム」「危険なプログラム」をVB6で書くとどうなる、見本のようです。

上に列挙した項目は割と「基本的」な事項ばかりと思いますが、「中級レベル」(?)の問題も多いです。

(7) DB(MDB)更新(insert/update/delete)の直前でご丁寧にOn Error Resume Next している。
(8) ユーザ定義型(構造体)を使っていない。社員コード、氏名、年齢、...などがそれぞれ別の(同サイズで一次元のVariant型)配列で管理されている。
(9) If文の複数の条件式が括弧で括られることなくAnd/Or混在で羅列されている。括りは大丈夫なのか。

//////////////////////////////////////////////////////////////

私より年長で、古株社員で、社長(IT出身でないが)も信頼している人なので私も信頼していたが...。
よその会社の社員の「しつけ」など「知ったことではない」とも言えるわけですが、エンドユーザはそれなりの規模の会社で、今後も仕事を期待したいので。

すこし口出しをせざるを得ないかな。身に付いてしまった悪いくせを正せる年齢かどうか。

上記宮坂本の19ページに「作った本人が途中で逃げてしまったので引き継いだ」というくだりがあって、ここを読んだときには思わず吹き出してしまったが、現実になることも想定しておかねば。
ですので頼まれたわけでないのに人の作ったプログラムソースに目を通しているわけです。任せっぱなしにできないですし、逃げるのを待っている(?)わけにもいきません。

« FindFirstPrinterChangeNotification使用例 | トップページ | TA7368 »

ソフトウエア」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: VB版"危険なプログラム":

« FindFirstPrinterChangeNotification使用例 | トップページ | TA7368 »