2009/03/02

事例

世に言われている通り、業務システムで作られるプログラムには、時に常軌を逸して酷いものがある。正直言って、どこの素人が書いたのかと言いたくなるほどいい加減なものもある。

例えば、メモリを解放し忘れてたり、エラーが発生するとメモリの二重解放が起きてプロセスが落ちたり、ハンドルを閉じ忘れていたりする。だがまぁ、それはまだ可愛い方だ。とりあえず、結果オーライで動いているのだし、それに、間違えやすいポイントであり、必ずしも理解できないわけではない。

だが、中には作った奴の正気を疑いたくなるような記述もある。例えば、次のようなプログラム。

/* ↑ファイル名を取得する */
r = GetPrivateProfileString( ・・・ );


今時GetPrivateProfileStringを使うなと言う突っ込みではない。また、「ファイル名を取得する」等という、明々白々ことをコメントに書くなと言う突っ込みでもない。俺が怒っているのは、明らかに矢印の向きが間違っているということなのだ。

一体これは何を意図した記述なのだろうか? これを書いた奴は矢印の向きを間違って覚えているのだろうか? それとも、正真正銘の気違いなのだろうか?



/***************************************************
* 日付をする処理
***************************************************/
int ProcessDate( ・・・ )
{
 ・・・
}


ユーザが入力した日付の入力チェックを行う関数の前についていたコメント。「日付をする」って日本語として成立してネェし。


/* ↑日付のニューメリックチェック */
int d = atoi( strDate );
if ( d < 101 || d > 1231 ) {
/* ↑エラー */
・・・
}


atoiで文字列を数値に変換してもニューメリックチェックにはならないと思うのだが、気のせいだろうか? 値の範囲のチェックぐらいはできるだろうが、その間にある不正な値、例えば「0231」とかのチェックはできてないし。

ついでに言うと、この無意味な処理の後で、上記の「日付をする処理」を呼び出して、詳細な入力チェックを行っていた。


long wlong1[1000];
long wlong2[1000];
long wlong3[1000];
char *area;
char *area2;


データの並べ替えを行うための作業用の領域らしいのだが、変数名からはそういったことが読み取れない。変数名がwlongでは、long型の作業用領域だと言うことしか判らない。変数名で言うべき事は値の型ではなく、それが何のために使用されるのか、何の値が格納されるのかということを言うべきである。

当然、同じ事がareaにも言える。areaでは、何が入るのか全く想像もつかない。

また、long型配列に格納された整数値を並べ替える処理を自分で実装するな。それも、なにやら奇妙でトンチンカンなソート処理を作っているんじゃない。qsort関数ぐらい使え。というか、そんな暇があったのなら、コメントをちゃんと書け。


/***************************************************
* ファイルを検索する処理
***************************************************/
int MakeEnv( ・・・ )
{

}


「MakeEnv」という関数では、不要になったファイルを削除する処理を行っている。にもかかわらず、コメントには「ファイルを検索する処理」。何も言うことはない。


「前向き」に解釈すれば、作っているときにテンパッてこうなってしまったのだと、考えられなくもないが、しかし、余りにも酷いのではないだろうか? 常軌を逸したコメントを見ていると、本当に書いた奴の知能のレベルが低かったのだと思わざるを得ない。

0 件のコメント: