8

Mój rozwój w dużym stopniu wykorzystuje problem z obwiązaniem nogi robota. Znam how to solve it z PrivateModule w Guice, ale nie jest jasne, jak by to zrobiono z wzorcem tortu Scali.W jaki sposób mogę wykorzystać wzór tortu Scala do wykonania nóg robota?

Czy ktoś mógłby wyjaśnić, jak to się stało, najlepiej z konkretnym przykładem opartym na przykładzie kawy Jonasa Bonera pod koniec jego blog post? Może z podgrzewaczem, który można skonfigurować dla lewej i prawej strony, wstrzyknięty z orientacją i def isRightSide?

Odpowiedz

3

Wzór tortu nie rozwiązuje tego problemu w jego oryginalnej formie. Masz several choices, jak sobie z tym poradzić. Rozwiązaniem, które preferuję, jest stworzenie każdej "nogi robota" poprzez wywołanie jej konstruktora odpowiednim parametrem - code pokazuje to lepiej niż słowa.

Myślę, że odpowiedź cytowany powyżej jest bardziej czytelny, ale jeśli są już zaznajomieni z przykładu Jonasa, oto jak chcesz zrobić cieplej konfigurowalny o orientacji:

// ======================= 
// 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 
Powiązane problemy