契約による設計

提供: MonoBook
2014年8月7日 (木) 07:05時点における180.53.164.133 (トーク)による版 (→‎概要)
ナビゲーションに移動 検索に移動

契約による設計英語:Design By Contract、でざいん・ばい・こんとらくと)とは、ソースコードの中にプログラムが満たすべき仕様(契約)についての記述を盛り込み、設計の安全性を高めるプログラミングの技法のひとつ、またはプログラミング言語の機能のひとつである。

契約プログラミング(Programming By Contract)や、Design by Contract の頭文字であるDbC (でぃーびーしー) とよばれることもある。

概要

たとえば、あるサブルーチン引数があるとして、その引数がぬるぽぬるりになることを防ぐためにサブルーチンの先頭部分でnullチェック境界チェックを行う、などというコーディング規約に近いものを、プログラミング言語仕様として半ば強制することで、静的コード解析やドキュメント生成、単体テスト(のテンプレート生成)などを的確かつ効率的に行えるようにし、プログラムの品質を向上させようというものである。

条件の種類

契約は、コードの利用条件が満たされることによって成立する。それら条件は、満たすべきタイミングと主体によって以下の3種類に分けられる。

事前条件 (precondition) 
サブルーチンの開始時に、これを呼ぶ側で保証すべき性質。たとえばというか、ほぼ引数の値のチェックである。
事後条件 (postcondition) 
サブルーチンが、終了時に保証すべき性質。たとえば「戻り値は絶対にnullを返さない」などを決めておくことを言う。
不変条件 (invariant) 
クラスなどのオブジェクトがその外部に公開しているすべての操作の開始時と終了時に保証されるべき、オブジェクト毎に共通した性質。

コードを呼ぶ側が事前条件不変条件を満たす義務を負うことで、呼ばれたコードはその条件が恒真であるとの前提を利益として得る。

引き換えに、呼ばれたコードは事後条件と不変条件を義務として負い、呼ぶ側の利益としてこれを保証する。

契約による設計をサポートする主な言語

ここに記載するプログラミング言語はあくまで一例でありすべてではない。

.NET Framework 4.0

.NET Framework 4.0では、コードコントラクトCode Contracts)という名前の機能が追加され、プログラミング言語レベルではなく、ランタイムレベルで「契約による設計」に対応した。これにより.NET Framework系のすべてのプログラミング言語が対応することとなった。

また、Visual Studio用のアドオンも提供されており、契約による設計のキモである静的チェックドキュメントの自動生成も行いえる。とくに静的チェックはとても重要な要素であり、これが使えないとただのコーディング規約程度の話で終わってしまい、契約による設計の魅力の99.9999%が失われる。

なおアドオンが使えないVisual Studio Expressではツール群が使えないので、ただの実行時のエラーチェックと化し、前述のように契約による設計の魅力の99.9999%が失われる。

コードコントラクトを利用するためのライブラリSystem.Diagnostics.Contracts 名前空間にあり、事前条件事後条件不変条件などの表すための静的クラスが用意されている。

D言語

Eiffel

Eiffelは契約による設計を提唱・サポートした一番最初のプログラミング言語だそうだ。まったく知らない。

Sather

Eiffelから派生したサブセットで独自の進化を遂げてものらしい。 まったく知らない。

関連項目

参考文献


外部リンク