読者です 読者をやめる 読者になる 読者になる

ux00ff

ビールとプログラミングと

トレイトと自分型を利用してPAppletを分割する

Scala Processing

引き続きProcessingです。自分型を設定したトレイトを利用すると、トレイトを実装する側のクラスを縛ることができます。Scalaスケーラブルプログラミングに「大きなクラスをトレイトを利用して分割するときにめっちゃ便利だよ」と書いていたが確かに便利ですね。

rubyの「おっと Enumerable をミックスインしたんだけど each メソッドがないよ?」みたいなことを、こちらはコンパイラが弾いてくれるのだな的理解で先へ進みます。

以下のようなデバッグ情報を表示するトレイトを作ったとして、

trait DebugView {
  self: PApplet =>

  def showDebugView(): Unit = {
    fill(255)
    textSize(13)
    textAlign(LEFT, TOP)
    text(s"(x, y) : ($mouseX, $mouseY)", 0, 0)
    text(s"${millis} ms", 0, 15)
    text(s"${frameRate} fps", 0, 30)
    text(s"${frameCount} frame count", 0, 45)
    text(s"mouse => ($mouseButton) key => ($keyCode)", 0, 60)
  }
}

利用側はこんな感じにします。

class Applet extends PApplet with DebugView {
  override def settings(): Unit = size(320, 240, JAVA2D)

  override def draw(): Unit ={
    background(0, 0, 100)
    showDebugView()
  }
}

f:id:ux00ff:20170221235542p:plain

トレイト側で self: PApplet => しているため、この DebugViewPApplet かまたはそのサブ型からしか利用できず、その制約の中で showDebugView のメソッド内では PApplet のメソッドを呼び出すことができます。