MVCパターンを使用する必要があるのはなぜですか?


74

最近、Webアプリケーションを実行している人はすべてにMVCを使用したいと考えています。ただし、このパターンを使用するように説得することは困難です。一般的な考え方は、プログラムを表すフロントエンドからバックエンドロジックを分離することだと理解しています。一般的に、ビューは常にある程度コントローラーに依存しているようで、最終的にはモデルに依存します。コントローラーを追加することで得られる利点がわかりません。「これがアプリケーションの設計方法だ」という誇大広告をたくさん読んだことがありますが、どこに行くべきかがまだわからないかもしれません。私がMVCについて他の人と話すときはいつでも、誰がどのカテゴリに属する​​かについて異なる考えを持っているようです。

それでは、なぜMVCを使用する必要があるのですか?フロントエンドをバックエンドロジックから分離するだけでMVCを使用すると、何が得られますか?(このパターンのほとんどの「利点」は、インターフェイスを実装から分離するだけで得られ、別の「コントローラ」を持つ目的を説明できません)


9
MVCは、単にSeperation of Concernsの実装です。どの実装でも可能です。懸念Seperationsを使用していないことの方に導く傾向にある泥のビッグボール
レイノス

1
@レイノス:おそらく。しかし、それは「誇大宣伝」が起こっている場所ではありません。
ビリーONeal

3
誇大宣伝は誇大宣伝曲線に従う。影響を与えすぎないようにしてください。私の観点から見ると、MVCはSoC向けの堅牢なアーキテクチャであり、実装が簡単です。確実な代替案は考えられません。
レイノス

ほとんどの既存のユーザー・インターフェース・フレームワークはしっかりとVとCをリンクし、あなたが別のものに切り替えたとき、あなたは、ビューとコントローラ(Mからユーザーが見るものへのインタフェース)の両方を書き換える必要があります
フリークラチェット

しかし、懸念の分離はオブジェクト指向開発の特性です。適切な懸念の分離コードを実装するためにMVWパターンを使用する必要はありませんか?
バスティアンヴァンダム14

回答:


50

へえ。Martin Fowlerは、MVCについてのあなたの混乱に同意します。

MVCにはパターンが非常に多く含まれているため、MVCをパターンとして考えることはそれほど有用ではありません。さまざまな場所でMVCについて読んでいるさまざまな人々が、さまざまなアイデアを取り入れて「MVC」と表現しています。これで十分な混乱が生じない場合は、中国のささやきのシステムを通じて発生するMVCの誤解の影響を受けます。

しかし、彼はMVCの動機についてより説得力のある説明の1つを続けています。

MVCの中心にあるのは、分離プレゼンテーションです。分離プレゼンテーションの背後にある考え方は、現実世界の知覚をモデル化するドメインオブジェクトと、画面に表示されるGUI要素であるプレゼンテーションオブジェクトを明確に分けることです。ドメインオブジェクトは完全に自己完結型であり、プレゼンテーションを参照せずに動作する必要があります。また、複数のプレゼンテーションを、おそらく同時にサポートできる必要があります。

ファウラーの記事全体はこちらで読むことができます


19

これはあなたが取り組んでいる問題に大きく依存していると思います。私は次のように分離を見ています:

モデル -データをどのように表現しますか?たとえば、オブジェクトからDBなどの永続ストレージに移動するにはどうすればよいですか?>「ユーザー」オブジェクトをデータベースに保存するにはどうすればよいですか?

コントローラー -私は何をしていますか?これが行われているアクションであり、概念レベルで実行する必要があるものです。たとえば、ユーザーに請求するにはどの段階を経る必要がありますか?NBこれは、あらゆる量のオブジェクトに影響を与える可能性がありますが、DBに永続化される方法については何も知りません。

ビュー -結果をどのようにレンダリングしますか?

私が見ている問題は、多くのWebアプリケーションがDBへのCRUD(作成-取得-更新-削除)インターフェースを称賛していることです。つまり、コントローラーは「ユーザーを追加する」ように指示され、モデルに「ユーザーを追加する」ように指示します。何も得られません。

ただし、実行するアクションがモデルの変更に直接適用されないプロジェクトでは、コントローラーを使用することで作業がはるかに簡単になり、システムのメンテナンス性が向上します。


