TL;DR
- 契約による設計の表明でモジュール間の契約を定義すると、責任の所在が明確になり、コードがシンプルになる。
- Scala には不変条件の構文がないので、case class で実装する。表明はシステム境界の内側、バリデーションは外側からの入力に使う。
内容
ALP の connpass イベント「SaaSプロダクト開発のScala活用事例」での発表である。
契約による設計と表明
契約による設計では、事前条件と事後条件で、呼び出す側と提供する側の権利と義務を明示する。表明を書くと責任の所在が明確になり、コードがシンプルになる。表明は「動くドキュメント」でもある。
不変条件の実装
Scala には不変条件を定義する構文がないので、case class を使って実装する。不変条件は生成時と copy 時に検査される。イミュータブルなら、破棄されるまでその状態が保たれる。
Either との組み合わせ
ファイルアクセスやデータベースのエラーのように、コードの正しさだけでは抑えられない実行時エラーは、契約の履行の失敗として Either で表す。バリデーションはシステム境界の外から来る入力を検証する仕組みで、表明はシステム境界の内側でモジュール同士のやり取りを定めた契約である。
まとめ
表明でモジュール間の契約を定義し、表明のエラーが起きたらコードを直す。不変条件でデータの破損を未然に防ぐ。参考文献として、バートランド・メイヤーの『オブジェクト指向入門 第2版 原則・コンセプト』と、エリック・エヴァンスの『エリック・エヴァンスのドメイン駆動設計』が挙げられていた。