水曜日, 12月 23, 2015

Scala - Mixin, traitそしてselfによる型間依存関係の表現

Scalaのmixinとtraitそしてselfアノテーションを利用することにより,Javaと比較してより明快に型間の依存関係を宣言出来る.Javaではミックスインが出来ない為,クラス間の依存関係はあるクラスのprivate or protectedフィールドとして表現されていることがご想像いただけるかと思う.

case class Neko(name:String,pattern:String, age:Int)

trait CatManage {
  self: CatManage with DefNekoCheck =>
  var nekoz:List[Neko]
  def init():Unit
  def lookupCat(name:String):Neko
}

trait DefNekoCheck {
  def ? (neko:Neko) = neko != null
}

trait NekoCheck extends DefNekoCheck {
  override def ? (neko:Neko) = neko.name == "NA"
}

trait NekozManage extends CatManage with NekoCheck {

  override var nekoz = List[Neko]()

  override def init():Unit = {
    nekoz ::= Neko("Mikeyo", "Mike", 3)
    nekoz ::= Neko("Tora", "Chatora", 8)
    nekoz ::= Neko("Powder", "Mike", 8)
    nekoz ::= Neko("Machiko", "Mike", 10)
  }

  override def lookupCat(name:String):Neko = {
    val n = nekoz find(_.name == name)
    n.getOrElse(Neko("NA", "NA", -1))
  }
}

trait Act {
  def start(f: => List[String])
}

trait App {
  self: Act with CatManage =>
  override def start(execPlan: => List[String]) = {
    init
    val l = execPlan
    l.foreach{ name =>
      lookupCat(name) match {
        case x if x.name == "NA" => println(s"${name} not found..")
        case x => println(x)
      }
    }
  }
}

0 件のコメント: