8

Mi desarrollo hace un uso extensivo del problema de unión de las piernas del robot. Conozco how to solve it con PrivateModule en Guice, pero no está claro cómo se haría con el patrón de tortas de Scala.¿Cómo puedo usar el patrón de tortas de Scala para implementar las patas del robot?

¿Podría alguien explicar cómo se haría esto, idealmente con un ejemplo concreto basado en el ejemplo del café de Jonas Boner al final de su blog post? ¿Tal vez con un calentador que se podría configurar para los lados izquierdo y derecho, inyectado con una orientación y un def isRightSide?

Respuesta

3

El patrón Cake no resuelve este problema en su forma original. Tiene several choices cómo lidiar con eso. La solución que prefiero es crear cada "pata de robot" llamando a su constructor con el parámetro apropiado - code muestra eso mejor que las palabras.

Creo que la respuesta antes citada es más fácil de leer, pero si ya está familiarizado con Jonas ejemplo, esta es la forma en que serías temperatura muy configurable con una orientación:

// ======================= 
// 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 
Cuestiones relacionadas