私はケーキのパターンについて学びたいと思っています。ケーキのパターン - それはなぜとても複雑ですか
私はそれについてthisブログを読んでいます。
そのブログからのコード例は次のとおりです。
case class User (name:String,email:String,supervisorId:Int,firstName:String,lastName:String)
trait UserRepository {
def get(id: Int): User
def find(username: String): User
}
trait UserRepositoryComponent {
def userRepository: UserRepository
trait UserRepository {
def get(id: Int): User
def find(username: String): User
}
}
trait Users {
this: UserRepositoryComponent =>
def getUser(id: Int): User = {
userRepository.get(id)
}
def findUser(username: String): User = {
userRepository.find(username)
}
}
trait UserInfo extends Users {
this: UserRepositoryComponent =>
def userEmail(id: Int): String = {
getUser(id).email
}
def userInfo(username: String): Map[String, String] = {
val user = findUser(username)
val boss = getUser(user.supervisorId)
Map(
"fullName" -> s"${user.firstName} ${user.lastName}",
"email" -> s"${user.email}",
"boss" -> s"${boss.firstName} ${boss.lastName}"
)
}
}
trait UserRepositoryComponentImpl extends UserRepositoryComponent {
def userRepository = new UserRepositoryImpl
class UserRepositoryImpl extends UserRepository {
def get(id: Int) = {
???
}
def find(username: String) = {
???
}
}
}
object UserInfoImpl extends
UserInfo with
UserRepositoryComponentImpl
私はUsers
を除去することによって、そのコードを簡素化することができます。
package simple {
case class User(name: String, email: String, supervisorId: Int, firstName: String, lastName: String)
trait UserRepository {
def get(id: Int): User
def find(username: String): User
}
trait UserRepositoryComponent {
def userRepository: UserRepository
trait UserRepository {
def get(id: Int): User
def find(username: String): User
}
}
trait UserInfo {
this: UserRepositoryComponent =>
def userEmail(id: Int): String = {
userRepository.get(id).email
}
def userInfo(username: String): Map[String, String] = {
val user = userRepository.find(username)
val boss = userRepository.get(user.supervisorId)
Map(
"fullName" -> s"${user.firstName} ${user.lastName}",
"email" -> s"${user.email}",
"boss" -> s"${boss.firstName} ${boss.lastName}"
)
}
}
trait UserRepositoryComponentImpl extends UserRepositoryComponent {
def userRepository = new UserRepositoryImpl
class UserRepositoryImpl extends UserRepository {
def get(id: Int) = {
???
}
def find(username: String) = {
???
}
}
}
object UserInfoImpl extends
UserInfo with
UserRepositoryComponentImpl
}
、それがうまくコンパイルされます。
1)ブログのコードが複雑なのはなぜですか?
2)それはケーキパターンを使用する慣用方法ですか?
3)この例では、なぜUsers
クラスが必要ですか?
4)は?ケーキのパターンは、その一見不要Users
クラスで(ように見えることになって仕方こと
5)であるか、簡易版だけで結構ですか?
ブログにはコメントセクションがあります。なぜあなたは作者に尋ねることで始まらないのですか? – pedrorijo91
:) :) :) :) :) :)あなたは面白いです – jhegedus
申し訳ありませんが、気づかなかった、ちょうど3年前からのコメントを見ました.. **私はコード**で多くを掘り起こさなかった私はそれが単なる間接的なレベルだと思う。あなたがその行動を模倣したりスタブしたいのであればテストに役立つかもしれません – pedrorijo91