В моем веб-приложении у авторизованного пользователя есть как минимум 4 "грани": связанные с http-данными данные, постоянные данные, данные facebook, рабочие данные во время выполнения.Scala traits/cake pattern vs case classes
Я решил пойти с классом случая составом вместо признаков, по крайней мере по двум причинам:
- черты смешения может привести к конфликтам имен
- я хочу свободное лакомство случая класса как сопоставления с образцом и скопировать метод
Хотелось бы узнать мнение опытных экспертов по данной теме. Похоже, что черты и/или шаблон торта должны быть подходящими для таких задач, но, как я уже упоминал выше, есть проблемы ... Очевидно, что не только я хочу быстро и легко реализовать его, но и понять его в глубину для использования в будущем.
У моего решения есть недостатки и недоразумения, или это правильно? Связанные код выглядит следующим образом:
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
Благодарим вас за ответ. В настоящее время я занимаюсь классами case (так как существует проблема с модификацией объектов, созданных с перемешиванием признаков, я имею в виду способ копирования методов классов case, так как вы должны использовать отражение или неявно определять метод построения для каждой комбинации признаков). Поэтому в моем случае может быть полезно неявное преобразование в соответствие с определенными интерфейсами. –