契約による設計

提供: MonoBook
DbCから転送)
移動: 案内検索

契約による設計英語: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言語[編集]

D言語の契約による設計機能は初の正式版リリースにあわせた目玉機能として大々的に宣伝されていた。 しかし、プロジェクト自体のゴタゴタで正式リリースが遅れに遅れたことで.NET Framework 4.0に先を越されるという事態になった。 残念賞である。

Sather[編集]

SatherEiffelから派生したサブセットであり、その後に独自の進化を遂げてものらしい。 まったく知らない。

Eiffel[編集]

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

Eiffelの開発元であるEiffel Software(旧名:Interactive Software Engineering、略称:ISE)とマイクロソフト、オーストラリアのモナッシュ大学のグループが共同で共通言語ランタイムで動くEiffel#なるものを出している[1]。Eiffelの一部なので別途パッケージがあるわけではなく、Eiffelを入れるとオマケで付いてくる感じである。

関連項目[編集]

参考文献[編集]

  1. [http://msdn.microsoft.com/ja-jp/library/ms973898.aspx

外部リンク[編集]