Scala, JavaScript, Java の違い

ScalaJavaScript はありとあらゆる事が対極なので、面白いです。

Scalaたくさん型(クラス)を作ることが推奨されている言語です。型は1行で簡単に作れるし、型のパターンマッチングの機能をはじめとして、型に関する機能が充実しています。ちょっとでも何か違う時は型を作り、複雑な問題は型を変えることで、より小さな簡単な問題に分割していきます。他の言語では、メンバ変数に対する if 文で書くような箇所も、型のパターンマッチングを使うと吉です。

それに対して、JavaScript はあまり型を作らずに、どんどん相乗りして行く方が、僕の経験から言うとベターです。{} で簡単にオブジェクトを作れてしまいますし、僕は結構、{type:"Hoge"} という感じで type というメンバ変数を使って、型に相当する物を識別しています。コーディングしている最中に型の問題を先送りにすることにより、コーディングしながら考えるという技が使えます。オブジェクトに自由にメンバ変数の追加ができるので、「とりあえず、ここにデータを置いておく」という書き方ができます。「とりあえず」というのが得意です。

Java のクラスは、データとメンバ変数を束ねて、スコープを作り出しているだけに近いです。Scala とは異なり、型の持つメッセージ性が弱いです。処理の責任範囲を作ることに主眼があると思います。クラス内に限り密結合が許されていて、クラスの外とは、可能な限り祖結合することが推奨されています。

僕の経験では、Javaの場合、平均200行につき1クラスくらいがベストバランスだと思います。クラスが小さすぎるのも作り出すスコープが小さすぎて、見通しが悪くなりますし、大きすぎると複雑になりすぎます。

それに対して、Scala は、まだベストバランスを主張できるほど経験を積んでいませんが、現状では、平均20行につき1クラス作っています。Java の10倍です。明らかに型に対する考えが他の言語と違うことがわかります。

おそらく、この傾向は静的型付け関数型言語全般の性質ではないかと想像しています。Haskell も型をたくさん作った方がいいのかな?MaybeモナドやListモナドを使うと、同時に複数の型を遅延評価を併用して、一カ所に相乗りさせることができます。The List monadにそのテクニックが紹介(翻訳)されています。