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:

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

    ReplyDelete

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.