trait / case class / object どう使ったら良いのかって話
聞きかじった話を、今後考える課題としてメモ。
結論Scalaではclass
は使わないってお話。
オブジェクト指向でシステムを設計するときに必要なものは、ざっくり分けると
- インタフェース(メソッド)
- データ(メンバ)
このふたつ。
あとは、これを実体化して利用するだけ。
Scalaでは、インタフェースとしてのTraitを複数(ひし形に)継承できる。 これはつまり、その組み合わせの数だけ統一されたインタフェースで、 具体的な実装に起こすことができる。
例えば、Webサーバーを作ろうとしたときに、
- 同期処理用のトレイト
- 非同期処理用のトレイト
のふたつを用意しておいて、それぞれに対して
のように複数のプロトコルに対応したトレイトをつくる。
そうすると、その種類を乗じた数(ここでは2 * 3)のパターンだけインタフェースを作れる。
必要なデータはcase class
に持たせる。
ヘッダー情報などは、case class
にマッピングするということ。
そしてこれを実体化するときは、シングルトン的にobject
を呼び出す。
ついついDTOに余計な実装が入ってしまうなどのことは起きがちであるが。
そもそも、実装とデータは分離されるべきで、そのためにtrait
とcase class
を使い分ける。
ちなみに、トレイトを複数組合せるとき、例えば先の例では同期的処理を行う場合も非同期的な処理を行う場合も結果を同じ形でやり取りしたい。
そこで、FutureやOptionをモナドとして扱う必要がある。
そのためのモナドだったのか。その点はもう少し考えたい。