MVCのMはどこにありますか?


14

アプリケーションをMVCにリファクタリングしようとしていますが、Mの部分にこだわっています。

データベース対応のアプリでは、モデルはアプリのコードに実装されますよね?

しかし、その後、データベースには何がありますか?それはモデルではありませんか?

(データベースを単純なオブジェクトストアとして使用していません。DB内のデータはエンタープライズ資産です)。


I'm not using the database as a simple object store。それは、ストアドプロシージャの形式で、データベース内のいくつかのビジネスロジックを意味すると推測しています。理論的にはMVCに反しますが、実際には問題ではありません。
ヤニス

@YannisRizos- DB に BL があります、それが意味することは、DB内のデータにアプリケーションを超えた生命と意味を持たせたいということです。

3
I want the data in the DB to have a life and meaning beyond the application.何?
ヤニス

2
@YannisRizos-私は間違いなくその声明をリファクタリングする助けをいただければ幸いです。データは企業資産ですよね?アプリに属していないため、他のアプリからのデータを再利用するのが非常に困難な場合、アプリがアプリを非常に簡単にするクレイジーな非正規化モデルを作成することはできません。助言がありますか?

1
共有する必要がある既存の形式がある場合、それは問題になりません。それは、ストレージ形式の要件の一部になります。将来、別の形式でそれを必要とするものはすべて、ETLタスクを持つか、DALで変換することができます。
StuperUser

回答:


46

ええ、コードとデータベースの両方のモデルが「モデル」です。

モデルはアプリケーションの「IS」と関係があり、コントローラーは「行う」ことです。データベースへの直接永続性を扱うコードはすべてモデルと見なされます。

注: MVCはパターンですので、考えすぎないでください。MVCを適切に実行するのは簡単ですが、結局のところ、それは単なる考え方です!それはあなたのビジネスロジックをデータベースとUIから締め出すことを意味します-それだけです。MVCの前は、サーバー上にある必要があるときにビジネスロジックをWebページにすべて表示するか、データベース内で多数のスクリプトを実行して、永続性コードとともにビジネスロジックを実行していました。MVCは、コードを再利用可能にする方法で人々が考え始めるようにするためにもたらされました。


15
それで、CとVの観点から、データベースがあるということは、Mの実装の詳細にすぎませんか?

間違いなく。素敵なフレーズ。
ハービー

3
@MattFenwick CとVの観点からは、データベースはありません。データベースをデータストレージ以上のものとして使用しています。MVCの用語では、データベースはデータストレージにすぎません。しかし、それがあなたのアプリケーションに合っていれば、それはまったく問題ありません。
ヤンニス

5
「MVCを考えすぎない」ための+1
ハビエル

2
「データベースとUIからビジネスロジックを保持する」-これ
デビッドマードック

17

Trygve Reenskaugは、1978年にMVCパターンを説明した最初の論文を書きました。彼の説明のモデルは、実世界のオブジェクト、現象、および概念を表すオブジェクトモデルでした。データベースを使用したアプリケーションのシナリオでは、モデルはデータの投影です。簡単に言えば、モデルはアプリケーションが関係するクラスとその関係です。

実際には、通常、MVCで使用される2つのモデル、ドメインモデル(データベースへのマッピング)とアプリケーションモデル(今日の用語ではビューモデルとも呼ばれます)があります。アプリケーションモデルは、ドメインモデルの投影であり、ビューをレンダリングするためのビュー固有のデータも含まれています。このアプローチはMMVCと呼ばれます。コントローラーはドメインモデルと直接対話し、アプリケーションモデルをビューに提示します。MVVMパターンでは、アプリケーションモデルとコントローラーが組み合わされています。


+1:この回答が一番気に入っています。The model is a projection of your data.データベースは、アクセスとインデックス作成のために最も効率的な方法でデータを保存するように設計されています。代わりに、ビジネスドメインを中心にモデルを設計する必要があります。
ジョエルイーサートン

