nigoblog

技術系会社のCEOブログ~私的編~

MVCモデルで見るRubyとPHPの違い

約1年くらいPHPを触っていないのでもしかしたら的はずれなことを言ってしまうかもしれませんが、MVCモデルを例にとってRubyPHPの違いを自分なりに考えてみたいと思います。

自分が利用したことのあるフレームワーク
Ruby -> Rails
PHP -> CodeIgniter
なのでここから見ていきます。

ちなみにこれからダラダラと書きますが、結論は(個人的に)Rubyの方が優れているという内容を書きます。

MVCモデルについて、詳しく説明することもないのですが、RailsとCodeIgniterで大きく違う点を示したいと思います。
まずはCodeIgniterのMVCモデルから
f:id:nigohiroki:20140315143356p:plain
このようになっております。

次にRailsMVCモデル
f:id:nigohiroki:20140315143422p:plain
両者での大きな違いは

  1. Railsはviewに渡すのは変数ではなくオブジェクト
  2. Railsはviewからもモデルのメソッドを呼び出す

つまりRubyは全てのものがオブジェクトであるという点からPHPとはMVCの概念も異なるということが言えます。

仮にとあるWebサービスのユーザーランキングページを作るとします。
そのページにはユーザーのランキング情報プラス各ユーザーの詳細情報も見ることができます。

CodeIgniterではまずモデルにランキング情報を取得するメソッドを作成します。
同様にモデルにユーザーの詳細情報を取得するメソッドも作成します。
コントローラーでランキング情報を取得するメソッドを呼び出し、
結果をループさせユーザーの詳細情報が付与されたランキング情報のハッシュを作成します。
そのハッシュをviewに渡しforeachで表示させます。
イメージ的には

<?php
//モデル
function ranking{
  ~
  // {"rank" => , "user_id" => }
  return ranking_hash;
}
function user_info($user_id){
  ~
  // {"id" => , "name" => }
  return user_info_hash;
}
?>

<?php
//コントローラー
$ranking = $this->モデル->ranking;
foreach($ranking as $user){
  $user_data       = $this->モデル->user_info($user["user_id"]);
  $ranking_array = { "rank" => $user["rank"], "user" => $user_data } 
}
?>

//ビュー
<?php foreach($ranking_array as $user): ?>
<tr>
  <td><?php echo $user["rank"]; ?></td>
  <td><?php echo $user["user"]["name"]; ?></td>
</tr>
<?php endforeach; ?>

このような感じかと思います。

一方Railsで同様のことをすると
コントローラーでモデルのランキングメソッドを呼び出す
ビューでモデルの詳細メソッドを呼び出す
このようになります。

#モデル
def self.ranking
  ~
  ranking_object
end
def user_name
  self.name
end

#コントローラー
@ranking = モデル.ranking

#ビュー
<% @ranking.each do |rank, user| %>
<tr>
  <td><%= rank %></td>
  <td><%= user.user_name %></td>
</tr>
<% end %>

このような感じになります。CodeIgniterと比べるとコントローラーのやることがかなり減るかと思います。
また、そもそもコントローラーで@rankingとしなくても、ビュー側で

<% モデル.ranking.each do |rank, user| %>

というようにも書くことが出来ます。
ただこれは一長一短でもあり、ビューにプログラミング要素を入れ過ぎないようにすることも必要です。

メリット・デメリットを整理すると

メリット デメリット
CodeIgniter ビューのロジックが減るためデザイナーが扱いやすい コントローラーが肥大化する
Rails コントローラーがスッキリする デザイナーにもオブジェクト指向を理解してもらう必要がある

あとは色々パターンがあるためRailsの場合はチューニングがめんどくさそうです。
CodeIgniterの場合はコントローラーのベンチマークをとってチューニングするだけで良さそうですが。

まとめですが、個人的にはコントローラーがスッキリするRailsの方が好きだし優れていると感じます!

駆け足気味でしたが、MVCモデルを例にとってRubyPHPの違いを示してみました。

これから新たな言語を学ぶ方や、PHPをずっとやっている方はRubyを使ってみてはいかがでしょうか?

ちなみにずっとPHPをやっていた方は最初はコントローラーが長くなるかと思いますが、徐々に慣れていきスッキリとしたコントローラーになるでしょう。

Ruby on Rails 3 アプリケーションプログラミング

Ruby on Rails 3 アプリケーションプログラミング

Ruby on Rails環境構築ガイド

Ruby on Rails環境構築ガイド