Scala入門してきました(20160605)
先月、Scalaの魅力をLTで話していた方がいらしたということもあり、ハンズオンに参加してきました(^^)
Javaは触れたことのない言語だったこともあり少し難しかったですが、丁寧に教えて頂けたので楽しめました!忘れてしまいそうなのでこのハンズオンで学んだことをまとめておきたいと思います。
1. Scalaについて
・ドワンゴオリジナルの研修用テキストが分かりやすくて良いらしい。ググると出て来るらしい。↓↓
・異なるOS間でも、一つの構造で動かすことができる。
バーチャルマシンで動かせば中間層を動かす人がOS依存のものを用意すれば良いという発想?(JVM上で動かすことができる?)と言っていた気がするものの、合っているか微妙。
scalaの最大の特徴は、
『オブジェクト指向プログラミングと関数型プログラミングの統合であること』
だそうです。私はこの業界に入って1年ですが、オブジェクト指向は散々言われてきたから知っている!となるものの関数型は初めて聞いたなーと思いつつハンズオンスタート。
以下、学んだことだったりポイントを書き出していきます。
2. ハンズオンで学んだこと
2.1 フォルダ構成について
・プロジェクトの直下にsrcフォルダを置く。(今回の方法だと自動生成されていました。)※今回のハンズオンではactivator uiを用いてプロジェクトを作成しIntelliJで開いています。
・testの方にテストコードを書く。
・mainやtestの下に各言語のフォルダを置いて、そのフォルダ下にファイルを作成してそこにソースを書く。
↓こんなかんじ
各言語ごとにフォルダを分けるというのは初めてだったので意外でした。
2.2 activatorの使い方
・ターミナルでプロジェクトのフォルダに移動し、activatorと入力するとactivatorが起動する。(起動したままプログラムを書いていくのが書いていくのが基本とのこと。)
・activatorでcompileと入力するとコンパイルできる。また、runと入力すると実行できる。(runすると、差分がある場合はコンパイルされ、その後実行されました。)
・activatorは新規のプロジェクトの雛形を作ったり、ui上でソースを書くことができる等、IDEの機能を持つ。
・activatorはSBTのラッパーらしい。
・consoleと入力すると、対話環境が開く。
・import app.models._で一括インポートできる(ワイルドカード)。
・import app.models.{Issue, Bug}で指定することもできる。
・new Issue(10, "test issue", TicketStatus.Open)のようにするとインスタンスを作成できる。
・:qで対話環境を抜けることができる。
2.3 その他のポイント
・パッケージというモジュール単位でフォルダを作っていく。
・case は自動でクラスが生成されるようになる?コンストラクタみたいな扱いになるっぽい?。(違うかも)
・case class でcase class を継承することは不可。(自動生成されるメソッドである同値判定が機能しなくなることが理由らしい。)一方で、case class ではないclass で継承されることは可能。
・引数名を指定して引数を渡すことが可能。
・valは値だから再代入できない。varは変数のため再代入できる。
・型に別名をつけることができる。
・typeを使って別名をつけるのは、そのままだとpackageの全体に書くことはできない。
→package object を用いる。でもpackage objectは一つのパッケージにつき一つしか作れないとのこと。
・関数は、
のように書く。
defとつけてメソッドを定義し、:の後に戻り値(ここではIssue)の型を書く。()内は引数で、引数の型を省略することは不可(ここではString型)。
・関数内の戻り値に、return と書かなくて良いみたい。
※公式のDocumentも合わせて読みたい。↓↓
Collections - 可変コレクションおよび不変コレクション - Scala Documentation
・testは便利らしく、『activator ~testとするとテストも含めたソースをコンパイル→実行できる』とのこと。対話環境だけでは毎回ソースを直してコンパイルして、、、としなくてはいけないところを1度のコンパイルで何度も試すことができるため、楽なようです。(testのソースを自分の書きやすい言語で書けるのであればかなり気楽に使える気がします。が、どうなんでしょうか)
・Scalaスケーラブルプログラミング第2版(通称: コップ本)ってのが概念を知る?勉強する?のに良いらしい。
3. まとめ!
個人的な感想としては、C++の概念に近い印象でした。表記が違うだけで概念は似ているかな、と思いました。周りにC++な人居なくて誰にも理解されなかったですが!笑
どんな場合にScalaを使うと良いのですか?という趣旨の質問への回答でもありましたが、長期的に変更を加えたい時などには確かに良さそうだなと感じました。懇親会の時にお話しした方がScalaのライブラリはJavaよりも更新速度が速いと仰っていたので、普通にJavaで開発を行うよりも、汎用性が高いのかなと思いました。実際業務で使わないとその辺のことはわからなさそうですし、Javaを知らないので比較も全くできませんが。
こんな感じでした。Scalaは個人的には学習コストは少し高めな一方で、大きいプロジェクトとかに合いそうだなと感じました。趣味というより仕事向きという感覚です。『Scala得意です』みたいになったら凄くかっこいいなーとか憧れました。
入門者の集いとかでLTする余裕あったらしてみたいです。(余裕なさそう)