私のWebアプリケーションでは、許可されたユーザーには少なくとも4つの「ファセット」があります。httpセッション関連データ、永続データ、Facebookデータ、ランタイムビジネスデータです。
少なくとも2つの理由から、トレイトではなくケースクラスの構成を使用することにしました。
- 特性の混合は名前の衝突を引き起こす可能性があります
- パターンマッチングやコピーメソッドなどのフリーケースクラスのグッズが欲しい
このテーマに関する経験豊富なスカラリストの意見を知りたいです。特性やケーキのパターンはそのようなタスクに適しているように見えますが、前述のように問題があります...迅速かつ簡単に実装するだけでなく、使用するために深く理解したいことは明らかです将来は。
それで、私の決定には欠陥や誤解がありますか、それとも正しいですか?関連するコードは次のようになります。
case class FacebookUserInfo(name: String, friends: List[Long])
case class HttpUserInfo(sessionId: String, lastInteractionTime: Long, reconnect: Boolean)
case class RuntimeQuizUserInfo(recentScore: Int)
trait UserState {
def db: User
def http: HttpUserInfo
}
case class ConnectingUser(db: User, http: HttpUserInfo) extends UserState
case class DisconnectedUser(db: User, http: HttpUserInfo, facebook: Option[FacebookUserInfo]) extends UserState
case class AuthorizedUser(db: User, http: HttpUserInfo, facebook: FacebookUserInfo,
quiz: RuntimeQuizUserInfo) extends UserState