積読になってた オブジェクト指向入門 第2版 原則・コンセプト を、少しきっかけがあって主に11章付近の契約による設計付近を読みました。
内容自体は、ある社内勉強会で得たこと中心でしたが、幾つか自分のためにメモ。
- ホアトリプル(Hoare triple)による正しさの公式
{P} A {Q}- P: 事前状態、A: 処理、Q: 事後状態
- 防御的プログラミングと、契約によるプログラミングの違い
- 前者は、他を信頼しないことを前提に入力値などを検査していく
- 後者は、契約により表明されたことを信頼し、過剰な防御は行わない。
- 冗長な検査は、ハードウェアは経年劣化などがあって時間によって変動があったり、例えば電気的な干渉などがある。そのため、電気的なシグナルの送り手と受け手の両方で整合性の検査を行うことはよくある方法。ソフトウェアは、何も経年劣化するようなことはないし、電気的な関与を受けるといったこともない。例えば sqrt(a) というメソッドを一度ちゃんと実装すると、それが1年後に挙動が突如変わる、ということはない。(実行環境の変化やシステムが更新されるとか、そういう外的な変化はないものとする)
- こう見ると、ハードウェアは過剰な防御をしているようで、実は冗長検査と言いつつも、特別・補足的な確認として利用されていることになる。
- require/ensureによる事前/事後の表明
- これは表明のサンプル
- 表明するモチベーション
- 正しいソフトウェアを書くのを助けるため
- 文書支援のため
- テスト、デバッグ、品質保証をサポートするため
- ソフトウェアの耐障害性(fault tolerance)をサポートする
最後に
ここら辺を学んでいると、Elixir/Erlangをやっていると、関数に対するマターンマッチや when によるguard clauseを思い浮かべました。Swiftでは where みたいなやつですね。
でも、この青い辞書はとても厚い…
1 Comment