Squerylの使用感とScala ActiveRecord

追記: 作者の方から、丁寧な回答をコメントでもらったので、ちゃんと読むといいよ!


いくつかblogに書いたり、tweetしているように最近Squeryl使ってます。
そして、今日2013年3月2日Scala Conference in JapanでScala ActiveRecordの発表を聞いて来ました

https://github.com/aselab/scala-activerecord

がしかし、会場で質問しようとしたけどできなかったので、Scala ActiveRecord自体への疑問と、ついでにSqueryl自体の使用してみての感想や疑問なども色々書いてみようと思います。


なお、真面目に使用を検討すればするほど、(元々心配性な正確も相まって)必要以上に(?)否定的というか懐疑的というか疑問点、不満点ばかり気になるので、それらを中心に書き連ねていきますが、ご了承ください・・・(´・ω・`)


Scala ActiveRecordは、「Squerylをforkして独自改造 + wrap」しています。
会場に来て発表を聞いていた人で、Squerylを使った経験がある人があるのは少ないことは予想できるので、仕方がないことではありますが、発表を聞いていて個人的に思ったのは「それSquerylの機能ですよね」という点です。

個人的には「Squerylと何が違うのか?」と「今後のSqueryl本体との関係」がとにかく重要です。
あの発表を聞いて、「Scala ActiveRecordを使いたい!」と思った人がいても、その魅力に感じた点が「Squerylに本来備わっている機能の部分」ならば、Sqeurylを使うという選択肢もありえます。*1

なぜなら、Squerylはある程度の歴史とコミュニティ(それほど投稿数多くはないが、メーリングリストがあって今も投稿があったり)があるからです。

Scala ActiveRecordが、単に「Squerylをラップして追加の機能」を提供するだけなら、もっと手軽に使ってみようかなぁという感覚にもなるのですが、「独自にforkして改造」している点がとても気になります。

具体的には

  • 今後Squeryl本体にpull requestなどをしてfeedbackしていくのか
  • Squeryl本体が機能追加されたり新しいversionがでた場合に、それらを取り入れるのか
  • 今後さらに独自改造をすすめるのか?

などです。その辺りの方針が(ある程度決まっているのかもしれませんが)よくわかっていないので、詳しく知りたいところです。今後さらに独自に改造していく予定ならば、そもそも「forkしたもの + ラップ」という構成ではなく、「forkしたものの名前を変えてしまって別ライブラリにしてしまう」選択肢もありだと思うのですが、それをしていない点が気になります。

Scala ActiveRecord(とforkしたsqueryl)はソースはある程度読みましたが、実際試したわけではないので半分想像で言っている部分がありますが、現状Squerylとくらべての違いがそれほど多くあるわけではないように感じます。
というか、「自分がSquerylを使っていて不満に思っている点」と「Scala ActiveRecordの方向性」が異なる感じです。

Scala ActiveRecord」で、現状追加されている機能をみた感想としては、
「モデル定義や、よく使う機能を、RailsのActiveRecoadに似せて、できるだけ簡単に短く書けるようにした」
という印象です。

しかし、個人的にはSquerylを使っていく上で感じているのは

  • 複雑なQueryの発行や、それぞれのデータベース独自の機能を使う場合のやりにくさ
  • ライブラリ自体の内部構造の把握のしにくさ、拡張性

などで、モデルの定義などに関しては*2そこまで不満に感じません。あと、「Json関連のシリアライゼーション機能を入れたい」的な今後の展望を話していたと思いますが、あくまで個人的な感想としては、そういった機能はScala ActiveRecordがやらなくても他のライブラリとして提供できそうだし、あくまでデータベース関連に特化した機能を優先して実装するべきではないのかなぁと思います。


また、Squerylの「ライブラリ自体の内部構造の把握にしにくさ」ですが、ORMのライブラリなら性質上しょうがない面もありますが、リフレクションが多用されていたり、(使用するユーザーにとって短く書けるようにするために)内部でかなりimplicitが多く使われているという意味です。
そういう点において、今までかなり色々なScalaのライブラリのソースコードを読んできましたが、Squerylは「ソースを読んで理解するのが難しい」部類に入るのではないかと思います。

なぜ「内部構造の把握のしやすさ」などを気にしているかというと、ScalaのライブラリはJavaのライブラリとくらべて先進的で便利な反面、使用しているユーザー数が少なかったり、ドキュメントが少ない傾向にあるのは事実で、自然と「困ったときに自分でソースコードを読んで理解できる」ことがかなり重要だからです。というか、「困ったとき」でなくても、使うまえから「まずソースを読んで」使い方と大まかな内部構造を把握する癖がついてしまいました・・・。

そういう意味で「ただでさえSqueryl(の内部構造)がわかりにくい」のに、forkした独自改造を使うとなるとさらに情報が少なくなってデメリットもあるので、そういう部分を心配しています。




というわけで、色々かなり疑問点や不満点ばかり書いて来ましたが、SquerylもScala ActiveRecordも、デメリットや制限を理解できていれば、「型安全で、なおかつScalaの内部DSLを使って短く書ける」という点においては、確かにとても魅力的で、現状でも実用的ではあります。


というわけで、だらだらと思ったことを書いてみましたが、Scala ActiveRecordの作者の方や、Squerylに限らずScalaのORMライブラリを使っていて色々と思っていることがある人の、できるだけ多くの反応をお待ちしています|ω・`)

*1:そして、Squerylをそのまま使うだけのほうがある程度のメリットがあるのではないか?という話

*2:確かに頑張れば気持ちは短く書けそうなのはわかりますが