TL;DR

  • 契約による設計の表明でモジュール間の契約を定義すると、責任の所在が明確になり、コードがシンプルになる。
  • Scala には不変条件の構文がないので、case class で実装する。表明はシステム境界の内側、バリデーションは外側からの入力に使う。

内容

ALP の connpass イベント「SaaSプロダクト開発のScala活用事例」での発表である。

契約による設計と表明

契約による設計では、事前条件と事後条件で、呼び出す側と提供する側の権利と義務を明示する。表明を書くと責任の所在が明確になり、コードがシンプルになる。表明は「動くドキュメント」でもある。

不変条件の実装

Scala には不変条件を定義する構文がないので、case class を使って実装する。不変条件は生成時と copy 時に検査される。イミュータブルなら、破棄されるまでその状態が保たれる。

Either との組み合わせ

ファイルアクセスやデータベースのエラーのように、コードの正しさだけでは抑えられない実行時エラーは、契約の履行の失敗として Either で表す。バリデーションはシステム境界の外から来る入力を検証する仕組みで、表明はシステム境界の内側でモジュール同士のやり取りを定めた契約である。

まとめ

表明でモジュール間の契約を定義し、表明のエラーが起きたらコードを直す。不変条件でデータの破損を未然に防ぐ。参考文献として、バートランド・メイヤーの『オブジェクト指向入門 第2版 原則・コンセプト』と、エリック・エヴァンスの『エリック・エヴァンスのドメイン駆動設計』が挙げられていた。

キーワード