MVCとn層アーキテクチャ


142

MVC(アーキテクチャパターン)とアプリケーションのn層アーキテクチャの違いは何なのでしょうか。探したのですが、簡単な説明が見つかりませんでした。私はMVCの概念について少しナイーブかもしれないので、誰かが違いを説明できればそれは素晴らしいでしょう。

乾杯

回答:


94

N層アーキテクチャーは通常、ネットワークによって分離された各層を持っています。IEのプレゼンテーションレイヤーは一部のWebサーバー上にあり、ビジネスロジックのためにネットワーク経由でバックエンドアプリサーバーと通信します。次に、ネットワーク経由でデータベースサーバーと通信します。また、アプリサーバーもいくつかのリモートサービスを呼び出します(支払い処理についてはAuthorize.netと言います)。

MVCはプログラミング設計パターンであり、コードのさまざまな部分が、一部のアプリケーションでモデル、ビュー、コントローラーを表す役割を果たします。たとえば、モデルレイヤーには、データを格納および取得するためにデータベースを呼び出す内部実装がある場合があるため、これら2つは関連しています。コントローラはウェブサーバーに常駐し、データを取得するためにリモートでアプリサーバーを呼び出します。MVCは、アプリのアーキテクチャの実装方法の詳細を抽象化します。

N層とは、実装の物理構造を単に指します。MVC設計は多くの場合N層アーキテクチャーを使用して実装されるため、これら2つは混乱することがあります。


56
N層も設計パターンです。3層システムを実行するのに3台のサーバーは必要ありません。実際、単一のファイルを使用してN層システムを実行し、概念的な概念で各層を分離することが可能です。
magallanes 2011

6
層は基本的に、プロセス間通信が通常ネットワークリンクを介して発生していることを意味します。インプロセス(同じファイル内ではもちろん)のコード設計フローが段階的な設計アプローチを構成することに同意しません。もちろんそれは私見です。「サーバー」とは、マシンが同じボックスで複数のプロセスを実行できることを意味します。そして、おそらく「localhost」ネットワーク上でさえ話すことができます。
Zak

2
説明されているすべてのフォーマットは、3層設計の例です。レイヤーと階層の違いを混同しないでください。物理マシン上で複数の層を実行できることは事実です(たとえば、ハイパーバイザーを介して大きなサーバーを分割するなど)が、ここでのポイントは、物理ネットワークホップ(TCP / IPなど)へのN層の追加です。ローカルでは、名前付きパイプを使用する方が効率的ですが、同じシステムで実行すると、メモリと処理能力が競合します。これらすべてが、プレゼンテーション、ビジネスロジックとデータアクセス、およびデータベースを異なるマシンに分離することを検討する理由です。
Zack Jannsen、2012

1
この質問を読んでいる人は、他の回答を読むことをお勧めします。この回答は不正確です
ケイサー

@magallanes、「Zak」を使用して、最初にTierとLayerの違いを明確にする必要があります。明確な説明がある非常に優れたcodeprojectの記事
Irf

42

3層設計が次のような場合:

Client <-> Middle <-> Data

MVCパターンは次のようになります。

     Middle
     ^    |
     |    v
Client <- Data

つまり:

  • 3層相当では、レイヤー間の通信は双方向であり、常に中間層を通過します。
  • 同等のMVCでは、通信は単方向です。各「レイヤー」は左側のレイヤーによって更新され、次に右側のレイヤーが更新されると言えます。「左」と「右」は単なる例示です

PS クライアントビューであり、コントローラーがミドルになります


13
MVCでは、モデルはクライアント(ビュー)と直接対話できますか?そうは思いません!
palAlaa 2011

6
@Alaa、私は同意します。それが、データの流れに言及していると思う理由です。更新:ウィキペディアをチェックインしたところ、モデルはオブザーバーを通じて(直接ではなく)ビューを操作できます。
void

