差分
契約による設計
,'''契約による設計'''(Design ([[英語]]:Design By Contract、でざいん・ばい・こんとらくと)とは、[[ソースコード]]の中に[[プログラム]]が満たすべき[[仕様]](契約)についての記述を盛り込み、[[設計]]の安全性を高める[[プログラミング]]の技法のひとつである。'''契約プログラミング'''(Programming By Contract)や、Design by Contract の頭文字である'''DbC''' (でぃーびーしー) とよばれることもある。の技法のひとつ、または[[プログラミング言語]]の機能のひとつである。
'''契約プログラミング'''(Programming By Contract)や、Design by Contract の頭文字である'''DbC''' (でぃーびーしー) とよばれることもある。 == 概要 ==たとえば、ある[[サブルーチン]]のに[[引数]]があるとして、があるとして、その引数が[[ぬるぽ]]や[[ぬるり]]を防ぐために引数のになることを防ぐためにサブルーチンの先頭部分で[[nullチェック]]や[[境界チェック]]を行う、などという[[コーディング規約]]に近いものを、[[プログラミング言語]]の[[仕様]]として半ば強制することで、[[静的コード解析]]やドキュメント生成などを的確に行えるようにし、やドキュメント生成、[[単体テスト]](のテンプレート生成)などを的確かつ効率的に行えるようにし、[[プログラム]]の品質を向上させようというものである。
== 条件の種類 ==
; [[事前条件]] (precondition) :[[サブルーチン]]の開始時に、これを呼ぶ側で保証すべき性質。の開始時に、これを呼ぶ側で保証すべき性質。たとえばというか、ほぼ引数の値のチェックである。
; [[事後条件]] (postcondition) :[[サブルーチン]]が、終了時に保証すべき性質。たとえば「[[戻り値]]は絶対に[[null]]を返さない」などを決めておくことを言う。
; [[不変条件]] (invariant) :[[クラス]]などの[[オブジェクト]]がその外部に公開しているすべての操作の開始時と終了時に保証されるべき、オブジェクト毎に共通した性質。
== 契約による設計をサポートする主な言語 ==
=== [[.NET Framework 4.0]] ===
[[.NET Framework 4.0]]では、[[コードコントラクト]]([[Code Contracts]])という名前の機能が追加され、[[プログラミング言語]]レベルではなく、[[ランタイム]]レベルで「契約による設計」に対応した。これにより[[.NET Framework]]系のすべての[[プログラミング言語]]が対応することとなった。
[[コードコントラクト]]を利用するための[[ライブラリ]]は[[System.Diagnostics.Contracts 名前空間]]にあり、[[事前条件]]、[[事後条件]]、[[不変条件]]などの表すための[[C Sharp/静的クラス|静的クラス]]が用意されている。
* http://msdn.microsoft.com/en-us/devlabs/dd491992
=== D言語 ===[[D言語]] ===の契約による設計機能は初の正式版リリースにあわせた目玉機能として大々的に宣伝されていた。しかし、プロジェクト自体のゴタゴタで正式リリースが遅れに遅れたことで[[.NET Framework 4.0]]に先を越されるという事態になった。残念賞である。
=== Sather ===[[EiffelSather]] ===は[[Eiffel]]は契約による設計を提唱・サポートした一番最初のから派生した[[プログラミング言語サブセット]]だそうだ。まったく知らない。であり、その後に独自の進化を遂げてものらしい。まったく知らない。
=== [[Sather]] Eiffel ===[[Eiffel]]から派生したは契約による設計を提唱およびサポートした一番最初の[[サブセットプログラミング言語]]で独自の進化を遂げてものらしい。だそうだ。
まったく知らない。
Eiffelの開発元であるEiffel Software(旧名:Interactive Software Engineering、略称:ISE)とマイクロソフト、オーストラリアのモナッシュ大学のグループが共同で[[共通言語ランタイム]]で動く[[Eiffel Sharp|Eiffel#]]なるものを出している<ref>[http://msdn.microsoft.com/ja-jp/library/ms973898.aspx</ref>。Eiffelの一部なので別途パッケージがあるわけではなく、[[Eiffel]]を入れるとオマケで付いてくる感じである。
== 関連項目 ==