MVCアーキテクチャ—コントローラーはいくつ必要ですか?


54

私はしばらくコーディングしてきましたが、ほとんどはスクリプトと単純なアプリケーションです。Web Appsの開発と適切なMVCアーキテクチャの使用がすべての新しい役割に移行したため、そのすべてについて非常に迅速に学習しようと必死です。

この質問が「MVCアーキテクチャのベストプラクティス」とあまり似ていないことを願っていますが、いくつかの異なるチュートリアルを進めていると、いくつかの異なるコントローラが複数あることがわかりました。

1つのWebアプリに必要なコントローラーの数は?

例がなければ答えるのは難しいと思いますので、例を示します。

応用:

  1. ユーザーがログインします。
  2. ユーザーは、次の3つのいずれかを実行できます 。a
    ファイルをアップロードします(メタデータとともにmongodbデータベースに保存されます)。
    b) ファイルを検索します。
    c) ログアウトします。

私の質問は一般的な質問ですが、答えようとしている人を助けるために例を挙げました。


8
本当にいい質問です。
ダニエルホリンレーク

回答:


34

あなたの例では、2つのコントローラーを作成します。

  • ログインおよびログアウト用のセッションコントローラー(RESTのようなレイアウトのセッションを作成および破棄)
  • ファイル上のすべてのファイルコントローラー(index = searchおよびcreate = upload)

一般に、すべてを表示、作成、編集、および破棄できるリソースとして考えるRESTfulアプローチは、物事を構造化する方法を提供します。私の例からわかるように、RESTのすべての動詞に近づきすぎません。

多くの場合、追加の機能を使用するにはより多くのコントローラーが必要です。たとえば、ユーザーが新しいアカウントを作成できるユーザーコントローラー。また、これに加えて、より高い権限でリソースを編集できる管理インターフェイスが必要になります。このような場合、ほぼすべてのコントローラーを複製することは非常に一般的です。

最初のアイデアを得るための非常に大まかな見積もりは、ユーザーがアクセスできるデータベース内のすべてのテーブルに対して1つのコントローラーになることです。しかし、これは実際には非常に粗雑な測定値にすぎません。


3
管理者の例:管理者コントローラーは一般ユーザーを拡張しますか、それともすべてのメソッドを完全に再定義しますか?たとえば、すべてのユーザーがアップロードおよび検索できますが、削除できるのは管理者だけです。管理コントローラークラスは、すべての一般的なユーザーメソッドを継承しますか?
ジェフ

4
これは実際の機能に大きく依存しますが、一般に、まったく継承せずに2番目のコントローラーを作成するだけです。「シンコントローラー」の原則に従って、コントローラーにコードをあまり配置しないでください。また、管理コントローラーは特にシンプルにすることができます。重要な機能はすべてモデルに組み込まれます。(たとえば、ユーザーを削除すると、すべてのファイルも削除する必要がある場合、モデルがこれを処理します。コントローラーには、このための単一の行はありません)
thorstenmüller13年

6

本当にWebアプリに依存します。あなたの例では、おそらく1つで十分です。送料、税金、在庫管理、段階的な価格設定などを備えた本格的なeコマースアプリを実装する場合は、さらに2、3個必要になります。

コントローラーが1つ以上のコードの匂い(特にLarge ClassまたはGod Object)に悩まされている場合は、おそらく1つだけでは十分ではありません。


5

アプリケーションのニーズとビジネスモジュールのアーキテクチャに本当に依存します。

一般的な経験則として、必要なコントローラーの数は、Webアプリのモジュールとサブモジュールの数に依存します。

補足として、コントローラーをAreasに整理すると役立ちます。Areasの概念はASP.NET MVCフレームワークに組み込まれており、1つのモジュールを提供するコントローラーの構成を簡素化します。

関連する議論がいくつかあります。


1
素晴らしい参考文献!必ずチェックしてください!
ジェフ

もちろん問題ありません。
ELユスボフ

4

Appleのやり方が好きです。

すべてのビューは、1つのView Controllerのみによって制御されます。〜iOS用のビューコントローラプログラミングガイド

考え方は、ビューを簡単に交換できるようにする必要があるということです。IMO、唯一の1を有することによりControllerごとにView、それは簡単にこれを実現することができます。ただし、複数のビューを備えたコントローラーを使用し、プログラムロジックを変更せずにビューを切り替えることができるように設計できると確信しています。


これは良い点ですが、すべてのビューにコントローラーを追加し、ユーザーのようなものを処理するために追加のコントローラーが必要ですか?私のプロジェクトがもっと大きければ、より多くのコントローラーを持っている方が理にかなっていると思います。
ジェフ

モデルはユーザーを追跡する必要があります。したがって、必要に応じて、複数のコントローラーがすべて同じモデルオブジェクトを使用できます。
コレイヒントン

2
そのため、コントローラーにはModelオブジェクトとViewオブジェクトがあります。コントローラーは、モデルオブジェクトに情報(ユーザー情報など)を要求し、それに応じてビューを設定します。モデルにはほとんどのプログラムロジックが必要ですが、コントローラーにはビューとモデルの間でやり取りできるロジックのみが必要です。
コレイヒントン

2
コントローラーはモデルの異なる状態に対して異なるビューモデルを表示できないため、ビューごとに1つのコントローラーは非常に限定的な設計です。
ELユスボフ

