8

Il mio sviluppo fa ampio uso del problema di legatura delle gambe del robot. Conosco how to solve it con PrivateModule in Guice, ma non è chiaro come ciò avverrebbe con il modello di torta di Scala.Come posso usare il modello di torta di Scala per implementare le gambe del robot?

Qualcuno potrebbe spiegare come sarebbe stato fatto, idealmente con un esempio concreto basato sull'esempio di caffè di Jonas Boner alla fine del suo blog post? Forse con uno scaldino che potrebbe essere configurato per i lati sinistro e destro, iniettato con un orientamento e uno def isRightSide?

risposta

3

Il motivo a torta non risolve questo problema nella sua forma originale. Hai several choices come gestirlo. La soluzione che preferisco è quella di creare ogni "gamba robotica" chiamando il suo costruttore con il parametro appropriato - code mostra che meglio delle parole.

Penso che la risposta sopra citata è più leggibile, ma se si ha già familiarità con l'esempio di Jonas', ecco come saresti un aumento della temperatura configurabile con un orientamento:

// ======================= 
// 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 
Problemi correlati