2009-12-12

oldnewthing: マヌケは誰だ?

The Old New Thing : Only an idiot would have parameter validation, and only an idiot would not have it

引数チェックの面白いところは、ある者は、マヌケのみが使う機能だと主張し、またある者は、マヌケは利用しない機能だと主張することである。

古き良き時代では、Windowsは、引数チェックなど行っていなかった。もし、ある関数を無効なウインドウハンドルで呼んだならば、アプリはクラッシュする。ある関数を無効なポインタで呼んだならば、アプリはクラッシュする。ある関数を無効なビットマップハンドルで呼んだならば、アプリはクラッシュする。

かつては、よほどたくさんのクラッシュがあったわけだ。

この手のクラッシュは、修復不可能なアプリケーションエラーダイアログとして、表示されることになる。つまり、UAEメッセージとして知られている。

Windows 3.1は引数チェックを、KERNEL, USER, GDIのすべての関数に追加した。もし、アプリが無効なウインドウハンドルを渡した場合、クラッシュする代わりに、エラーが返されるのだ

この変更はあまり喜ばれなかった。「ふーん、あっそう。とうとうやるべきことをやり始めたってわけだな。引数チェックをしないってのは馬鹿げてるしな」

しかし、今日では、引数チェックは、どうもまた道をそれてしまったようだ。無効な引数を検知して、エラーコードを返した場合、それは、単にアプリのバグを先送りにしただけなのだ。むしろクラッシュして、クソみそでウザいエラーメッセージを表示すべきなのだ

つまり、我々は引数チェックを追加する前の時代に戻るべきなのだ。(まあ、クソウザいエラーメッセージはともかくとして)

はたしてマヌケは誰だ?

わざわざ引数をチェックして、エラーを静かに処理して、アプリのバグを先送りにするぐらいなら、クラッシュしてくれた方が、まだマシだったいうお話。

1 comment:

Anonymous said...

必ずクラッシュするならいいんですが、そうではなく任意のコードを実行できちゃってそれをやるやつがいる世の中でチェックしないなんてありえないでしょう。
チェックした上で、もしエラーだったらBASICのON ERROR RESUME NEXTよろしく握りつぶすのではなく、確実にクラッシュさせる(例えば例外を投げる)べきでしたね。.NET Framworkではすでにそうしているような気がします。