2010年2月22日月曜日

Scala Hackathon #2に参加した

2/20に開催された@yuroyoroさん主催のscala hackathon #2に参加した。
場所はOracle青山センター、とても綺麗な施設で、かっこよかった。

で、今回自分が何をしていたかというと、
・既存blogのatomからbloggerにインポートするappengineアプリをscala化する
ってのをテーマにやろうと思ってたんだけど、思った以上に基礎ができていない
ことが判明したので
・swingアプリをかっこよくscalaで短く書く
にした。

Javaでの繰り返し、swingのイベントハンドラ処理ってのは冗長な記述が多い
⇒scalaってLLだべ?
⇒かっこよくJavaScriptとかそういうのみたいにワンライナーで書く
⇒モテる

そういう動機。

ただ、swing周り、scalaでは全てのswingコンポーネントが
ラップされているわけでは無いようなので、自分で書くべきところが
多そうだなー、という印象。イベントハンドラは取り合えず後回しにして
繰り返しをかっこよく書くことに専念した。

たとえば、テーマのクラス、Javaで書くとこんな感じ。
getDefaultsをオーバーライドして、テーマのデフォルト値を上書きする。

public class MyTheme extends NimbusLookAndFeel {
  @Override
  public UIDefaults getDefaults() {
    UIDefaults table = super.getDefaults();
    for(Entry<Object,Object> entry:table.entrySet()) {
      if(entry.getValue() instanceof Font) {
        table.put(entry.getKey(), new Font("MS UI Gothic",Font.PLAIN,12));
      }
    }
    return table;
  }
} 

冗長なのは、forとinstanceofでのエントリのフィルタリング。 これをscalaでもっと短くしていきたい。

class MyTheme(font:Font) extends NimbusLookAndFeel {
  override def getDefaults : UIDefaults = {
    val defaults=super.getDefaults
    defaults++=(for((k,v) <- defaults if v.isInstanceOf[Font] ) yield (k,font))
    defaults 
  }
}


主要な部分は短くなったけど、valへの代入と値を返す部分が残る。
Scala特有の書き方はscalaの型で無いとダメなところが一番の理由かな。
implicit conversionを勉強すると省略する方法が分かるのかもしれない。
あとはコレクションの扱いが色々あって、書き方が一通りでは無いから
もう少しかっこいいのが書けそうな気がする。

ハマッたこと。
1.mapのエントリについて
UIDefaultsはHashtableインターフェースを実装しているので、エントリは
Entryであらわせるんだけども、これがscalaだとどのように帰ってくるか
最初分からなかった。コンパイルエラーでは (k,v) のような表現の型なのは
分かるんだけど、検索キーワードになるような言葉を付けてくれよとは思った。
調べた結果、Tupleと言うみたい。
アクセスするには、entry._1とかentry._2とか書くとらしいんだけど、
@yuroyoroさんのアドバイスで{case (k,v) => } というようなPartial Functionを
書くと_1とか_2とか書かなくてもいいよ!と聞いて、
ん、もしかしたら、forでも(k,v)?と書いてみたら受けることができた。

※そもそもPartial Functionってなんぞやと思って調べたところ、
「引数と戻り値に対して仮型引数を定義する関数の型」っぽい。
caseの一つ一つをPartial Functionとして定義できるってことが分かった。

2.条件分岐、型のマッチ
上記ではif文の中のisInstanceOfでフォントかどうか評価しているんだけど、
isInstanceOfってかっこ悪くね?⇒caseクラスいいんじゃね?⇒
でも結局この(k,v)ってペアのvの評価を一発で出来ないとかっこ悪くね?
どう書くんだろ?

ここまででHackathonが終わってしまった。

10:00~19:00までやってこれだけかよ!

とりあえず、今回書いたコードでscalaのかっこいいところ
1.forの中にfilterを書ける。
2.forの処理結果をコレクションで戻せる。

@yuroyoroさん、ほんと、初心者の質問してしまって申し訳なかったです。
さすがにそろそろコップ本を買って勉強します。

※コードと格闘しててLTはほぼスルー気味でした。ごめんなさい。

0 件のコメント:

コメントを投稿