解析するのに少しかかりましたthe Domain Model (what's mapping to your database)。いい答え!

2
+1これは、MVCが進化したさまざまなフレーバーの優れた説明です。
ライアンヘイズ

みんなありがとう。私は自分の本を書いている間、このことを深く掘り下げてきました。それは理にかなってうれしい!
マイケルブラウン

3
  1. MVC用のデータベースは必要ありません。あなたのモデルがたまたまデータベースと通信するのであれば、それは素晴らしいことです。また、それ自体をフラットファイルに保持することも、まったく保持しないこともできます。

  2. モデルは、アプリケーションのメモリにデータが保存される場所です。また、モデルを使用して、データの計算と検証を行うこともできます。たとえば、金利、期間、原則などのプロパティを持つFinancePaymentモデルがあるとします。getMonthlyPayment()メソッドをモデルに追加して、毎月の支払いを計算できます。コントローラーやビューでそれをしたくないでしょう。

  3. ビューは、ロジックをまったく持たないか、単純なデータバインディングのみを使用して合理的に愚かである必要があります(Martin Fowlerのサイトのパッシブビューと監視コントローラーパターンを参照)。ビューは、ユーザーがボタンをクリックするなどの操作を行うとイベントを発生させます。

  4. コントローラーは、イベントの処理(ユーザーが[保存]ボタンをクリックしたときにコードを実行)、モデルプロパティの設定、およびモデルのロードと保存(永続性を使用する場合)の実行を担当します。コントローラーは、モデルのデータに対して計算を行ってはなりません。ただし、コントローラーでは、「if model.profit()<0 then widget.colour = 'red'」など、ビューに代わっていくつかの計算を行う場合があります

  5. モデルを変更せずに、モデルの機能を失うことなく、アプリケーションのコマンドラインバージョンに切り替えることができるはずです。

a。ビューを切り替えるだけで(コントローラーやモデルではなく)、モバイル版のアプリケーション(デスクトップ版ではなく)に切り替えることができるはずです。GUIテストフレームワークがなくても、モデルとコントローラーを単体テストできる必要があります。


右に!これは非常に明確です。

2

モデルは、フロントエンドでVおよびCに接続し、バックエンドで永続ストレージ(ファイルからSQL / NoSQLデータベースに至るまで)に接続するコードです。dbからロードしてdbに保存するコード(モデルの誤解の1つ)だけでなく、実際にすべての「ドメイン」作業を行うコードです-選択、フィルタリング、変更、計算、決定データ。アプリケーションのすべての非UIロジックが含まれます。


永続化する生データ。モデルに最適な組織。モデルは、アプリケーションロジックをライブにするAPIです。そのデータベースは、(生きていない)データのストレージです。あなたのアプリが可能であれば(どの種類のアプリなのかわかりません)、「データベースを利用したアプリ」ではなく、データベースを方法として使用する「アプリ」と考えてください。モジュールデータを永続化します。多くの問題は、データベースの「アイコン化」に起因します。これは、モデルのデータストレージにすぎません。役立つ場合は、それを捨てたり、再構築したり、交換したりできます。
ハービー

(DBのデータが他のアプリケーションと共有されていない場合、上記のシナリオのためにのみ保持)

私はコメントの中で単語の選択が貧弱であることをおizeびします。MVCに関して、データベースに何が入っているかわからないということでした。データベースはMVCの外部にありますか?モデルの一部ですか?それはVまたはCの一部ですか(おそらくそうではありませんが、あなたはポイントを得ます)。

そうですか。モデルのコードが処理するアプリケーションデータを永続化するのに役立つモデルの一部であることがわかります。(編集を参照):そのデータベースがアプリケーションよりも長持ちする必要があるものである場合は、データベースを外部サービスとして見て、どのモデルと通信し、計算のためにデータを取得し、一部を返送する必要があります。
ハービー

極端な場合、ビジネスロジックがDB自体にある場合、ほとんどがDBにリレーする非常に薄いモデルを持つことも、db モデルであると言うこともできます(ただし、すべてのロジックが必要です)。
ハービー

2

非常に単純で理想的な見方をします。

モデルは通常、データのモデルとしてではなく、ドメイン(おおまかに言ってビジネス)のモデルと見なされます。これら似ているように見えますが、互いに完全に結び付けられているわけではありません。

ビューはアプリケーションフロントエンドのモデルであり、コントローラーはあるビューから別のビューへのフローのモデルである必要があります。

データベースであろうとコードであろうと、ビジネスロジックはモデルに完全にカプセル化する必要があります。いくつかのビジネスロジックはビューまたはコントローラーで繰り返される場合がありますが、さまざまな理由で、これら2つのコンポーネントを完全に削除し、別のフロントエンドをその場所に配置することが可能(かつ安全)です。


1

私の理解では、MVCはクライアントアプリケーションのアーキテクチャパターンの単なる説明です。ウィキペディアの写真はこれを示しています。

http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

もちろん、アプリケーションの一部が「ストアドプロシージャ」に実装されている場合、それらのデータベースコードはモデルの一部である場合も、コントローラーの一部である場合もあります(コードの機能によって異なります)。しかし、そうでない場合、データベースは明らかに「MVCの外部」にあります。


1
But then, what is in the database -- is that not also the model?

いいえそうではありません。モデルは、アプリケーションドメインの動作とデータを管理します」。多くの場合、モデルはデータベースにフックしますが、それは決して要件ではありません。モデルは、アプリケーションとデータベースの間の新しいレイヤーです。バックエンドは、一連のMockオブジェクト、XML、またはデータの永続性をサポートするその他のものです。

レイヤーを分離することにより、より優れた単体テスト手法を使用するための柔軟性が大幅に向上し、コードの管理が容易になります(EG SQLはOracleに置き換わります)。

同じことがコントローラーにも当てはまります。MVCは、コントローラーを2つのレイヤー間の仲介者として定義します。MVCには「ビジネスレイヤー」は定義されていません。むしろ、独自に追加します。MVCは、ほとんどのアプリケーションの構築に必要なすべてのレイヤーをカプセル化しません。これは、基本構造の一般的なガイドラインにすぎません。

これらの分離は、制御の反転を機能させるための鍵です。


+1で非常に有益な回答が得られます。ただし、最後の文は説明に値することをお勧めします。IoCは必ずしもそれほど広く知られ理解されているわけではないので、少し混乱を招くかもしれません。それが意味することの本当に有益な説明は、おそらく正気のSEの答えの範囲をはるかに超えていますが、それは私に飛び出しました。
アダムクロスランド

ただし、ビジネスロジックをストアドプロシージャに配置する場合は、データベースにモデルが含まれます。(個人的には、このアプローチはお勧めしません。)
ロイティンカー

1
@Roy Tinker-いいえ、それは問題ではありません。モデルは概念的に分離されています。レイヤー内のどこかにデータベースと統合するエンティティがあります。これらのエンティティは、他の関係を持つモデル内に存在する他のエンティティ(たとえば、モック)から切り離されたままにする必要があります。コントローラーは、データがどのように、どこから来たかを知らないような方法でモデルを呼び出す必要があります。むしろ、この決定は、依存性注入とIoC(基本的に、異なるバックエンド、モッキング、またはDBに結び付けることができるインターフェース)を使用して行う必要があります。
P.Brian.Mackey

1

データベースは、モデルの実装の詳細です。モデルは完全なドメインモデルであり、データとプロセスを結合する必要があります。分離は、プロセスとそのプロセスに関連するデータとの間ではなく、差異の懸念の間でなければなりません。

参照:http : //martinfowler.com/bliki/AnemicDomainModel.html


0

実際には非常に単純で、「モデル」はデータインターフェイスの抽象化を表します。それが理由です:

  • データベースは Modelの一部と見なされますが、モデル自体ではありません
  • モデルの データは、データベース、ファイル、Webサービスから取得することも、偽装することもできます。
  • MVC、HMVC、または同様のフレームワークのモデルクラスにクエリを格納する必要があります(「脂肪モデル、スキニーコントローラー」の原則[ 1 ] [ 2 ] [ 3 ]を参照)

そして、もし私が正しいなら、だれかがMVCコンテキスト外のモデルを参照するとき、誰かがデータ構造スキーマなど)を参照する可能性が高いのはそのためです。


