コンストラクタの例外について


twitterでコンストラクタの例外について触れたが、
興味深い問題だったので再考。
自分の考えを書き出してみる。

* まずコンストラクタ例外の必要性について

おさらいも含めて例外の必要性を考えてみる。 

データ抽象型は、
・ 型
・ 不変条件
・ 事前条件
・ 関数(生成関数 ← これを定義したのがコンストラクタ 、問い合わせ関数、命令関数)
 で定義される。(厳密な説明ではないけど)

データ抽象型は値(オブジェクト)の集合であるから
すべての値は不変条件を満たす。

 
数理的にはこうだけど、
契約による設計 Design By Contract(以後 DbC )という技法を用いて
ソースコード中に不変条件と事前条件の一部を記述することができる。
特に事前条件はそれぞれの関数に記述する。

データ抽象型の定義により、
生成関数にも事前条件がある。
事前条件が満たされなければそもそも値は生成されない。

もし契約違反があれば例外やエラーなどを発生させる。
契約違反といっても

1. プログラマが間違った記述した。
2. "計算機が正しい演算を行っていること"、データベースが正しく接続できること"などの暗黙の条件が満たされなかったこと。
 
の2種類がある。
 
1は、
妥当でない入力("aaa"を数値にパースしようとした等)をした場合などで、こういうのはエラーでプログラム停止である。
バグだからね。事前条件を満たすのは呼び出し側の責任だからね。
中にはコンパイルタイムエラーにできるものもある。

2は、
現実的には、DbCでも記述するのは不可能で
もしそういった契約違反が発生した場合でもプログラムを続行しなければならない。
例外を使うことでこれが実現できる。

ということで、
・生成関数には事前条件がある。
・2のような契約違反を実現するために例外が必要。
 
だからDbCを使うならばコンストラクタの例外は必要な状況があると思うんだ。
 

・言語の問題 C++ C# Haskell

 あとで書く(^q^)