🏠 ホーム
フロントエンド
PHP
Go言語
プログラミングの理解
プログラマーへの道
Google API

MVCフレーム fat controller について

  プログラミング >     プログラミングの理解 >  

MVCの「fat controller」をどうするかについて結論からは「fat controller」のままでいいんじゃないかと

make a record of…: MVCのお勉強。太ったモデルと痩せたコントローラ

「特定のモデルに大量のメソッドが集中したり、~~~もやし日記」にほぼ賛成

Modelにロジックをおくとコントローラが変更したらそれに合してModelも変更することになる
Modelの関数を変更するとそれを使用しているコントローラも変更しないといけない場合がある。

たとえばこのページのコード
CakePHPを使ったMVC設計のベストプラクティス

このコードでは$this->params['url']['ext']で引数をとっているがもしhtmlで
かつPOSTのテーマ単位で選べるような仕組みを作りたいとしたとき


class PostsController extends AppController {

public $components = array("RequestHandler");

protected $_types = array(
"html" => array("popular"),
"rss" => array("all", "limit" => 50)
);

function index() {
$options = $this->_types[$this->params['url']['ext']];
$theme_id = $this->params['url']['theme_id'];
$posts = $this->Post->find($options[0], $options,$theme_id);
$this->set(compact("posts"));
}
}

class Post extends AppModel {
protected $order = "Post.created DESC";

public function find($type, $options = array(), $theme_id = NULL) {
switch ($type) {
case "popular":
if (isset($theme_id)){
return parent::find('all', array_merge(
array(
'limit' => 10,
'order' => 'Post.view_count DESC'
),
'where' => array(array('id', $enqu_id),),
$options
);
}
return parent::find('all', array_merge(
array(
'limit' => 10,
'order' => 'Post.view_count DESC'
),
$options
);
default:
return parent::find($type, $options);
}
}
}


controllers/posts_controller.php 変更
models/post.php 変更
htmlの変更なのに書き方によってはrssのロジックも変更しないといけない書かないとしたら
書かなくてもいいようなロジックをmodels/post.phpにかかないといけない
モデルにロジックが増えてくると、単純に1つのテーブルからデータを引き出すだけでも
コントローラ上で不必要なパラメータを入力してモデルに渡さないといけない状況になる
であれば別の関数を新たに作ればいい。
そうなると1つのコントローラでしか使用されないモデルの関数になってしまう。
専門性のあるメソッドをモデルに作る事がベストプラクティス
みたいな記事をwebで前見たがそれであればそもそも関数を作るメリットがない。
単にロジックの場所を動かしたにすぎない。

アジャイル環境下ではfat modelアプローチ(ロジックをモデルに置くという概念)はデメリットしかないと思う。

上記のサイトで
「ページ指向の設計」のようなPHPにおける典型的なやり方をとってしまうPHPプログラマは多い。と書かれているけども「ページ指向の設計」でいいんじゃないでしょうか?



それでも何千行もあるコントローラをみるのはつらいので
シングルアクションパーコントローラであればソースコードは多少見やすくなるんじゃないかと思います。


Single Action per Controller in ASP.NET MVC - Jak Charlton ...

登録日:

更新日:

by

コメント         tweetでコメント