Od pewnego czasu zacząłem uczyć się scala i teraz patrzę na wzór ciasta. Mam przykład z hereZnaczenie wzoru ciasta w scala
trait UserRepositoryComponent {
def userLocator: UserLocator
trait UserLocator {
def findAll: List[User]
}
}
trait UserRepositoryJPAComponent extends UserRepositoryComponent {
val em: EntityManager
def userLocator = new UserLocatorJPA(em)
class UserLocatorJPA(val em: EntityManager) extends UserLocator {
def findAll = {
println("Executing a JPA query")
List(new User, new User)
}
}
}
trait UserServiceComponent {
def userService: UserService
trait UserService {
def findAll: List[User]
}
}
trait DefaultUserServiceComponent extends UserServiceComponent {
this: UserRepositoryComponent =>
def userService = new DefaultUserService
class DefaultUserService extends UserService {
def findAll = userLocator.findAll
}
}
Dla mnie to wygląda zbyt wielu standardowy kod do uzyskania repozytorium WZP wtryskiwanego do służby.
Jednak ten kod będzie zrobić to samo z dużo mniejszą liczbą linii
trait UserRepository {
def findAll
}
trait JPAUserRepository extends UserRepository {
val em: EntityManager
def findAll = {
em.createQuery
println("find using JPA")
}
}
trait MyService {
def findAll
}
trait MyDefaultService extends MyService {
this: UserRepository=>
}
uruchamianiu obu scenariuszy.
val t1 = new DefaultUserServiceComponent with UserRepositoryJPAComponent {
val em = new EntityManager()
}
t1.userService.findAll
val t2 = new MyDefaultService with JPAUserRepository {
val em = new EntityManager
}
t2.findAll
Drugi scenariusz używa znacznie mniej kodu i używa DI. Czy możesz mi pomóc zrozumieć, jakie dodatkowe korzyści przynosi wzór ciasta.
Jak mówi @Archeg, drugi przykład jest również wariant ciasto wzorca. –