⛳
実は普段からやってるだけのこと 契約による設計: 事後条件編
これなに?
前回「実は普段からやってるだけのこと 契約による設計:事前条件編」の続き。
上記に引き続いて、契約による設計のうちの事前条件についての記事です💡
事後条件って?
契約による設計の「契約」と言ったときには以下の3つの登場人物がいます。
- 事前条件
- 事後条件
- 不変条件
このうちの事前条件。
関数やクラスが呼び出された後に満たすべき状態を指定し、使われる側が、使う側に対してこれだけは必ず守りますよということを示します。
雑に書いてみるとこういうイメージ↓
(便宜上、サンプルコード内にassert()という事後条件を確認するためのメソッドを配置しています)
このサンプルでは、Sort関数の中で事後条件を確認しています。
func Sort(arr []int) ([]int, error) {
var sorted []int
/*
何らかのソートする処理
*/
// 事後条件のチェック
if err := assert(arr, sorted); err != nil {
return 0, err
}
return result, nil
}
func assert(arr, sorted []int) error {
// 事後条件1: 出力される配列は、入力された配列と同じ要素を含んでいる
// 事後条件2: 出力される配列の要素は、昇順で整列されている
// 満たしていれば正常return
return nil
}
func main() {
arr := []int{2,4,1,5,3}
sorted, err := SortAsc(arr)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println(arr, sorted)
}
事前条件との関係
事後条件が守られるのは事前条件が満たされているという前提に立っています。
事前条件が守られていなければ事後条件は守られず、表明する意味がなくなってしまうため、その場合は関数やクラスの事前条件とセットで見直しましょう。
事前条件と事後条件の関係は、雑に言うと
「呼び出し側が事前条件を満たしてくれるなら、事後条件を満たす状態を最終的に実現することを約束するよ」
ということです。
なんらかのやりとりにおいて事前条件と事後条件を定義するということそのものに対して「契約」という言葉を使ってるわけです。
置き換えてイメージすると、顧客と提供者の関係において「こういうようにしてくれるなら、こうするよ」ってことを約束(契約)する感じ。
おわりに
今回は事後条件についてつらつら書いてみました。
本文にも書いたとおり、事後条件は重要なポイントなんですが、事前条件ありきなので、セットで意識できるとよりより堅牢なコードへの一歩になるかなと思っています。
Voicyに雑に触れている放送があるので、よかったら合わせてぜひ
Discussion