前書き
最近Railsを触ったりしています
僕は元々WebフレームワークはYesodしか使った事がありませんでした、そんな僕がRailsを触って感じた事を書いてみようと思います
Yesodとは
僕の周囲ではメジャーなWebフレームワークであるYesodですが、おそらくはそこまで知名度が高いわけではないと思うので、簡単に説明します
YesodはHaskell製のWebフレームワークです、Rails経験者の方はHaskellでもRailsのような事ができるんだなと思ってもらえれば十分だと思います
YesodとRailsの違い
Railsの設計思想は皆さんご存知の通り「設定より規約」です、設定ファイルをいじくったりはあまり必要ありません
Yesodも基本的に同じだと思っていいと思います、設計思想にあまり違ったところは無いように感じます
また、基本的に両者ともMVCに基づいた設計がされていますが、MVCのそれぞれのバランスというか比重が少し違うように思います、Yesodは全体的にControllerの責任が大きいように感じます
それ以上に両者に違いを与えているのは、当たり前の話ですが「言語」です
RailsはRuby
YesodはHaskell
RailsとYesodの違いはほとんど個の両者の言語の違いに起因するものだと思います
Railsのメリット
とりあえず動く
多くの動的型付け言語がそうであるように「とりあえず動く」と言うのは非常に重要ではあると感じました
Yesodでは全体として整合性がとれていないと動かす事すらできません、もちろんそのおかげで安心してアプリ作成が進めれるますが
一方Railsでは「ここは途中までしか作ってないけどとりあえずここは確認したいな」と言うのが気軽にできるというのは重要だと感じました
モデルの処理が充実している
Yesodに比べてモデルのマイグレーションやバリデーションが柔軟に行えるのは非常にうらやましいなと感じました
Railsのデメリット
とりあえず動いてしまう
Railsのメリットは「とりあえず動かせる」でしたが、一方デメリットは「とりあえず動いてしまう」だと思います
同じ事を違う視点から見ただけなのですが、全体として整合性がとれていない事を「自覚した上で」「とりあえず動かす」分にはメリットですが、「自覚していない上で」「とりあえず動いてしまう」のはそれはデメリットです、簡単な例で言えばtypoなどでしょうか
もちろんそう言ったところをチェックして、動かしたいところがちゃんと動いているかどうかを確認するためにテストを書いたりするわけですが、如何せん面倒くさいです、最低限のチェックは実行前に処理系に世話を見てもらいたいと強く感じます
型に対する意識が残念
全体としてシンボルなどが多用されているのは非常に残念に感じます
Rubyは動的とはいえ強い型付け(メタプロを多用する限りにおいてはその限りではないですが)が利点だと思うので、わざわざ事実上型の無いシンボルを多用するのは最低限のRubyのメリットさえもつぶしているように感じます
シンボルと文字列を多くの場所で同一視しているのも同じ理由で残念に感じます
Yesodのメリット
静的型
静的型です、簡単に言えば「「とりあえず動いてしまう」事が無い」と言う事です
モデルにも型がつくのはもちろんリンクにも型がつきます、フォームにも型がつきますし、それらの整合性は実行前にコンパイル時にチェックされます
間違った処理を行ってしまう可能性が格段に減ります
Yesodのデメリット
柔軟性に欠ける
意図的に「ここ上手くできてないはずだけどとりあえず別の場所チェックしよう」と言って壊れた状態で動かす、というのが難しいです、最低限型を合わせないといけないので
また、モデルのマイグレーションはモデルを変更したら勝手に行ってくれるのですが、少し処理に柔軟性が欠けるように感じます、例えばNULLを許容するカラムを後からNULLを許容しないように変更するなどは基本的にできません
依存性がヤバい
Yesodは様々なHaskellのライブラリに依存しています、依存しまくっていて、下手に導入するとローカル環境をめちゃくちゃに破壊してくれます
最近はcabalにもsandbox機能がついたりしたのでこの辺は大分緩和されていますが......
コンパイルが長い
はっきり言って、実行前にコンパイルする必要があるわけですが、これが非常に長いです、初回ビルドにおいては依存するライブラリもビルドするのでめちゃくちゃに時間がかかりますし、そうでなくてもWebアプリそのもののビルドも非常に時間がかかります
ビルドせずにとりあえず動かす事も可能ですが、自分が試した限りだとAjaxをやろうとしたりしたら上手く行かないです、ビルドして動かした方がいろいろと楽でしょう、そうなるとコンパイル時間の壁にブチ当たります
全体の整合性をチェックしてくれてるありがたい時間と思えばいいのですが、まあ、うーん
総括
個人的にYesodはまだまだ実際のプロダクトで動かすには柔軟性に欠けるように思いますが、今後に非常に期待できると思います
いくら柔軟性に欠けていたりコンパイルが長かったりしても、うっかりミスをやらかしがちなRailsよりかは個人的には安心です
とりあえず動けばいいんだ動けば、という人にはRailsの方が向いているかもしれません