「契約による設計」の版間の差分
1行目: | 1行目: | ||
− | '''契約による設計''' | + | '''契約による設計'''(英語:Design By Contract、でざいん・ばい・こんとらくと)とは、[[ソースコード]]の中に[[プログラム]]が満たすべき[[仕様]](契約)についての記述を盛り込み、[[設計]]の安全性を高める[[プログラミング]]の技法のひとつである。'''契約プログラミング'''(Programming By Contract)や、Design by Contract の頭文字である'''DbC''' (でぃーびーしー) とよばれることもある。 |
− | たとえば、ある[[サブルーチン]]の[[引数]]があるとして、[[ぬるぽ]]や[[ぬるり]]を防ぐために引数の[[nullチェック]]や[[境界チェック]]を行う、などという[[コーディング規約]]に近いものを、[[プログラミング言語]]の[[仕様]]として半ば強制することで、[[静的コード解析]] | + | たとえば、ある[[サブルーチン]]の[[引数]]があるとして、[[ぬるぽ]]や[[ぬるり]]を防ぐために引数の[[nullチェック]]や[[境界チェック]]を行う、などという[[コーディング規約]]に近いものを、[[プログラミング言語]]の[[仕様]]として半ば強制することで、[[静的コード解析]]やドキュメント生成、[[単体テスト]](のテンプレート生成)などを的確かつ効率的に行えるようにし、[[プログラム]]の品質を向上させようというものである。 |
== 条件の種類 == | == 条件の種類 == | ||
− | + | 契約は、コードの利用条件が満たされることによって成立する。それら条件は、満たすべきタイミングと主体によって以下の3種類に分けられる。 | |
− | |||
− | ; [[事前条件]] (precondition) :[[サブルーチン]] | + | ; [[事前条件]] (precondition) :[[サブルーチン]]の開始時に、これを呼ぶ側で保証すべき性質。たとえばというか、ほぼ引数の値のチェックである。 |
; [[事後条件]] (postcondition) :[[サブルーチン]]が、終了時に保証すべき性質。たとえば「[[戻り値]]は絶対に[[null]]を返さない」などを決めておくことを言う。 | ; [[事後条件]] (postcondition) :[[サブルーチン]]が、終了時に保証すべき性質。たとえば「[[戻り値]]は絶対に[[null]]を返さない」などを決めておくことを言う。 | ||
; [[不変条件]] (invariant) :[[クラス]]などの[[オブジェクト]]がその外部に公開しているすべての操作の開始時と終了時に保証されるべき、オブジェクト毎に共通した性質。 | ; [[不変条件]] (invariant) :[[クラス]]などの[[オブジェクト]]がその外部に公開しているすべての操作の開始時と終了時に保証されるべき、オブジェクト毎に共通した性質。 |
2013年4月11日 (木) 04:13時点における版
契約による設計(英語: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から派生したサブセットで独自の進化を遂げてものらしい。 まったく知らない。
関連項目
- バートランド・メイヤー(仏:Bertrand Meyer) - 契約による設計の提唱者、Eiffelを作ったプログラマー
- リスコフの置換原則(Liskov substitution principle)
- 正当性(Correctness)
- 表明(Assertion)
- コーディング規約
- デザインパターン
- 設計
- 実装
- 仕様
参考文献