8

私の開発では、ロボットの脚の拘束問題を多用しています。Guice で解決する方法は知っていますPrivateModuleが、Scala のケーキ パターンでこれを行う方法は明確ではありません。

理想的には、ブログ投稿の最後にあるジョナス・ボナーのコーヒーの例に基づいた具体的な例を使用して、これがどのように行われるかを誰かが説明できますか? おそらく、左右に設定できるウォーマーを使用して、向きとdef isRightSide?

4

1 に答える 1

3

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
于 2012-01-27T21:43:01.190 に答える