1
MVCの場合:MVCアーキテクチャは三角形です。ビューはコントローラーに更新を送信し、コントローラーはモデルを更新し、ビューはモデルから直接更新されます。3層:3層アーキテクチャは、クライアント層がデータ層と直接通信しない3層モデルでは、すべての通信が中間層を通過する必要があります
ketan italiya 2013

1
ここで、Middleがコントローラーの場合、ansで説明されているように、Middle、ClientとMiddle、Data間の通信は単方向ではなく双方向です。コントローラーはデータをモデルに渡し、モデルは更新されたデータをコントローラーに返し、コントローラーはそれをブラウザーに返します。ビューを通過した後。
ドラゴン

30

これはn層アーキテクチャについて言うことです

一見すると、3つの層はMVC(Model View Controller)の概念に似ているように見えるかもしれません。ただし、トポロジ的には異なります。3層アーキテクチャーの基本的なルールは、クライアント層がデータ層と直接通信しないことです。3層モデルでは、すべての通信がミドルウェア層を通過する必要があります。概念的には、3層アーキテクチャは線形です。ただし、MVCアーキテクチャは三角形です。ビューはコントローラーに更新を送信し、コントローラーはモデルを更新し、ビューはモデルから直接更新されます。


11
良さそうに聞こえますが、「ビューがモデルから直接更新される」というのは良い考えではないと思います。Controllerを更新と挿入に使用することは意味がありませんが、選択とフィルターには使用できません。とにかく、ビューをモデルにバインドするためだけに懸念を分離するポイントはわかりません!結論-MVCは...によって作成された難読化のもう1つの例です。3層が「システムアーキテクチャ」または「アプリケーション設計」に限定されたことを思い出しません。中心的な概念は、懸念の分離です
サム

1
それはあなたが何をしているかに依存します。iOSアプリケーションのMVCアプリ(ビューをモデルから直接更新できない可能性が高い)は、Webアプリ(可能性があります)とは異なります。MVCはパラダイムであり、絶対的な方法ではありません。
Dave Kanter 2014

2
@サムは完全に同意します。直感的なコンセプトには多すぎる専門用語。
smwikipedia 2014

1
いいですね、動作しません。ウィキペディアは真実の究極の情報源ではありません
ACV

それはあなたが真実を解釈する方法であり、それはあなたの目標が何であるかに依存します
Xinus

17

唯一の類似点は、2つのパターンのダイアグラムに3つのボックスがあることです。基本的に、それらは用途が完全に異なります。事実、通常はどちらのパターンを使用するかを選択することはできませんが、両方のパターンを組み合わせて使用​​することができます。2つを比較すると、次のようになります。http//allthingscs.blogspot.com/2011/03/mvc-vs-3-tier-pattern.html


3
特にMVCは本当にUIに焦点を合わせているため、これが断然最良の答えだと思います。これは、3層設計のUI層になる可能性があります。リンクの図はこれを非常によく示しています。
Alex

5

3層アーキテクチャーの基本的なルールは、クライアント層がデータ層と直接通信しないことです。3層モデルでは、すべての通信がミドルウェア層を通過する必要があります。

それはライナーアーキテクチャです。これは、ユーザーとデータベースの間で情報を受け渡す方法の問題に対処します。MVCは三角形のアーキテクチャなので、ビューはコントローラーに更新を送信し、コントローラーはモデルを更新し、ビューはモデルから直接更新されます。これは、ユーザーインターフェイスが画面上のコンポーネントをどのように管理するかという問題に対処します。


5

@Cherry Middle wareは、MVCパターンのリクエストハンドラーまたはリダイレクターのように機能します。

MVCについて少し説明したいと思います。私によれば、Model View Controllerはこのように動作します。

  1. クライアントは、サービスを要求することによってセッションを開始します。
  2. このリクエストはコントローラーによって受信および処理されます(リクエストハンドラー、リダイレクターなど)
  3. コントローラーはリクエストの基本情報を処理し、データリクエストを満たすことができる関連モデルにリダイレクトします。
  4. モデルは、コントローラーから渡されたパラメーターに従って要求を満たし、結果をコントローラーに送り返します。(注:ここでは、真のMVCアーキテクチャでデータがクライアントに直接返されるのではなく、データがいっぱいになってコントローラーに返されることを明確にします。)
  5. コントローラは、そのデータをView(Client)に送信します。
  6. クライアントは彼の前に要求されたサービスを持っています。

