なおすけの落書き帳

毎日がエブリデイ。

Scalaですから

こんばんは。なおすけです。 台風が沖縄に大集合らしいですね。
12日から14日までは東京出張なので、台風が来ないことを祈るばかりです。

冷やしScala始めました。

研究はJavaを使ったアプリケーションを扱っています。
正確には、Javaを使ったアプリケーション"も"扱っているという感じですが。
2005年にプロトタイプが作られて、そこから10年間、諸先輩方が開発を継続していった秘伝のアプリケーションです。
さすがに一回綺麗にリファクタリングをした方がいいかと思いました。
あと、最近プログラム書くことから離れてたので、リハビリもしないとなという感じだったので…

というわけで、ちょっと気になってたScalaを使って書きなおして見ようと思いました。
作るべきものが明確なので、途中で投げ出しそうにないしいいですね。

で、Scalaってなんぞ

Scalaとは、JVM上で動作するマルチパラダイムの言語です。
オブジェクト指向の特徴と、関数型の特徴を統合しているらしい。
現在のバージョンは2.11.6だそうで。

特徴としては、

  • 開発生産性を高める簡潔な表記
  • Javaのライブラリをインポートして使用可能
  • 静的型付を行う関数型言語のため、型関連のエラー検出が容易
  • 型推論があるため、自動的に型を補完してくれる
  • XMLを直接プログラム内部に記述可能

(´・∀・`)ヘー

実務としては、Twitterがバックエンドを2009年にRubyからScalaに移行したり、 FoursquareScalaとLiftフレームワークを利用してたり、LinkedInも使ってたり、それなりに利用されてるらしいです。

そもそもなんでJavaからScalaにしようと思ったの

  • Scalaが気になってた
  • Javaに比べて読みやすいし書きやすい
  • そもそもJavaを書きたくない
  • XMLをゴニョゴニョできる

この4つが適当な割合をもって並んでいます。

Scalaを少し使った感想

Javaっぽい書き方しかまだ出来てないですが、Javaに比べてやっぱり書きやすいし読みやすいです。
例えば、配列の走査について、Javaだと

int[] array = new int[] { 1, 2, 3, 4, 5 }

// 添字を利用したループ
for ( int i = 0; i < array.length; i++ ) {
  System.out.println(a[i]);
}

// 要素を直接取り出すループ
for ( int e : a ) {
  System.out.println(a[i]);
}

みたいなのが、Scalaだと

var array = Array(1, 2, 3)

// 添字を利用したループ(Scalaは非推奨)
for ( i <- 0 until a.length ) {
  println(array(i))
}

// 要素を直接取り出すループ
for ( e <- array ) {
  println(e)
}

// 要素を直接取り出すループ(こっちでも可)
array.foreach(println)

みたいな感じ。割と個人的には読みやすかったです。

今後の展望

Javaっぽい書き方で、とりあえず既存のシステムを書き直そうと思ってます。
その後、再度リファクタリングもかねて関数型っぽく書いてみようかなと思います。
その前に関数型の勉強でHaskelやりそうだなあとふと思いました。

その他

こないだ誕生日でしたので例のアレお願いします。