2010-10-07 75 views
2

在我的web应用程序中,授权用户至少有4个“facets”:http会话相关数据,持久数据,facebook数据,运行时业务数据。斯卡拉特质/蛋糕模式vs案例分类

我已经决定与案件阶级成分去特质,而不是至少有两个方面的原因:

  • 性状混合会导致名称冲突
  • 我想免费的案例类的好东西像模式匹配和复制方法

我想知道有关此主题的经验丰富的scalaists意见。它看起来像特质和/或蛋糕模式应该适合这样的任务,但正如我上面提到的有问题......它显而易见,不仅我想实现它快速和容易,但也深入了解它的使用在未来。

那么我的决定是否存在任何缺陷和误解或者是否正确? 相关的代码如下所示:


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

回答

1

第三个选项是使用隐式转换器(又名“pimp my library”),这可能不是必需的,因为您可以控制代码。

这一切都取决于你想要如何不透明(或透明)你的对象的某些方面。你可以假装它的一个普通的旧案例类到世界其他地方,但内部使它通过使用implicits做额外的工作。使用case类保存数据是合适的,但我也觉得使用三个类(ConnectingUserDisconnectedUserAuthenticatedUser)根据她的身份验证状态来表示同一个对象是很尴尬的。

object UserState { 
    def unapply(state: UserState) = Some(state.db, state.http) 
} 

这可以在匹配的状态下使用,如下所示::

val user = ConnectingUser(User(), HttpUserInfo("foo", 0, false)) 
user match { 
    case UserState(db, http) => println(http) 
} 
+0

谢谢你的回答。我目前正在处理案例类(因为修改使用特征混合创建的obects也存在问题,我的意思是case类的复制方法的作用,因为您必须使用反射或为每个组合隐式定义构造方法的特点)。所以在我的情况下,隐式转换以匹配特定的接口会很有用。 – 2010-10-10 14:07:13

3

我认为答案很简单:你同继承,只要一切真的“属于”你的对象,只要一切都在相同的“问题域”。

蛋糕模式的意图是将某些需要但不真正包含它的对象的部分分解出来,例如,策略,装饰,配置,上下文等。记录将是一个典型的例子。一般来说,我们谈论的是你不想“硬连线”的情况,例如您可能会考虑在Java中使用DI框架(如Guice或Spring)。请参阅http://jonasboner.com/2008/10/06/real-world-scala-dependency-injection-di.html就是一个很好的例子。

一个常常有助于决定做什么的问题是:“我如何测试对象行为?”。如果你发现建立一个合适的测试环境很困难,那么很可能你应该去耦合一些东西,这就意味着DI,通常可以用蛋糕模式方便地实现。

+0

的“蛋糕图案”

对于UserState,可以所以它的行为等的情况下类提供的提取长期通常用于服务的背景下,而不是数据,我把它添加到我的问题,主要是因为'名称冲突'问题,这是各种特质混合共同的问题。 – 2010-10-07 07:46:52

+0

而且我还没有完全理解'继承'的含义。问题是什么更好:特质混合(两级模型)或组合。我不喜欢继承(很多关卡模型),因为它让事情变得沉重。轻量级接口对我来说总是比较可取的,因为它们使所有上下文更简单(无需额外注意数据)。 – 2010-10-07 07:49:16