最近勉強したこと
HTMLスクレイピング in Scalaを通じてたくさんの得るモノがありました。
まず、id:yuroyoro さんのこの記事を読んで世界が変わりました。
"Scala的な考え方 - Scalaがとっつきにくいと思っている人へ" -ゆろよろ日記
http://d.hatena.ne.jp/yuroyoro/20100317/1268819400
リストについての考え方
処理を下記のようなレイヤに分割して
リスト→要素抽出→加工→操作
ループで書かずにリストに対して直接ロジックを埋め込んで行く。
関数型言語由来の考え方だと思いますが、今まではリストがきたら拡張forでループを回すことしか考えてなかったので目から鱗でした。
具体的には filter, map, takeWhile, dropWhile のようなメソッドを使って実装していきます。
その勉強の際、こちらのブログも参考にさせていただきました。簡潔なサンプルコードと説明でまとめられています。
"LL脳がscalaの勉強を始めたよ その54" -Reinvention of the Wheel
http://d.hatena.ne.jp/plasticscafe/20100825/1282708795
副作用を抑えるという考え方
冒頭で紹介した yuroyoroさんの記事の引用
Scalaでは、"val"で宣言した変数は再代入できません。これだけを聞くと使い勝手がわるそうだ、と思われるかもしれません。
実際にそう思ってました。
迷ったらとりあえずvarにしといたり、valは定数の宣言が主な要素なのかなー程度の理解で。
が、変数を利用する時に"変更されていない"ことが保証されているというのは、とてつもない安心感があります。(特にマルチスレッドを利用したり、ある程度大きなアプリケーションでは)
あるクラスのインスタンス変数が"var"(変更可能)な場合、その"var"を利用する処理は、状態に依存してしまうことになります。
状態に依存しないことで得られる安心。その視点はなかった。
imutableなクラスがお手軽に使えるcaseクラスも大変便利なので積極的に使っていきたいです。
パターンマッチで使えるようになるのも便利ですね。
Option型
例えば結果型にStringを指定している関数があった場合、その関数は実際にはStringを返す場合と返さない場合の2通りがあるにも関わらずStringを返す場合しか想定されてない。(実際には関数の内部でnullチェックがなされているかもしれないが少なくとも利用者側にはそのことが直接は伝わらない。)
そのため、その関数の利用者はnullチェックという煩わしい作業を強いられることがあります。
そんなときにOption型を使えば大変便利です。
近況
JavaからScalaに来ましたがScala楽しいです。新しい発見ばかり。
最初はJavaのライブラリを使って、Java風の手続き型言語的なコーディングで違和感なく始めることが出来ました。
少ししたらJavaライブラリをよりリッチに拡張されたScalaライブラリの機能を使ってJavaより簡潔にコードを書くことに楽しみを覚えました。
そして今回関数型言語の側面を垣間見ることが出来て、また世界が広がりました。
Javaにはない新しい概念がたくさんあります。ですが、上記のようにScalaは段階的に学習が可能です。
これはJava使いな人にとってはプラスなことだと思います。
また、ブログにアップしたコードについて色んな方から指摘をもらいました。こういう経験は実は初めてで嬉しかったです。
これからもどんどんアウトプットして、指摘をもらいながら勉強していきたいです。