1
@ElYusubov紛らわしいところがわかります。iOSでは、すべてのビューに1つのビューコントローラーのみがあり、すべてのビューコントローラーにアクティブビューが1つしかありません(そのビューにはサブビューを含めることができます)が、そのビューコントローラーには任意の数のビューへの参照を含めることもできます。
コレイヒントン

2

私が気に入っている1つの例は、サーモスタットについて考えています。サーモスタットは、MVCパターンを表示するための優れたビジュアルです。


古いアナログサーモスタットでは、次のようなものを描くことができます。

表示 -現在の温度を表示する温度リーダー。

コントローラー -温度を変更するダイヤル

モデル -温度を変化させるコントローラーによって呼び出される内部部品。


疎結合を許可し、モデルとそれに関連するコントローラーを単一のタスク制限する設計を常に順守し必要な数のモジュール/コントローラーを使用する必要があります。アプリケーションのサイズによっては、モデルやコントローラーよりもはるかに少ないビューがある場合があります。これは、大規模なアプリケーションで予想されます。優れたオブジェクト指向プログラミングの特徴は、疎結合、カプセル化、継承、および多態性です。すべての言語が同程度の多態性をサポートしているわけではありません(関数、メソッド、演算子のオーバーロード/オーバーライド)。

MVCアーキテクチャを適切に使用することをより深く理解したい場合は、コード例としてC ++とSmallTalkを使用するGoF「設計パターン:再利用可能な要素...ソフトウェア」を参照してください。この本はアルファとオメガではありませんが、それは確かに始まりです!

幸運を!


1

あなたの例は複雑なシステムに進化すると思います。

応用:

ユーザーログイン:

  • LoginController

その唯一の責任は、ログインの処理、リダイレクト、または結果のユーザーへの通知です。

ファイルをアップロードする

  • UploadController

ここでは、あらゆるタイプのファイルをアップロードすると仮定します。後日、MP3とPDFをアップロードすることにした場合、ベースのUploadController、MP3UploadController、およびPDFUploadControllerがあります。

ファイルを検索します。

  • SearchFileController

これは基本的な要件には十分です。検索ロジックがどの程度複雑になるかに応じて、後日複数の検索コントローラーを使用できます。最後に必要なのは、さまざまな検索を実行する20のアクションメソッドを持つ単一のSearchControllerです。

ログアウト。

-LogoutController

これはやり過ぎだと思うかもしれませんが、私はそうは思いません。私はそれがきれいできれいに分離されていると思います。

このプロジェクト構造を見ると、それが何をするのか、どのように構成されているのかがすぐにわかります。さらに一歩それを取るために、私は入れてしまうLoginControllerと、LogoutController別の領域へ。

私は以前にこのようなものを開発しましたが、本当にうまくいきました。


入力いただきありがとうございます!動作するコードはありますか?いくつかのことにこだわっています。
ジェフ

どのような問題が発生していますか?
CodeART

件名と日付(文字列形式)をアップロードできますが、ファイル自体をアップロードできません(stackoverflow.com/questions/18344614/…を参照)。
ジェフ

私は.NET開発者です。申し訳ありませんが、私はあなたを助けることができません。
-CodeART

1

あなたのコードのほとんどはビジネス層で起こっているでしょうか?その場合、コントローラーで実際に実行しているのは、ビューにデータを返すことだけです。

私がコントローラーをサブタイプに分離するのが好きかどうかは確かではありません。懸念の分離を維持する必要がありますが、サブタイプは少し行き過ぎていると思います。また、重いオブジェクトがコンストラクターまたはコントローラーで初期化される場合にも注意する必要があります。例:この例では、ユーザーがログインページにいるときに検索/アップロードファイルのみを解放するために使用される重いオブジェクトが必要になります。

AccountController(ログイン、登録、ログアウト)、FileController(検索、アップロード)などのように、ロジックユニットごとにコントローラーを用意することをお勧めします。


0

一般的に、すべてのモデルには独自のコントローラーと専用のビューがあります。一般的に言って、これがベストプラクティスであることを意味します。

アプリケーションアスペクト(ユーザー管理など)は、アプリケーションサービスに変換する必要があり、それ自体のコントローラーから呼び出すか、コントローラーをラップする必要があります(たとえば、要求ユーザーロールに応じてコントローラー機能を「表示」する属性を使用)。

基本的に、すべてのコントローラーはモデルに対するCRUD操作を処理し、フィルターごとに異なるビューを使用する必要があることに注意してください。

私の意見では、パターンとしてのMVCの主な利点の1つは、モデルとビューを結び付ける最良の方法を提供することです。

追加した例について:2つのコントローラーを作成します。1つはすべてのユーザーのログイン操作(登録、ログイン、ログアウトなど)用で、もう1つはファイル操作(アップロードおよび検索)用です。1つ目はログイン機能に関連するいくつかのアスペクトでバックアップする必要があり、2つ目は通常のコントローラであることに注意してください


説明がないと、他の誰かが反対意見を投稿した場合に、この答えが役に立たなくなる可能性があります。たとえば、「ユーザーの役割と承認を管理することはコントローラーの最優先事項ではない」などの主張を誰かが投稿した場合、この回答は読者が2つの反対意見を選ぶのにどのように役立ちますか?考えてみましょ編集をより良い形にそれをINGの
ブヨ

1
@gnat私はあなたのコメントを受け入れます、編集された答えを参照してください
サターンテクノロジーズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.