今からでも遅くないということで、私もScalaを始めました。去年ぐらいにも耳に入っていたのですが、なんか小難しい言語だなーと思っていました。まぁ、でも食わず嫌いはよくないということで、まずやってみようと本を何冊かを買い込んで勉強してます。やっていると楽しくなってきたみたいです。
で、ScalaでDXOすると、どんな感じかなーってことで、極簡単なサンプル書いてみました。
なんか、Aaa,Bbbのsetter, getterが流儀に反してますよね?xxx, yyyのScala流のgetterとsetterがxxx():String, xxx_=(v:String):Unitが存在するのすが、dxoメソッドにどうやって渡せばよいか、ちょっと分かってません。まだまだ、Scalaの筋肉が足りませんw 先輩方教えてくださいm(_ _)m
class Aaa(var xxx:String, var yyy:String) { def getXxx():String = xxx def setXxx(value:String): Unit = xxx = value def getYyy():String = yyy def setYyy(value:String): Unit = yyy = value } class Bbb(var xxx:String, var yyy:String) { def getXxx() : String = xxx def setXxx(value:String) = xxx = value def getYyy() : String = yyy def setYyy(value:String) = yyy = value } object Main { // Tは型パラメータ def dxo[T](setter:T => Unit, getter:() => T) = setter(getter()) def main(args:Array[String])={ val aaa = new Aaa("aaa","bbb"); val bbb = new Bbb("xxx","yyy"); dxo[String](aaa.setXxx, bbb.getXxx) dxo[String](aaa.setYyy, bbb.getYyy) println(aaa.getXxx) // xxx println(aaa.getYyy) // xxx } }
追記:こんな感じにしたらいけたっぽい
class Aaa(private var x:String, private var y:String) { def xxx():String = x def xxx_=(value:String): Unit = x = value def yyy():String = y def yyy_=(value:String): Unit = y = value } class Bbb(private var x:String, private var y:String) { def xxx() : String = x def xxx_=(value:String) = x = value def yyy() : String = y def yyy_=(value:String) = y = value } object Main { def dxo[T](setter:T => Unit, getter:() => T) = setter(getter()) def main(args:Array[String])={ val aaa = new Aaa("aaa","bbb"); val bbb = new Bbb("xxx","yyy"); dxo[String](aaa.xxx_=, bbb.xxx) dxo[String](aaa.yyy_=, bbb.yyy) println(aaa.xxx) // xxx println(aaa.yyy) // yyy } }
追記:Scalaな皆さんがやさしいので、以下のように書けることを教えてもらいました。DRYな感じで短くなりましたねー。すばらしい。
class Aaa(var xxx:String, var yyy:String) class Bbb(var xxx:String, var yyy:String) object Main { def dxo[T](setter:T => Unit, getter:() => T) = setter(getter()) def main(args:Array[String])={ val aaa = new Aaa("aaa","bbb"); val bbb = new Bbb("xxx","yyy"); dxo(aaa.xxx_= _, bbb.xxx _) dxo(aaa.yyy_= _, bbb.yyy _) println(aaa.xxx) // xxx println(aaa.yyy) // yyy } }