戦略 Scala 日記

素人プログラマの思考のセンス

trait / case class / object どう使ったら良いのかって話

聞きかじった話を、今後考える課題としてメモ。 結論Scalaではclassは使わないってお話。

オブジェクト指向でシステムを設計するときに必要なものは、ざっくり分けると

  • インタフェース(メソッド
  • データ(メンバ)

このふたつ。
あとは、これを実体化して利用するだけ。

Scalaでは、インタフェースとしてのTraitを複数(ひし形に)継承できる。 これはつまり、その組み合わせの数だけ統一されたインタフェースで、 具体的な実装に起こすことができる。

例えば、Webサーバーを作ろうとしたときに、

  • 同期処理用のトレイト
  • 非同期処理用のトレイト

のふたつを用意しておいて、それぞれに対して

のように複数プロトコルに対応したトレイトをつくる。
そうすると、その種類を乗じた数(ここでは2 * 3)のパターンだけインタフェースを作れる。

必要なデータはcase classに持たせる。
ヘッダー情報などは、case classマッピングするということ。

そしてこれを実体化するときは、シングルトン的にobjectを呼び出す。

ついついDTOに余計な実装が入ってしまうなどのことは起きがちであるが。
そもそも、実装とデータは分離されるべきで、そのためにtraitcase classを使い分ける。

ちなみに、トレイトを複数組合せるとき、例えば先の例では同期的処理を行う場合も非同期的な処理を行う場合も結果を同じ形でやり取りしたい。 そこで、FutureやOptionをモナドとして扱う必要がある。
そのためのモナドだったのか。その点はもう少し考えたい。