scala - 关于蛋糕图案的问题

标签 scala traits

蛋糕图案 article建议使用特征作为命名空间:

trait UserRepositoryComponent {  
  val userRepository: UserRepository  
  class UserRepository {...}
}

trait UserServiceComponent {this: UserRepositoryComponent =>   
  val userService: UserService    
  class UserService {...}  
}

class Context extends UserServiceComponent with UserRepositoryComponent {  
  val userRepository = new UserRepository  
  val userService = new UserService  
} 

但是,如果我们可以执行以下操作,我们真的需要这些“命名空间特征”(UserServiceComponentUserRepositoryComponent)吗?

trait UserRepository {...}

trait UserService {this: UserRepository => 
  ...
}

class Context extends UserRepositoryImpl with UserService

所以,我的问题是我们何时以及为何需要 Cake Pattern 中的“命名空间”特性。

最佳答案

您的方法有两个缺点:

  1. Context 承担了太多责任,混淆了来自 UserRepositoryUserService 等的方法;
  2. 在第一个片段中,您可以控制初始化的顺序,或者延迟某些组件的初始化 - 例如,您可以将 userRepository 设为 lazy val,这将显着简化测试,如果您只想测试 userService(因此不想引导整个基础架构);

虽然我不推荐它,但在第一种情况下,您还可以在运行时更改注入(inject)实体(使用 vars)。

关于scala - 关于蛋糕图案的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5898009/

相关文章:

scala - 猫 : mapping over tuples with the same applicative

scala - sbt 0.11.3 : getting latest version of a git plugin

scala - 根据 Slick 中的 Id 选择单行

rust - 如何将装箱移动到函数而不是调用方

scala - "override"当继承的特征组合时如何工作?

C++ 判断一个容器是否有::find()

java - ReplicaFetcher 崩溃 - 第一个偏移量 XXXXXXX 小于下一个偏移量 YYYYYYYY

scala - Spark-rdd 操作数据

rust - 构造具有特征约束的任何类型的向量

python - 特征列表处理程序不响应 += 列表扩展