私の開発では、ロボットの脚の拘束問題を多用しています。Guice で解決する方法は知っていますPrivateModule
が、Scala のケーキ パターンでこれを行う方法は明確ではありません。
理想的には、ブログ投稿の最後にあるジョナス・ボナーのコーヒーの例に基づいた具体的な例を使用して、これがどのように行われるかを誰かが説明できますか? おそらく、左右に設定できるウォーマーを使用して、向きとdef isRightSide
?
私の開発では、ロボットの脚の拘束問題を多用しています。Guice で解決する方法は知っていますPrivateModule
が、Scala のケーキ パターンでこれを行う方法は明確ではありません。
理想的には、ブログ投稿の最後にあるジョナス・ボナーのコーヒーの例に基づいた具体的な例を使用して、これがどのように行われるかを誰かが説明できますか? おそらく、左右に設定できるウォーマーを使用して、向きとdef isRightSide
?
Cake パターンは、この問題を本来の形で解決するものではありません。それに対処する方法はいくつかあります。私が好む解決策は、適切なパラメーターを指定してコンストラクターを呼び出すことにより、各「ロボットの脚」を作成することです。コードは、言葉よりも優れていることを示しています。
上記の回答の方が読みやすいと思いますが、Jonas の例に既に精通している場合は、Warmer を向きで構成可能にする方法を次に示します。
// =======================
// service interfaces
trait OnOffDeviceComponent {
val onOff: OnOffDevice
trait OnOffDevice {
def on: Unit
def off: Unit
}
}
trait SensorDeviceComponent {
val sensor: SensorDevice
trait SensorDevice {
def isCoffeePresent: Boolean
}
}
// =======================
// service implementations
trait OnOffDeviceComponentImpl extends OnOffDeviceComponent {
class Heater extends OnOffDevice {
def on = println("heater.on")
def off = println("heater.off")
}
}
trait SensorDeviceComponentImpl extends SensorDeviceComponent {
class PotSensor extends SensorDevice {
def isCoffeePresent = true
}
}
// =======================
// service declaring two dependencies that it wants injected
trait WarmerComponentImpl {
this: SensorDeviceComponent with OnOffDeviceComponent =>
// Note: Warmer's orientation is injected by constructor.
// In the original Cake some mixed-in val/def would be used
class Warmer(rightSide: Boolean) {
def isRightSide = rightSide
def trigger = {
if (sensor.isCoffeePresent) onOff.on
else onOff.off
}
}
}
// =======================
// instantiate the services in a module
object ComponentRegistry extends
OnOffDeviceComponentImpl with
SensorDeviceComponentImpl with
WarmerComponentImpl {
val onOff = new Heater
val sensor = new PotSensor
// Note: now we need to parametrize each particular Warmer
// with its desired orientation
val leftWarmer = new Warmer(rightSide = false)
val rightWarmer = new Warmer(rightSide = true)
}
// =======================
val leftWarmer = ComponentRegistry.leftWarmer
leftWarmer.trigger