ケースクラスのいくつかの一般的な属性、たとえば id やタイムスタンプを因数分解して、これらの汎用コードを記述したいと思います。以下は問題なく動作しますが、各ケース クラスですべての属性を繰り返す必要があります。
trait HasIdAndTimestamp {
val id: Int
val timestamp: Long
}
case class Client(id: Int, timestamp: Long, name: String) extends HasIdAndTimestamp
case class Order(id: Int, timestamp: Long, items: List[Int], clientId: Int) extends HasIdAndTimestamp
...
もう 1 つのオプションは、MetaData 型の単一のフィールドにこれらの共通フィールドを設定することです。
case class MetaData(id: Int, timestamp: Long)
trait HasMetaData {
val metadata: MetaData
}
case class Client(metadata: MetaData, name: String) extends HasMetaData
case class Order(metadata: MetaData, items: List[Int], clientId: Int) extends HasMetaData
...
しかし、私はいつも .metadata.id を書くのはあまり好きではありません。また、これらのケース クラスを Slick を使用して DB に格納したいと考えています。このネストにより、テーブル定義に定型文が多数導入されます。次のようなものが欲しいです。
case class MetaData(id: Int, timestamp: Long)
case class Client(name: String) extends MetaData
case class Order(items: List[Int], clientId: Int) extends MetaData
...
Client と Order の両方にこれらの id とタイムスタンプ (val) フィールドがあり、それに応じて適用/適用解除が定義されています。
shapeless/scalaz はここで私を助けてくれますか?