💬
契約プログラミングのまとめ
契約プログラミングについて何となくでしか把握していなかったので自分にとって分かりやすくまとめる。
自分は普段PHPを書いているのでオブジェクト指向での用語で説明していく
そのメソッドが正しいかどうかを証明するにはどうすればいいのか
正しさの公式(ホアのトリプル)というものがある
{P} A {Q}
任意のAの実行は、Pの状態になったときに始まり、Qの状態になったとき に終了する
Pが引数、Aがメソッド(処理の内容)、Qが返り値と言える
事前条件
- メソッドを呼ぶ側がメソッドの処理が始まる前に保証すべき値の性質
メソッドの事前条件が満たされない場合はメソッドを呼ばない事。
メソッドの最初の方で引数のチェックをするのは良く見る実装(青い本には防御的プログラミングと記述がある)だけど、あくまでもメソッド本体ではなくメソッドを呼ぶ側の責任らしい。
事後条件
- メソッドの処理が終わった際に保証されるべき値の性質
不変条件
- クラスの全てのメソッドが最初から最後まで処理が終わった際に必ず保証するインスタンスの値の性質
表明
表明は会社でも個人のプロダクトで使った事ないからいまいちよく分からなかった。
前提条件で必ず真となる条件で使うらしい。必ずなので万が一擬になったらそれはバグらしい。
これに対して例外は起こりうる状況(validationErrorとか)に使う。
参考記事・資料
- https://qiita.com/hiko1129/items/f312212070716f672ff6
- 『オブジェクト指向入門 第2版 原則・コンセプト』 Bertrand Meyre, 翔泳社 2007
Discussion