それは私が知っているMVCについてのすべてです。


1
上で述べたように、MVCは三角形なので、このドキュメントで説明されているように、ビューがモデルと直接対話したり、その逆の場合があります:msdn.microsoft.com/en-us/library/ms978748.aspx
ychaouche

5

休憩してください。また、現実の問題を解決するときに、特定のパターンに制限する必要はありません。いくつかの一般原則を覚えておいてください。そのうちの1つは「懸念の分離」です


4

線形であることに加えて、ここで十分に強調されなかったもう1つの大きな違いは、N層モデルでは、Nが必ずしも3層であるとは限らないことです。ほとんどの場合、3つの層(プレゼンテーション、アプリ、データ)として実装され、中間層には2つのサブ層(ビジネスロジックとデータアクセス)があります。また、MVCのモデルには、データ操作用のデータとビジネスロジックの両方を含めることができますが、これらはn層の別々の層にあります。


3

N層アーキテクチャは、配置図を使用して定義するのが最適です。

MVCアーキテクチャは、シーケンス図を使用して最適に定義されます。

2つは同じではなく、関連もありません。2つのアーキテクチャを組み合わせることができます。多くの企業が、配備とスケーラビリティだけでなく、コードの再利用のためにもN層のアーキテクチャを作成するための手順を実行しています。

たとえば、ビジネスエンティティオブジェクトは、デスクトップアプリ、クライアント向けに公開されたウェブサービス、ウェブアプリ、またはモバイルアプリで使用する必要がある場合があります。MVCアプローチを使用するだけでは、何も再利用できません。


mvcが特定のシナリオで何も再利用しない場合、n層のアーチと比較してmvcの利点はありますか。
ドラゴン

2

結論:N層はアーキテクチャであり、MVCは設計パターンです。これらは、2つの異なるフィールドに適用される同じメタフォアです。


1

ジェリー:2つがどのように関連しているかの簡単な例を次に示します。


Tier 1-ある種のネットワークサービスまたは同様のコントローラーを介してTier 2と通信するモデルで構成され、入力の検証、計算、およびビューに関連するその他のことを処理します。もちろん、ビュー自体も含まれます。これは、デスクトップアプリのGUIや、ウェブアプリのウェブインターフェースにすることができます。


Tier 2-ある種のサービスまたはTier 1からのメッセージを受信する他の方法が含まれます。Tier1について知らない/知らないため、上からの呼び出しにのみ応答できます。単独で要求することはありません。すべてのビジネスロジックも含まれます。


層3-ドメインモデル、データベースのオブジェクト表現、およびデータベースエントリを通信および更新するためのすべてのロジックが含まれます。


1

3層モデルでは、すべての通信が中間層を通過する必要があります。概念的には、3層アーキテクチャは線形です。ただし、[model-view-controller] MVCアーキテクチャは三角形です。ビューはコントローラーに更新を送信し、コントローラーはモデルを更新し、ビューはモデルから直接更新されます。


実際にはMVCではなく、MVVMCです。MVCまたはMVVMCはプレゼンテーションレイヤーにすぎません。コントローラーはビューとBLLの間のミドルウェアにすぎないからです。これは、BLLをライブラリとして使用して、さまざまなプラットフォーム用のUIを作成できるように維持する方法です。asmxをサポートするaspx.csのようなものです。MVCはプロジェクトフォルダー内のファイルを整理するための悪い方法であると感じることがあります。すべてのコントローラーが1つのレベルにあり、サブフォルダー内のビューになるため、理解するのが少し難しいです。コントローラー用のサブフォルダーを作成することもできますが、重複して動作します。
Nithin B
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.