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
プログラマーこまつ