Contract(ソフトウェアにおける契約)
モジュールの境界(Interface)における、StructureとBehaviorの両面の約束。
二つの側面
| 側面 | 担うもの | 内容 |
|---|---|---|
| Structure的側面 | 型システム | I/Fの形の定義——引数の型、戻り値の型、許容される状態 |
| Behavior的側面 | テスト | 特定の入力に対する出力、状態遷移の正しさ |
Contractは内部のImplementation(Structure + Behavior)を隠蔽しつつ、外部に対して何を約束するかを宣言する。
フラクタル構造
この Contract はすべての粒度で再帰的に現れる:
| スケール | Contract の形 |
|---|---|
| 関数 | 関数シグネチャ + 単体テスト |
| モジュール | 公開インターフェース + 統合テスト |
| システム | API仕様 + E2Eテスト |
良い Contract の条件
Contractの推論可能性——I/Fから内部のStructureが推察可能であること。
推察通りに動くことが「期待通り」と感じられ、それがRequirementsと合致すれば「正しい」と判断される。
関連概念
- Design by Contractの文脈では事前条件・事後条件・不変条件として定式化される
- Zave-Jacksonの枠組みにおける Specification に対応する
- 型駆動開発では型がContractのStructure的側面を担う