0

Mにはいくつかのロジックが含まれており、データをDBに保存すると思います。コントローラーはどのモジュールを実行するかを呼び出し、このモジュールはロジックを実行し、DBにデータを保存します(永続レイヤーがある場合があります)。その後、このモジュールはVに値を返します。


0

MVCのM(odel)はモデルをキャプチャする必要がありますは、ビジネス/ドメインのを1か所でます。

理想的にはビジネスルールを含める必要があります、ドメインのとその構造をがあります。

C(コントローラー)は、理想的には、ビジネスモデルの情報をプレゼンテーション(ビューなど)に仲介し、V(iew)からユーザー入力を取得してモデルの状態の変更を開始することのみに関与します。

データベース層は、特定の時点でのモデルの状態の永続性のみを処理します(むしろ処理するだけです)。

そのようなものとして、それは何かない属するいずれかにモデル又はコントローラ MVCパターンの一部ではなく、それは、ファサードの関数として(透過モデルに変更を永続化することによって暗黙的に実現することができる完全に独立した懸念が提供されコントローラーへのモデルとの相互作用)、または頻繁に行われるように、モデルに変更を加えた後にコントローラーによって明示的に呼び出されます。


0

理想的な世界のモデルには、ビジネスロジックのみを含める必要があり、家などの実際のオブジェクトをモデル化します。ただし、ほぼすべての状況で、モデルはデータを何らかのストレージに保持する必要があります。

