argius note

プログラミング関連

メインで使えなくてもScalaは活用できる

リリース物件にJavaしか使えないプロジェクトでも、開発環境としてScalaを使うことで、Javaだけ使うよりも開発効率を上げることができると思います。


開発環境でもScala使っちゃダメとかいうプロジェクトの場合は、あきらめるか、「僕が作ったんです!」とか言って押し切ってみるのはどうでしょう?(責任は持てません)



念のため、手元の環境は以下の通りです。※開発環境とは別です。

別のプロジェクトを作って参照

Eclipse上で、メインプロジェクトが"TheApp"という名前のJavaプロジェクトだとしたら、"TheApp+"という名前のScalaプロジェクトを作り、"TheApp+"ビルドパスのプロジェクト参照に"TheApp"を追加します。
"TheApp+"にScalaTestなりSpecs2なりを使って、好きなだけテストを書きます。Javaにも便利なテストツールはありますが、Scalaと比べるとJava自体の表現力が足枷になってしまいます。


他にも、Scalaで書くと簡単だけどJavaで書くのが面倒で自動生成が困難なクラスを、Scalaでミラー実装?したものと出力が常に同じになっていることをテストする、というやり方もあります。


ちなみに、Specs2のテストをまとめて実行する場合は、Javaの場合と同じように、新規作成→JUnitテストスイートでAllTestsを作って実行できます。むしろ、他の方法が分かりませんでした。

  • AllTestsのイメージ
import org.junit.runner.*;
import org.junit.runners.*;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)
@SuiteClasses({SomethingSpec.class, UtilSpec.class})
public class AllTests {}

テスト側には、

import org.specs2.runner.JUnitRunner
import org.junit.runner.RunWith
@RunWith(classOf[JUnitRunner])
class SomethingSpec extends Specification {

を付けます。


追記(2012-12-13): AllTestsをScalaで書いても良いですね。手書きになってしまいますけれど。

import org.junit.runner.RunWith
import org.junit.runners.Suite
import org.junit.runners.Suite.SuiteClasses

@RunWith(classOf[Suite])
@SuiteClasses(Array(classOf[SomethingSpec], classOf[UtilSpec]))
class AllTests

テスト以外にも使う

ScalaはDSLが書きやすかったり、パーサー機能が標準搭載されていたりと、テスト以外のツールとしても活用できると思います。
たとえば、自動生成ツールとか、コーディングルール独自チェックとかが比較的簡単に書けます。
Scalaだけで書くのが難しかったら、Javaと混合でもOKです。


他のスクリプト言語とかでも良いんじゃない?

実際、今の開発環境はスクリプト言語Perlしか使えないので、解析や整形や自動生成などはJava(+Velocity他)とPerlなどを駆使してやっています。
なので、スクリプト言語を活用するのは、Javaだけ使うより良いです。
Scalaはこういった環境よりも、Javaとの親和性が高いので、もっと使いやすく、もっと効率アップが期待できる、と思っています。


弊害

Scalaを使えば使うほど、Javaで書くことが嫌になってしまうかもしれません。

*1:そろそろ4.2にしたいです。