1
「実行するアクションがモデルの変更に直接適用されないプロジェクト」ここでの「モデル」とはどういう意味ですか?データベース?私が話したすべての人が、そのようなアクションはまだコントローラーではなくモデルに属していると言っているからです。(たとえば、コントローラーはHTTPのみを処理する必要があります...)
Billy ONeal

HTTPのものとは何ですか?コントローラに以下を含めます:HTTPリクエストパラメータの非整列化、基本的な健全性のパラメータのチェック、実行する必要があることの決定、適切なモデルオブジェクトへのアクセス(読み取り、書き込み、または両方)、モデルの応答に基づく最終結果の生成、それをビューに渡します。何かの愚かな例だけ乱数を生成するWebサービスであるかもしれないためにコントローラが使用される-この場合を見て何の「モデル」が存在しない(少なくとも私の心の中では...)
UNK

これらはすべてモデルの問題です。「何をする必要があるかを決定する」こと(「フロントコントローラー」)もモデルです。
ビリーONeal

2
言うまでもなく、コントローラーはモデルをビューにハードカップリングしないために役立ちます。1つのコントローラーを介して多くのビューを多くのモデルに接続できるようにします。
レイノス

1
@Billy:ビューでモデルを「混乱させる」ことを許可すると(その値を取得する以外に)、よりコントローラに近いビューになります。私は、MVCのModel-GUI-Mediator化身の観点からもっと考えます。コントローラーは、モデル(ドメインの動作とデータ)とGUI(モデルの画面表示)を仲介します。ビューは、インタラクションをコントローラーに渡します(ユーザーがクリックした...)。コントローラーは、モデルで何を呼び出す必要があるか(ある場合)を決定します。利点:...
マージャンVenema氏

8

してはいけません。

言い換えさせてください。ビューからロジックを分離するアーキテクチャを使用する必要があります。モデルに必ずしも適合しないロジックが必要な場合(たとえば、URLチャンクを解析するツリートラバーサルなど)、コントローラー(MVCなど)を使用するアーキテクチャを使用する必要があります。

CIとYiiから来て、専用のコントローラーを持つことは本当にクールなアイデアだと思いました。ただし、適切なRESTfulインターフェースを備えたアプリケーションを開発する場合、モデル固有でないロジックを処理するコントローラーの必要性は少なくなるようです。したがって、Djangoに移動してからPyramid(どちらもMVCアーキテクチャに完全に準拠していない)に移行すると、コントローラーは実際に作成中のアプリケーションに必要なコンポーネントではないことがわかりました。どちらのフレームワークにもPyramidでのURLディスパッチなどの「コントローラーっぽい」機能がありますが、これは設定の問題であり、ランタイムの問題ではありません(YiiのCControllerなど)。

結局のところ、本当に重要なのは、ビューをロジックから分離することです。これにより、実装の面で問題が解決されるだけでなく、FE / BEエンジニアが並行して作業できるようになります(チーム環境で作業する場合)。

(サイドノート:私は専門的にウェブアプリを開発していませんので、欠けているものがあるかもしれません)


私は完全に同意します、良い答えです。コントローラーは常に必要なわけではなく、ビューがモデルと通信するための戦略としてのみ意味されます。
ファルコン

@ファルコン:それは私の混乱です。私は、ビューがコントローラーとまったく対話すべきではないと言う人を複数見ました。それがモデルにだけ話すべきこと...
ビリーONeal

1
実際のMVC実装を使用している場合、ビューコントローラー(またはそのモデル)と通信しません。コントローラーは、モデルの状態を設定し、ビューのデータを準備して、ビューにプッシュします。
デミアンブレヒト

@Demian:その逆を聞いたことがあります(コントローラーは事実上何もしないはずです)。しばしば。これがこのパターンの最大の問題です。それが何であるかについて誰も同意しないようです。
ビリーONeal

3
うん、部屋に10人のプログラマーがいる場合、MVCとは何かについて9つの異なる定義が得られるとよく​​耳にします。本当に重要なのは、懸念の分離です。他に何が起こっているかは、宗教的な議論のようです。
デミアンブレヒト

1

はい、これに関する用語は混乱です。言葉で誰かが何を意味しているのか決して理解できないので、話すのは難しいです。

別のコントローラーを使用する理由については、その理由は、どのバージョンのコントローラーについて話しているかによって異なります。