モデルと保存されたデータとの相互作用は、別のデータレイヤーで発生するか、モデル内で直接発生します。これは、ORM(Object Relational Mapper)を使用する場合です。言い換えると、モデルはデータベースに直接接続するか、データベースに接続する他の「データアクセス」オブジェクトにデータを渡します。

ORM(オブジェクトリレーションマッパー)は、データベーステーブルのフィールドをモデルオブジェクトの属性にマップし、ゲッターとセッターを提供します。この場合、独立したデータレイヤーはなく、モデルはそのデータの永続化に直接責任を負います。

以下は、ActiveRecord人気のあるORM を使用したRubyの例です。

class House < ActiveRecord::Base
end

house = House.new
house.price = 120000
house.save

Priceオブジェクトにゲッターとセッターを追加するhouses自動検出されるテーブル内のフィールドActiveRecordです。いつsaveに呼び出され、価格属性の値は、データベースに永続化されます。

私の観点から見ると、データ層を持つことの長所は、モデルに到達する前にデータを操作できるポイントを得ることです。モデルは心配が少なく、責任が少なくなります。たとえば、互換性のない複数のデータソースからのデータを結合する必要がある場合、これはORMで簡単に処理できないものです。

主な短所は、管理するもう1つの抽象化層であり、不要な場合は気にせず、シンプルに保ちます。可動部品が少なく、誤作動が少ない。


-1

はい、あなたは正しいです。

(モデルビューコントローラー)

データ(モデル)をユーザーインターフェイス(ビュー)および処理(コントローラー)から分離するアプリケーションを構築するためのアーキテクチャ

実際には、MVCビューとコントローラーは密接に関連しているため、多くの場合、単一のオブジェクトに結合されます。MSDNによると

コントローラーは、ユーザーからのマウスとキーボードの入力を解釈し、モデルに通知したり、 the view to change as appropriate.

この図を確認してください。

ここに画像の説明を入力してください

たとえば、コントローラーコードはデータの要求を検証し、それをビューに返します。View-Controllerオブジェクトは1つのモデルのみに関連付けられています。しかしながら、a model can have many view-controller objects associated with it.


4
In practice, MVC views and controllers are often combined into a single object because they are closely related.あなたはそれをやっている場合、あなたは間違ってそれをやっている...
ヤニス

図はどこから来ましたか?そして、その定義はどこから来たのですか?適切な属性なしに、インターネットから貼り付けたものだけをコピーしないでください。
ヤニス

@Yannis Rizos-彼はMSドキュメントを引用しています。ここでは少し文脈から外れていますが、非Webアプリケーションにはビュー/コントローラーの結合があることが多いと言っていますが、Webアプリケーションには非常に明確な区別があります。これはおそらく、MSがWindowsアプリ(MVVM)にMVCをプッシュするのを見るのではなく、単にWebアプリを表示する理由の1つです。 msdn.microsoft.com/en-us/library/ff649643.aspx
P.Brian.Mackey

1
@ P.Brian.Mackey私は、MSが何らかの形でこれに遅れていると疑っていました:P
yannis

回答を編集して、提供された@ P.Brian.Mackeyのリンクを含めました。外部ソースを引用することはまったく問題ありませんが、それらへのリンクを含める必要があります。また、MVVMはMVCと非常によく似ていますが、同じパターンではありません。MVCでのビューとコントローラが1つのオブジェクトに結合してはいけません...
ヤニス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.