scalaのDSLの片鱗に触れる。(第9章から第14章)

Scalaスケーラブルプログラミング第2版

Scalaスケーラブルプログラミング第2版

Javaで手が届かないかゆいところに手が届く感はやっぱり素晴らしい。

例えば、第13章では公開と非公開の話。protectedとメンバーにつけた場合、Javaだとパッケージ内から見れば丸見えになる。でも、Scalaはデフォルトが継承しないと公開されない。「デフォルトでは」なので、protected[ABC]とABCにパッケージ名を記入すればJavaのようにパッケージ内から丸見えにできる。

読み始めて二週間、上の例もそうだけど、色んな書き方ができる素晴らしさをひしひしと感じる。
Scalaってこんな書き方ができるのね、と感心することが多い。

今回感心したのはScalaのDSLの部分。
第14章でアサーション単体テストの説明があるんですが、振る舞い駆動開発の例を紹介します。
JavaでもJUnitとかありますが、Scalaも沢山単体テストの方法があります。
その内の一つがScalatestです。
Scalatestは以下のように書きます。

import org.scalatest.FlatSpec
import org.scalatest.matchers.ShouldMatchers
class StringShouldSuite extends FlatSpec with ShouldMatchers {
  "ABC" should "have an A " in {
    "ABC" contains "A" should be (true)
  }
  "ABC" should "not have a X " in {
    "ABC" contains "X" should be (false)
  }
}
(new StringShouldSuite).execute()

なんというか、普通の英文法で書いているみたいな自然さ。
Scalaのコンパイラはかなりアグレッシブなことがわかります。

"ABC" contains "A" should be (true)

shouldやcontainsはScalaの文法のように見えますが、単なる関数です。
ScalaではJavaのように obj.method(arg) とも書けますが、
obj method argとも書けます。

逆に言うと、 1 + 1 のような普通の構文も実は Int型クラスの "+"という関数を呼んでいるだけです。
この辺りに言語実装者の拘りというか、アグレッシブさが見えます。

次回以降も面白そうです。