電子書籍が少しずつだけれども着実に浸透している。
GoogleBooksなどスマホでも簡単に買える仕組みもできてきて、リーダーを買わなくても誰でも手軽に買えるようになってきた。
まだまだラインナップは貧弱だけれど近い未来書店で売られている以上の書籍を家に居ながらにして瞬時に買える時代が来るだろう。
僕は業務でJavaを使っているし、趣味でもAndroidアプリを作ることでJavaを活用している。
オブジェクト指向には(理解をしているとは言えないかもしれないが)慣れ親しんでいる。
でも、手続き型言語を使っていた身としては関数型言語というのは本当に未知の領域だ。
Scala スケーラブルプログラミングという分厚い本も買ってきて本格的にScalaを今勉強している。
まだ冒頭のところで、まだほんのさわりだけしかやっていないけれども
それだけでも新鮮な気持ちになれる。
とりあえずわかったScalaの仕様は
メソッドは同じ引数を渡したらいつも同じ値が返ってくるようにする。
変数は一度代入したら変えられないようになっている(val で宣言したら変えられないが、varで宣言したら変えられる)
メソッドが変数のように引数として渡せるし、戻り値として返せる。
これらはつまり疎結合を実現する仕組みなんだな。
同じ引数を渡しても帰ってくる値がいつも違うとは限らない設計は沢山ある。
hogeクラスではexecuteメソッドを実行すると前回の結果を元に計算されて、再度計算すると更に計算される。
getNumber()メソッドでは計算結果によって違う値が来る。
きっとそういうのが副作用があるということなんだ。
疎結合であれば影響度の予測も立てやすいし、機能追加やバグフィックスもやりやすい。
Javaでも実現可能だけれどもScalaはそれがやりやすくなっているみたい。
はじめて一週間の新参者が言うので、間違っているかもしれないけれど、
関数型言語っていうのはアルゴリズムはアルゴリズムで定義して、データはデータで定義して
それぞれ別のものとして操作をしている感じだとおもう。
例えばAさんとBさんの一ヶ月の賃金を計算する流れというのはこんな感じか?
リスト1はAさんの労働時間一覧が入る
リスト2はBさんの労働時間一覧が入る
関数1は残業時間ならば賃金を1.25倍にする。
関数2は深夜時間ならば賃金を1.5倍にする。
関数3は通常時間ならば賃金を1倍にする。
整数1はリスト1から関数1と関数2と関数3で得た結果が入る
整数2はリスト2から関数1と関数2と関数3で得た結果が入る
という風に考えるのかな。
もうすこし勉強して、関数型設計のあり方というものが見えてくればもっと楽しくなるだろう。
今のところまだ全然全体像がみえていないけれど、
メソッドの中にメソッドを定義できるので冗長にならないし、Javaよりほんの少ない労力で同等の機能が実装できるので
本当に楽しい。
ScalaはコンパイルするとJavaのクラスファイルになるのでJVMにしてみたらJavaと同じ。
ということはAndroidでも使えるだろう。そして実際に試していたサイトもあった。
今度ためしてみたいな。ただし僕の予想なのだけれどScalaはスコープの短いインスタンスが沢山作られるので
AndroidのGCではちゃんと回収されるまえにメモリがパンパンになってしまう可能性も…
でも最新のOSはちゃんとなっているかもしれない。