フレームワーク選択のススメ

play!, Ruby on Rails, CakePHP 等、世の中にあるフレームワークの内
どのフレームワークを選択すればいいのか?を調べてみた。

play framework

Java もしくは Scalaフルスタックフレームワーク。ここでは 2.x について述べる

主な特徴
  • ソースの変更時にコンパイルやサーバーの再起動が不要。WEBアクセス時に自動でコンパイルが行なわれる
  • Scala を用いたテンプレートエンジンを採用しており、テンプレートのエラーについてもコンパイル時に検出が可能
  • デフォルトではDB操作には Anorm を使用している。
    • ORMではなく、SQLを発行してDB操作を行なう
  • JSONライブラリも内蔵(jackson/jerkson)
  • テンプレートエンジンは Scala をベースにしており、型安全性を確保している
  • セキュリティ
    • XSSにデフォルトで対応(オプションで無効化可能)
    • CSRF対策用の機構も標準で用意されている

Ruby on Rails

Rubyフルスタックフレームワーク
コンセプトは「DRY(Don't Repeat Yourself)」「CoC(Convention over Configuration)」

CoCとは
Convention over Configuration(設定より規約)の略
開発者が決定すべき事を減らし、単純にするが柔軟性は失わせないという思想

主な特徴
  • scaffold による強力なひな形自動作成で、特定のデータに対して以下の画面を自動で作成できる
    • 新規作成画面
    • 一覧表示画面
    • 詳細表示
    • 修正画面
    • 削除画面
  • ActionView, ERb による出力内容の生成
    • ヘルパーメソッドが豊富
  • ActiveRecord によるModelの実現
    • データとソースコードが全て 1対1で関連付けられており、非常にシンプル

Sinatra

Rubyフレームワーク

主な特徴
  • MVC の Controller の部分のみを提供する。
  • 規約が緩く、Railsよりも手軽にアプリケーションが作成できる
    • その分、大規模なアプリケーションを作ろうとすると機能毎にするべき事が多くなる
    • よく使用される機能については Sinatra::Contlib で拡張モジュールが提供されている

Symfony

PHPフルスタックフレームワーク
PHP5 にのみ対応

主な特徴
  • Ruby on Rails を意識した設計
    • scaffold に似たコード自動生成機能が提供されている
  • DBレイヤーはDoctrine, Propel の2種類のORMから選択可能
  • JSONオブジェクトを扱う場合ははPHP標準のjson_encode/json_decodeを使用する
    • Ajax 通信用のヘルパーメソッドをサポートしている
    • Doctrine
      • 独自の言語「DQL(Doctrine Query Language)」を使用してDBにアクセスする
      • オブジェクトを操作する感覚でクエリを作成・実行する事が可能
      • エンティティクラスやテーブル/スキーマコマンドラインから自動生成することが可能
      • 最新版(symfony2)ではデフォルトのORMとして採用されている
    • Propel
      • DBスキーマXML形式で準備し、XMLからORMのクラスを生成する
      • 1.2 ではデフォルトのORMだったが、最近はDoctrineの方が注目されている
  • バリデーションも内蔵のライブラリで提供
  • 標準でXSS, CSRF対策実施済み
  • ログイン認証・アクセス制御についてもフレームワーク側で機能を提供している
  • テンプレートエンジンには Twig を採用
    • Pure PHP よりも簡潔に記述が可能

CakePHP

PHPフルスタックフレームワーク
PHP4/5の両方に対応
「あらゆるレベルのPHPユーザが素早く快適に開発を行えること」を目標として作られている

主な特徴
  • Rails を意識した設計
  • Rails と同様にActiveRecordパターンを使用したO/Rマッパーを採用
  • 出力内容は Pure PHP で作成し、テンプレートエンジンを使用しないことも可能
    • Smarty等のテンプレートエンジンを使用することも可能
  • JSON形式での出力は、基本的にはテンプレート内でPHPjson_encodeを実行する形になっている
    • symfony と比べ、自由度は高いがその分開発者がする作業が多い
  • XSS については Sanitize というライブラリで対策を提供
    • PHPのhtmlspecialchars()と同等のエスケープ処理や、不要なタグのみを除去したりすることが可能

CodeIgniter

PHPフレームワーク

主な特徴
  • ソースコードが軽量
  • Active Record をサポートしている
  • 出力内容は Pure PHP で実装する
    • テンプレートエンジンも提供しているが、動作速度の観点から Pure PHP を推奨している
  • バリデーションも内蔵のライブラリで提供
  • XSS対策として、送信されたデータをフィルタリングする機能を提供(デフォルトでは無効)
  • CSRFについてもオプションを指定する事で対策可能

Spring

Java の汎用フレームワーク
Webシステム以外にも、通常のJavaアプリケーションを製作するのにも利用可能
元々はMVCフレームワークではないが、Spring MVC を利用することでMVCの機能を使用できる

主な特徴
  • DIコンテナ

Dependency Injection(依存性の注入)コンテナの略
オブジェクト(コンポーネント)間の依存関係をソースから取り除き、プログラムの実行時までコンポーネント同士が依存関係を持たないようにするデザインパターン
オブジェクト間の依存関係をソースコードではなく、外部の設定ファイルにXML形式で記述する

Seasar2

Java の汎用フレームワーク

主な特徴
  • DIコンテナ

Spring に近いが、CoCの思想を取り入れており、設定ファイルに記述する内容が少なくなるように設計されている。

Scalatra

ScalaSinatra Like なフレームワーク

主な特徴
  • Sinatraと同様に、MVCのコントローラー部分のみを提供する
  • 言語が Scala であり、静的型付けであるため、コンパイル時にエラーの検出が可能

Lift

Scalaフルスタックフレームワーク

  • アプリケーションサーバとして Jetty、データベースは H2 Database Engine が採用されている
  • MVCのコントローラーに該当する部分は、開発者が意識せずに済むように設計されている
  • CoCに基づき、設定ファイルを書かずに済むように設計されている


フレームワークを選択するうえで、以下の特徴を考慮することにした

フルスタック or シングルタスク

  • フルスタック
    • WEB開発に必要な機能が全て含まれているフレームワーク
    • 大人数なプロジェクトでもクオリティーが安定しやすい
    • 開発環境の作成が容易
  • シングルタスク
    • 必要な機能の内一つが含まれているフレームワーク
    • 使用する際には他のフレームワークなどと組み合わせる
    • 小規模なアプリケーションの場合、フルスタックなフレームワークより実装がシンプルになりやすい
    • 人数が多くなるについて、成果物のクオリティーが一定になりづらくなる
    • 簡単な機能を追加する場合でもそれなりにコードを書かなければいけない場合がある

フレームワークを単純にフルスタック/シングルタスクで分類できるわけではなく
複数の機能を含むがフルスタックではない、などもあり得る

CoC or Not

Rails, play 等の CoC を採用しているフレームワーク
Sinatra 等のそうでないフレームワークがある。
Rails等はフレームワークの規約に沿って実装する限り、設定ファイルなどはほぼ不要となっている。
対して、Sinatra については(実装に大きく依存するが)設定ファイルを使用しない事も可能である。
CoCを採用しないフレームワークの方が自由度が高いが、開発者の数が大きくなった場合のクオリティーはCoCを採用しているフレームワークの方が安定するものと思われるため、プロジェクトの規模によってどのフレームワークを採用するかを変更するべき?

今回調べたフレームワークの一覧

今回調べたフレームワークの特徴について、以下の表にかんたんにまとめた。

名前 言語 フルスタック度合 規約 コード自動生成 備考
Spring java
Seasar2 java
play java/scala
Scalatra scala × 提供するのはMVCのContollerのみ
Lift scala
CodeIgniter php
Symfony php
Cake PHP php Bakeを使用する事でコードの自動生成が可能
Sinatra ruby × 提供するのはMVCのContollerのみ
Ruby on Rails ruby

総括

今回調べたフレームワークの内、3つをピックアップした。
これらについてはサンプルアプリを製作する予定。

play
  • 元々静的言語であることと、テンプレートも静的なためコンパイル時のエラー検出が非常に強力
  • 導入する際のハードルも比較的低い
  • フルスタックであるため、多人数での開発に向いている
Ruby on Rails
  • scaffold が強力
  • メジャーであるため参考文献が多い
Scalatra(もしくはSinatra)
  • 規約が弱く、非フルスタックなため小規模なアプリケーション開発に向いている
  • 習得している言語によってどちらかを選択するのが良いと思われる