14

本来は長めの質問にするつもりでしたが、短くした方が意味がよくわかると思います。

  • MVC アーキテクチャ パターンには 3 つの依存関係があります。ビューはモデルによって異なります。コントローラーはビューとモデルに依存します。モデルは独立しています。

  • レイヤー アーキテクチャ パターンは、N - 1 の依存関係を定義します。ここで、N はレイヤーの数です。

モデル、ビュー、コントローラーの 3 つのレイヤーがある場合、従来の MVC の 3 つとは対照的に、依存関係は 2 つしかありません。構造は次のようになります。

View ---> Controller ---> Model

[ビューはコントローラーに依存し、コントローラーはモデルに依存します]

このスタイルは同じ目標を達成し、より疎結合を生み出すように私には思えます。このスタイルが一般的ではないのはなぜですか?それは本当に同じ目標を達成していますか?

編集: ASP.NET MVC ではなく、パターンだけです。

グリーグの投稿に関して:

  • モックに関する限り、レイヤーではコマンド プロセッサ パターンを使用して、ボタンのクリックやその他の範囲のイベントをシミュレートできます。
  • UI の変更は依然として非常に簡単で、おそらくさらに簡単です。MVC では、コントローラーとビューが噛み合う傾向があります。レイヤーは厳密な分離を作成します。両方のレイヤーはブラック ボックスであり、実装を個別に自由に変更できます。
  • コントローラーはビューに依存しません。ビューを書き込むことができ、疎結合で時間を節約できます。
4

8 に答える 8

16

インターフェイスをコントローラーから切り離して変更を容易にするためです。

また、プロジェクトを開始する必要があるが、アートワークの準備が数週間または数か月かかるシナリオも考えてみてください。待つか、ページに必要なすべてのコードを記述してから、ビューをコントローラーに接続するだけですか。

少なくともそれが私たちが行ったことであり、数か月節約できました。

また、aspx ページには何もしないコードが含まれていなかったため、UI の変更に対処しやすくなりました。

ボタンのクリックなど、何でもモックアップできたので、テストもより良くなりました。

また、asp.net-mvc フレームワークについて話している場合、aspx ファイルにコードはなく、viewstate などもありません。

于 2010-09-02T01:14:04.137 に答える
3

適切な MVC では、コントローラーはビュー afaik に依存しません。あるいは、正しく理解していないのかもしれません。

モデルはデータを定義します。

ビューは、出力がどのように見えるかを定義します。

そしてコントローラは、モデル理解文法からビュー理解文法への翻訳者です。

したがって、基本的にコントローラーは独立しています。ビューは独立しています。そして、モデルは独立しています。

はい?いいえ?

于 2010-09-02T01:14:46.780 に答える
1

私はあなたのポイントを理解していると思います:

はい、Controller を (例として PHP を使用して) Model オブジェクトを単純な配列のような非 Model オブジェクトに変換することによってのみ、View を Controller のみに依存させることができます。

すでにわかっているように、デカップリングが実際に必要でない場合、この変換を実行することは価値がある以上の労力になる可能性があります。ビューがモデル オブジェクトを使用する場合、この依存関係があります。ただし、必要な入力 (Model オブジェクトの場合もあります) を View が Controller のみに依存するようにすることで、これを少し軽減できます。

Symfony PHP フレームワークは、モデルとビューの間でこのスタイルのスキニー コントローラー シャッフルを促進します。モデル レイヤーを直接呼び出して、ビュー レイヤー内のオブジェクトを取得することはできますが、カップリングの問題が発生するため、強く反対することを強くお勧めします。ビュー内で include_component() を呼び出すことができます。これは、モデルをクエリする必要がある場合に実際にコントローラーに戻ります。

于 2010-09-02T03:18:23.607 に答える
1

主にまだ考えていたので、長い間これに戻っていませんでした。私が受け取った回答に満足できませんでした。彼らは私の質問に本当に答えてくれませんでした。

最近、ある教授が私を正しい方向に導いてくれました。基本的に、彼は私にこう言いました: モデル、ビュー、およびコントローラーを分離するレイヤーMVC です。通常の MVC アーキテクチャ パターンでは、View から Model への依存関係は使用されないことが多く、実質的には Layers になります。考え方は同じで、ネーミングが悪いだけです。

于 2010-11-03T12:16:07.433 に答える
1

私は大胆に、あなたの方法がうまくいかなかった理由を説明しようとします.

MVC パターンでは、基本的に、ビュー レイヤーとモデル レイヤーが API に同意する必要があります。一方が他方にサービスを提供し、コード内に依存関係がないため、コントローラーは一般的に動作するようになります。必要なのは、ビューレイヤーで特定の構造を取得し、モデルレイヤーで一致する API を呼び出すことだけです。

ビューとモデルの間で API について合意することは、実際にはそれほど大したことではないことに気付くでしょう。そして、バックエンドとフロントエンドの開発が適切に分離されます。

提案されたソリューションでは、コントローラー側で多くの開発が必要です。コントローラーは、ビュー内のすべての要素を理解し、それらをモデル レイヤーで必要な特定の呼び出しにマップする必要があります。コントローラーは、多くのビューを多くのモデルに接続する単一のアクセス ポイントであるため、すぐに手に負えなくなり、理解できないコントローラー モジュールになってしまう可能性があります。

Struts2 の例をいくつか見て、私の言いたいことを理解してください...

于 2010-09-02T01:41:18.447 に答える
0

もう少し追加したいのですが。まず、私の観点では、モデルを渡してビューに表示する情報のコンテナとして使用します。通常、コントローラーへのアクションメソッドはreturn view( "viewName"、model)で終了します。ビュー自体は、モデルに対するレイヤーを変更する可能性があります。

ビューで:

if(model.something == true){

%>

見せるために何か

<%

}

このpoinfでは、モデルの定義を見つけるのは困難です。

私は(特にエンタープライズconextで)2つの「モデル」と言うことができます

1つは、ドメインモデル/エンティティモデル、または表示したい情報と非表示にする必要のあるその他の情報を含む下位層(データベースなど)からのデータとビューモデルをラップする、どのように呼び出すかです。 /インターフェイスの一部を表示

コントローラはビ​​ューを調整し、ビューからは独立していますが、モデルからは少し異なります。

コントローラに

pulic actionResult Index(){

...。

if(model.BoolProperty == true){

return( "firstView);

}

そうしないと

{{

return( "secondView");

}

}

私はそれが理にかなっていることを願っています

于 2010-11-03T12:06:47.107 に答える
0

Microsoft プラットフォームでの新しい Web 開発またはエンタープライズ Web 開発のプレゼンテーション パターンを選択するのは大変な作業です。私の意見では、3 つしかありません。ビュー モデル、Model-View-Presenter (MVP)、または ASP.NET MVC (Model2 派生)。

ここで記事全文を読むことができますASP.NET MVC パターン

于 2010-09-02T08:26:02.520 に答える
-2

私の意見では、あなたのプログラムでそれを試してみた方がよいでしょう。Rails で ruby​​ を使用するか、codeigniter(php の場合) を使用できます。これらの優れたフレームワークは、MVC を理解するのに役立つ場合があります。

于 2010-09-02T01:35:53.117 に答える