河野真治 @ 琉球大学情報工学です。

(そういえば、fj.comp.programming にWriting Solid Codeの
悪口を書いたときは反応0だった... で、その繰り返しなんだけど) 

In article <bfr400$2hs$1@news01.highway.ne.jp>, takaoki@aisoft.co.jp (Narita Takaoki) writes
> あの変な本にも、assert は絶対起こりえない状況を書けとかあったよう
> な気がするんだけれど……なかったっけか?

そのサブルーチンでの前提条件を書けですね。早めにバグを見つける
手段として使うみたい。

> 当然、assert(0) で落ちると即、人が死ぬ可能性があるとかなら、
> assert(0) にしないってのが筋ってもんだろうし。

だから、当然、製品では落すわけですな。あの本(Writing Sold Code)
の変なところは、「製品になった後のエラーは、俺は知らん」という
考えなんだよな...

あと、エラーは悪いことだってのが前提としてあるみたい。

> 私の説明も悪いのかもしれないけれど、assert を書く意味(心?^^;)を
> 一回の説明で理解してもらえたことってないなぁ。エレガントで明快な
> 説明って難しい……

サブルーチンに前提条件があるとすれば、それを明示しろってのは
理解できます。しかし、それをチェックすると遅くなるってのは、
僕は、なんか変だと思う。コンパイラや実行時の工夫で、それは避
けられるはず。

オブジェクト指向とかコードの再利用、あるいは、プラグインなどが
導入された現在では、

    処理を実行する前提条件は、必ず、チェックする

ってのが必須だと思う。なので、assert ってのは現状にあってな
いと思います。この手のコードは残るべきなのね。そして、

    エラーチェックで失敗したときに、あと引き受ける

ことが必須だと思う。もちろん、絶対に復帰できないエラーっての
があるのは、そうだと思うんだけど、オブジェクトとかメモリプー
ルとかプロセスとか使うことによって結構避けられると思うんだけ
ど。

というわけで、僕の立場は、

     エラー処理をしないことが前提のassertは、製品化しないような
     プログラム(あるいは、マイクロソフトの売ったら勝ち、バグは
     知らん方針)が前提であり、時代遅れであって、使ってはいけない
     ものだ。

ってなもんです。

たぶん、数値計算とかだと「デバッグ時」と「計算時」がわかれている
から assert とか有効なのも知れないな。


Writing Sold Code には、もう一つ、

     サブルーチンのエラー通知と値の返却を共用しない (つまりEOF==1やNaNみたいな
     のを使わない)

ってものがあるんだけど、これもエラーを上位に通知しないことを
前提に書いていると思う。エラーを通知する手段としてreturn value
を使うのは僕は有効だと思う。実際、EOF は便利だし。

エラーを特別視することが間違っているんだろうな。プログラム理論
的にも⊥は便利だし。
   
---
Shinji KONO @ Information Engineering, University of the Ryukyus, 
              PRESTO, Japan Science and Technology Corporation
河野真治 @ 琉球大学工学部情報工学科, 
           科学技術振興事業団さきがけ研究21(機能と構成)