テストを実行すると、ビューには、作成しておらず、おそらくテストしたくないウィジェットが多数あるため、コントローラーが必要になる場合があります。はい、実装を継承から分離したので、スタブまたはモックを使用して他のものをテストできますが、具体的なビュー自体をテストする場合は難しくなります。同じコードを実行するウィジェットを持たないコントローラーがあれば、それを直接テストすることができ、スクリプトでウィジェットをテストする必要はないかもしれません。

他のバージョンは、具体的な利点を示すのがより困難です。私はそれはほとんど懸念事項の分離の問題だと思います-GUIに適用されるがビジネスモデルの一部ではないロジックから純粋な視覚GUI懸念を分離します(たとえば、ウィジェットの表示すべきモデルからの更新を変換します)。しかし実際には、2つのクラスは非常に密に結合されているため(インターフェイスを介して通信する場合でも)、ビューにマージすることに過度に動揺することは難しく、機能がより再利用可能になる方法に注意してくださいそれらが分割された場合。


0

簡単に言えば、懸念の分離。物事の「正しい」方法、よりクリーンなコードなどについてのすべての話とは別に、MVCを使用するとコードをより簡単に再利用できると言えます。基本的に、モデルとコントローラーをプログラムし、Webアプリ、デスクアプリ、サービスなど、どこでも多くの労力をかけずにそれらを使用できます。


2
UIレイヤーと機能レイヤーを単に定義することと同じです。コントローラビットが必要な理由については説明していません。
ビリーONeal

-3

まあ、MVC構造を使用する基本的な理由は、単一の作業プロセス、単一のモデルを使用して任意のアプリケーションを開発する業界の設定に現れます。そのため、プロジェクトが組織のあるモジュールから別のモジュールに移動する場合、作業シナリオをよりよく理解するのがはるかに簡単です。作業の明快さが組み込まれています。
個人はアプリケーションに対して異なるアプローチをとるので、アソシエイトと組み合わせて作業する場合、まず2人(あなたとあなたのアソシエイト)が共通に合意したモデルについて話し合って着地します。そしてそのような場合、それはあなたとあなたの同僚にそれぞれ割り当てられた責任を明確なマージンで分けます。


-3

MVCは、マネージャーである理論家によって単なる流行語として使用されていると思います。ただし、HTML5が普及しているレスポンシブデザインを使用したWebの現在の反復、およびWebとiPhoneで機能するデータベースプログラミングの単一行を作成しようとすることは、MVCの一般的なアイデアに役立ちます。Webフロントエンドテクノロジーは文字どおり、CSSコントロールの新しい反復であるJqueryで文字通り光の速度で動いていますが、サーバー側のものはカタツムリのペースで動いています。

最終的に、サーバー上のすべてのものは、フロントエンドにデータを送り込むサービスまたは「アプレット」になり、使用しているクライアントの種類に応じて、データの消費と表示が異なります。その意味で、MVCは理にかなっています。

この点で、私は現在の現実の世界では、MVVMは実際にはコントローラーよりも優れた「パターン」またはそれを呼び出すものであると考えています。 。MVVMパターンでは、ViewModelはビューを即座に更新できます。さらに、MVVMモデルはRESTfulデザインプリンシパルIMHOを促進します。


これは単にあなたの意見ですか、それとも何らかの形でバックアップできますか?
ブヨ

3
(ダウン投票しませんでした)さて、もしそうなら、今から40年以上もの間流行している流行語です。
ビリーONeal

2
MVCパターンの起源と、MVPやMVVMなどのMVCパターンが生み出した追加パターンについて、さらに調査することをお勧めします。パターンには、現在の流行語があなたを信じさせるよりもはるかに多くの歴史があります。

1
モデル・ビュー・コントローラの歴史:「MVCは明らかにトリグヴェReenskaugにより、70年代にゼロックスパークで発明された私は信じて、その最初の公共の外観は、Smalltalkの-80にあった長い時間のためにも、Smalltalkの中で、MVCについての事実上の公開情報はありませんでした。 -80ドキュメンテーションMVCで最初に発行された重要な論文は、JournalOfObjectOrientedProgrammingの1988年8月/ 9月号に発行されたGlenn KrasnerとStephen Popeによる「SmalltalkでのModel-View-Controllerユーザーインターフェイスパラダイムを使用するためのクックブック-80」でした(JOOP)。」

KISSのようなもっと重要な流行語がたくさんありますが、それらはより長く存在し、注目を集めています。
マイケルバーバー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.