1. ホーム
  2. model-view-controller

太ったモデル、痩せたコントローラ、MVCデザインパターン

2023-10-12 21:35:28

質問

私はちょうど ブログ記事 を読んだところ、MVCを銀行に例えて説明していました。私は MVC フレームワーク (CakePHP) を使用した Web アプリケーション開発の経験が数か月あるので、基本は理解していますが、ロジックを置く場所に欠陥のあるアプローチを取っていると思わせるテーマが見え始めています。

  • 太ったモデル、痩せたコントローラ
  • できるだけ多くのビジネスロジックをモデル内に保持します。

私のアプリでは、モデルは拒食症で、コントローラは肥満症です。私はすべてのビジネスロジックをコントローラに置き、モデルには関連付けと検証ルール以外何もありません。

コントローラに目を通すと、おそらくモデルに入れるべきロジックがたくさんあることがわかります。

  • このアプリにはリストがあり、リストにはアイテムが含まれており、アイテムはランク付けされることがあります。リストをランク順に並べるソートロジックはコントローラにあります。
  • 同様に、アイテム(Itemモデル)は画像(Imageモデル)も持っています。各アイテムは、デフォルトの画像(itemsテーブルのimage_idで指定)を持つことができます。アイテムがその画像とともに表示されるとき、デフォルトの画像が最初に表示されるようにします。これを行うロジックをコントローラに記述しています。
  • リストが表示されると、関連するリストがサイドバーに表示されます。どのリストが関連するのかを判断するロジックはコントローラにあります。

では、質問に入ります。

  1. 私が上にあげた例では、それらはモデルに属するコントローラに存在するロジックのインスタンスであると考えるのは正しい道でしょうか?
  2. ウェブアプリに共通する、モデルに入れるべき他のロジック領域は何でしょうか?
  3. この問題を特定し、デザインパターンを変更することが戦いの半分であることは確かですが、私が上にあげたこれらの例を取り、そのロジックをモデルに移動しようと決めたとしても、どこから始めればよいのかわかりません。どなたか、ここにコードを投稿したり、良い学習リソースにリンクしたりして、正しい方向性を示していただけませんか?CakePHP特有のヘルプがあれば最高ですが、MVCであれば何でも十分だと思います。

どのように解決するのですか?

フレームワークの仕様に関係するものもあるため、正しい答えを出すのは少し難しいです。

少なくともCakePHPの観点では。

  1. はい

  2. データまたはデータ操作を扱うものはすべてモデルの中にあるべきです。CakePHPで言えば、単純なfind()メソッドはどうでしょうか?... もしそれが何か特別なこと(例えば'条件'の特定のセットを呼び出す)をする可能性があるなら、それはモデルのメソッドの中でラップする良い言い訳になります。

  3. 残念ながら、簡単な答えは決してありませんし、コードのリファクタリングは自然なプロセスです。時々、目が覚めて、quot;holy macaroni... that should be in the model!