Я читал о том, как делать инъекцию зависимостей в скале через шаблон торта .Я думаю, что понимаю это, но я, должно быть, что-то пропустил, потому что все еще не вижу смысла в этом!Почему предпочтительнее объявлять зависимости с помощью собственных типов, а не просто абстрактных полей?
Учитывая пример в Программирование Scala TwitterClientComponent
объявляет такие зависимости, используя шаблон торт:
//other trait declarations elided for clarity
...
trait TwitterClientComponent {
self: TwitterClientUIComponent with
TwitterLocalCacheComponent with
TwitterServiceComponent =>
val client: TwitterClient
class TwitterClient(val user: TwitterUserProfile) extends Tweeter {
def tweet(msg: String) = {
val twt = new Tweet(user, msg, new Date)
if (service.sendTweet(twt)) {
localCache.saveTweet(twt)
ui.showTweet(twt)
}
}
}
}
Как это лучше, чем объявлять зависимости как абстрактные поля, как показано ниже?
trait TwitterClient(val user: TwitterUserProfile) extends Tweeter {
//abstract fields instead of cake pattern self types
val service: TwitterService
val localCache: TwitterLocalCache
val ui: TwitterClientUI
def tweet(msg: String) = {
val twt = new Tweet(user, msg, new Date)
if (service.sendTweet(twt)) {
localCache.saveTweet(twt)
ui.showTweet(twt)
}
}
}
Глядя на время создания экземпляра, когда DI действительно происходит (насколько я понимаю), я изо всех сил пытаюсь увидетьПреимущества торта, особенно если учесть дополнительную клавиатуру, которую нужно сделать для объявлений торта (черта)
//Please note, I have stripped out some implementation details from the
//referenced example to clarify the injection of implemented dependencies
//Cake dependencies injected:
trait TextClient
extends TwitterClientComponent
with TwitterClientUIComponent
with TwitterLocalCacheComponent
with TwitterServiceComponent {
// Dependency from TwitterClientComponent:
val client = new TwitterClient
// Dependency from TwitterClientUIComponent:
val ui = new TwitterClientUI
// Dependency from TwitterLocalCacheComponent:
val localCache = new TwitterLocalCache
// Dependency from TwitterServiceComponent
val service = new TwitterService
}
Теперь снова с абстрактными полями, более или менее одинаковыми!:
trait TextClient {
//first of all no need to mixin the components
// Dependency on TwitterClient:
val client = new TwitterClient
// Dependency on TwitterClientUI:
val ui = new TwitterClientUI
// Dependency on TwitterLocalCache:
val localCache = new TwitterLocalCache
// Dependency on TwitterService
val service = new TwitterService
}
Я уверен, что мне чего-то не хватает в превосходстве торта!Однако в настоящий момент я не вижу, что он предлагает для объявления зависимостей каким-либо другим способом (конструктор, абстрактные поля).