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

技術開発日記

技術やら日々思ったことを綴ってます。

Scalaを選ぶ理由

Scala スケーラブルプログラミングの1章を簡単にまとめ

互換性(Javaとの共存

  例1)Scalaの文字リテラル"abc"の型はjava.lang.Stringである
  例2)投げらる例外はjava.lang.Throwableでないといけない

  • Scalaは再利用だけでなく「ドレスアップ」してもっといいもにしている

  例1)JavaのStringクラスはStringをintに変換するときはInteger.parseInt(str)でないといけなけど、ScalaならtoIntメソッドを提供しているのでstr.toIntで実現できる
     (中ではScalaコンパイラはStringにはtoIntメソッドがないことに気づいて暗黙の型変換を参照する。それによってJavaのStringをScalaのStringOpsに変換することを知って、そこでtoIntを見つける)

簡潔性(Javaの半分のコード量)

  • 少なければ読んで理解する労力、バグの確率も下がる
  • セミコロンを書かなくていい
  • コンストラクタの違い ※1
  • 型情報を反復する必要がない型推論
  • ライブラリが豊富なので、その分の量が減る
  • ライブラリークラスの様々な側面はトレイトとして、切り分けるし、トレイト柔軟にミックスできる

※1
Java

class MyClass {
    private int index;
    private String name;
    public MyClass(int index, String name) {
        this.index = index;
        this.name = name;
    }    
}

Scala

class MyClass(var index; Int, var name: String) {}

高水準(抽象度の高いコード、あたらし制御構造を定義できる表現力)

  • Stringに大文字が含まれているか ※2
  • Javaはループで一文字ずつ処理する低水準の存在として文字列をあつかっている
  • Scalaは述語関数でテストできるように高い水準の存在として同じ文字列を扱える

※2
Java

boolean nameHasUpperClass = false;
for (int i = 0; i < name.length(); ++i) {
    if (Character.isUpperCase(name.charAt(i))) {
        nameHasUpperCase = true;
        break;
    }
}

Scala

val nameHasUpperCase = name.exists(_.isUpper)

静的な型付け

  • 静的な型付けに対して一般的に認識されている問題に対して対策している。
  • 冗長性の問題は型推論で取り除かれている
  • 柔軟性のなさの問題はパターンマッチングと型を記述したり、合成したりする新しい方法によって回避
  • 時に重要なメリットはプログラムの抽象化を保証、安全なリファクタリング