オブジェクトの不変条件
呼び出し前後などに関わらず、常に TRUEでなければならない条件。
クラスのプロパティを考えると、例えば Userクラスのemail属性は以下の条件は常にTRUEでないと使い物にならないと思う。
文字列である
emailの形式を満たしている(文字列 + @ + 文字列 + トップレベルドメイン)
@ + 文字列 + トップレベルドメインが実際にDNSレコードに存在していること
「文字列である」は静的型付け言語では言語レベルでtrueを保てる。つまり追加でコードを書く必要がない。(そうは言っても空文字のチェック等は必要かな...?)
型制約はデータに対する制約で最も普遍的なものなので言語レベルで保証できるのは嬉しい。
RailsのActive Recordのような、クラスがテーブルに、インスタンスが行に対応するような世界だと、
オブジェクトのプロパティの不変条件はデータベースの制約とも関連してくる。
Active Recordは Validationという形でデータ不整合を防ぐ仕組みを提供している。
不変条件を侵害すると、データ不整合を起こす。(文字列としての"0"を期待しているのに整数の0になっているとか)
これはバグの原因になり、ゆくゆくはシステムの信頼性を損なうことになってしまう。