J'essaie d'en apprendre davantage sur le modèle de gâteau. Je lis le blog this à ce sujet.modèle de gâteau - pourquoi est-il si compliqué
Le code exemple de ce blog est:
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
je peux simplifier ce code en supprimant 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
}
et il compile très bien.
1) Pourquoi le code du blog est-il si compliqué?
2) Est-ce la façon idiomatique d'utiliser le modèle de gâteau?
3) Pourquoi la classe Users
est-elle nécessaire dans cet exemple?
4) Est-ce que la façon dont le modèle de gâteau censé ressembler (avec cette classe Users
apparemment inutile?
5) Ou est la version simplifiée très bien?
le blog a une section de commentaire. pourquoi ne commencez-vous pas par demander à l'auteur? – pedrorijo91
:) :) :) :) :) :) - vous êtes drôle – jhegedus
désolé, n'a pas remarqué, juste vu le commentaire d'il y a 3 ans .. ** Je n'ai pas beaucoup creusé dans le code **, mais Je pense que c'est juste un autre niveau d'indirection.cela peut aider dans les tests si vous voulez mock/stub ce comportement – pedrorijo91