多くの共通コードを持ついくつかのクラスを持つ Scala プログラムがあります。多くのコードは汎用的なため、次のようなものがあります (TypeTags を使用して型情報を保持します):
object ModelA {
def update(id: UUID, changes: Map[String, Any]) = {
Validate.partialInstanceOf[ModelA](changes) match {
...
}
}
}
と ...
object ModelB {
def update(id: UUID, changes: Map[String, Any]) = {
Validate.partialInstanceOf[ModelB](changes) match {
...
}
}
}
私は Scala にかなり慣れていないので、このコードを DRY 化する最良の方法は何かと考えていました。トレイトまたはヘルパー クラスの 2 つの可能性があります。これは私が特性のために念頭に置いていたことです:
trait Model[M <: Model] {
def update(id: UUID, changes: Map[String, Any]) = {
Validate.partialInstanceOf[M](changes) match {
...
}
}
}
object ModelA extends Model[ModelA]
object ModelB extends Model[ModelB]
...そして、これはヘルパークラスについて私が念頭に置いていたことです:
object ModelHelper {
def update[M](id: UUID, changes: Map[String, Any]) = {
Validate.partialInstanceOf[M](changes) match {
...
}
}
}
object ModelA {
def update(id: UUID, changes: Map[String, Any]) = {
ModelHelper.update[ModelA](id, changes);
}
}
...
私の質問は次のとおりです。より慣用的な Scala アプローチは何ですか? 子の型を親の特性に渡すことは、私にはちょっと面倒に思えます。これは大丈夫ですか?