Scalaの拡張性(2)

 一昨日まで実家に帰省&旅行でなかなか書けませんでしたが今日からできる限り毎日か隔日かで書いていこうと思ってます。どうせ、3日坊主でしょうけどねw

 今日はScalaの特徴である完全なオブジェクト指向関数型言語について分かったことを書いていこうと思います。

オブジェクト指向
 オブジェクト指向というのは、"オブジェクト"が互いの情報をやり取りしてプログラムを構成する方法です。つまり、役割分担をした"クラス"(オブジェクトの設計図みたいなもの)を作ることによってプログラムを書けるということです。
しかし、JAVAなどの多くの言語では、基本型としてのintfloatなどのようにオブジェクトではない値を含んでいますが、ScalaではIntFloatのように全てがオブジェクトとして扱われます。

 オブジェクト指向には継承という概念があります。例えば、バスと人は「走れ!」と命令すると、バスはエンジンをかけてアクセルを踏むという動作をとりますが、人は大きく手を振り足を交互に出すという動作になります。つまり、同じ「走れ」でも違う動作になるわけです。一方で、バスとタクシーは「走れ!」と命令すると、ともに、エンジンをかけてアクセルを踏むという動作をとります。つまり、共通点があるわけです。その共通点をまとめた"車"というクラスを作り、その特徴を継承させて"バス"や"タクシー"というものを作ると記述量が減って楽なのです。

 しかし、この継承の中にはダイヤモンド継承という問題があります。ダイヤモンド継承とは、例えば、"乗り物"というクラスを継承させて"車"と"船"というものを作ったとします。さらに、車と船を継承させて"水陸両用車"を作るとします。ここで、"水陸両用車"は"車"と"船"を経由して、"乗り物"というクラスを2回継承してしまっています。すると、乗り物の中にある機能が名前のぶつかりあいを起こしてうまく動作しなくなってしまいます。これを、JAVAでは多重継承(1つのクラスが複数のクラスを継承すること)を禁止して解決しています。例で言うところの、"水陸両用車"が"船"と"車"を継承することを禁止しているということです。Scalaの場合には、これをトレイト(trait)という方法で解決しています。このトレイトについてはまだ、理解し切れていないので、またちゃんと勉強して書こうと思います。


関数型言語
 関数型言語とはラムダ計算というものに基づいて設計されています。ラムダ計算については、他稿にまた書こうと思います。関数型言語において関数は、整数や浮動小数と同等の地位にあります。つまり、関数型の特徴は関数を引数として渡せることがあります。さらに、あらゆる関数は「副作用」を持たないのが望ましく、例えば、変数の中に文字列"Scala"が入っていて、その'S'を'T'を入れ替える関数を作用させるとき"Tcala"という文字列が元の変数とは異なるオブジェクトとして生成されます。一方で、JAVAなどの手続き型言語などでは、"Scala"が入っていたオブジェクトが"Tcala"に書き換わります。つまり、戻り値を返すだけではなく、何かの変数を書き換えるということが禁じられているということです。Scalaでは、双方が選べるようになっているようです。また、それについても勉強して書こうと思っています。


Scalaスケーラブルプログラミング[コンセプト&コーディング] (Programming i.../Martin Odersky

¥4,830
Amazon.co.jp