MVCでは、モデルにサブビューモデルを含める必要がありますか?


8

背景:

同僚と私はMVCの解釈が異なります。つまり、同じ問題を考えると、根本的に異なる解決策が考えられます。彼はJavaのバックグラウンド出身で、MVCのすべてのコンポーネントが伝統的にオブジェクトをモデル化している可能性があります。私はHaskellのバックグラウンド出身で、OOPの経験はほとんどありません。

問題空間:

モデル化しようとしている問題は、デスクトップ環境に少し似ています。ユーザーセッション(おそらくユーザーのログイン、デスクトップの背景)とデスクトップ上のプロセス(iTunes、Finderなど)には、それぞれ独自のモデルプロパティ(最小化など)があるという概念があります。

次の点に同意します。HMVCが最も優れた表現であると考えています。Session(デスクトップ)とProcess(アプリケーション)の2つのMVCオブジェクトがあること、およびProcessの概念Sessionやバックリンクを必要としないことに同意します。

ただし、MVCの中心的な意味と、ユーザーのデスクトップ上のプロセスのリストを保持する場所にどのように影響するかについては、意見の相違があります

彼の解釈:

彼は伝統的にコードやレンダリングシステムで簡単にモデル化できる非常に有効なポイントを主張しています。彼は、プロセスのリストはProcessControllerオブジェクトのリストである必要があり、SessionControllerその中にモデルが個別のオブジェクトとして内部に含まれていると述べています。状態の、かなりの量の両方の中にあることをこれは意味SessionControllerし、SessionModelどのように関連しているSessionViewレンダリングする必要があります。

これは、簡単な検索でインターネット上で読み取ることができたものと非常に調和しているようです。

私の解釈:

私の解釈は最大のアーキテクチャ変更を必要とし、コードでの実装は難しいようですが、概念的には正しいと思います。なぜこれが当てはまらないのか、またはこの解釈と一致する別のモデル(MVCでない場合)を提示し、両方のパターンの長所と短所を強調して、最も情報に基づいた決定を下せるように誰かに説明してほしい(どちらも持っていない)ソフトウェアアーキテクチャの強力な背景)。

:私は3つの交換部品とトライアドとしてMVCを参照してくださいModelControllerView。これは、私がインターネット上で読むことができるものと一致し、一部のソースは、「同じインターフェースを持つビュー、コントローラー、およびモデルは、異なる効果に交換可能である必要がある」のようなものに沿って物事を言うでしょう。これが機能すると想像する方法は次のとおりです。

  • モデルを交換すると、データの検証または保存の方法が変わります
  • コントローラを交換すると、ページの動作が変更されますが、ページの一般的なデータコンテンツを変更する可能性があるものは変更されません
  • ビューを交換すると、ページの表示方法が変わります

このことから、私は任意の与えられたことを推論Modelし、Viewコントローラだけで行動していないページの「内容」を変更する必要があるため、唯一のコントローラはデータにページを変更しないでくださいスワッピング最初にレンダリングします。これは、鉄道システムの「駅コントローラー」としてのコントローラーの概念的な視覚化、モデルとしての鉄道の計画、および実際の物理的な外観とトラックの外観/感触(異なるフレーバーでは、「ビューとして「リアル」または「バーチャル3D」)。

ここで私たちは反対します:

でユーザーに表示されるデータSessionViewはデスクトップ上のさまざまなプロセスによって変更されるため(プロセスは関連データとしてモデル化しています)、にSessionModelはのインスタンスのリストが含まれているはずですProcessModel。つまりSessionController、同じでランダムを使用すると、SessionView概念的に同じデータ(デスクトップ上のプロセス)が表示されるはずです。

彼は、Model別のモデルについて決して知らない方がより意味があると主張しています。つまり、SessionControllerにはのリストがProcessControllerあり、各Controllerオブジェクトにはそのモデルへのリンクがあります。a SessionViewが同じSessionModelでも異なるSessionController場合、ユーザーに表示されるデータは根本的に異なるはずです。

それぞれの解釈について議論し、最も十分な情報に基づいた結果に到達するために私たちを助けてください。

御時間ありがとうございます!


1
コントローラを交換すると、コントローラメソッドが別のビューをレンダリングしたり、別のオブジェクトを返したりする場合があります。だからあなたの議論はおそらくあなたが交換しているコントローラーが特定のインターフェース/契約に適合している場合にのみ意味をなす したがって、新しいコントローラーが同じデータをビューにレンダリングするという保証はありません。コントローラーは、レンダリングまたは返すようにプログラムされているもののみをレンダリングまたは返す義務があります。
Robert Harvey

それで、レンダーへのエントリーポイントはビューではなくコントローラーであるべきです(コントローラーを引数として)?
kvanberendonck 2014

1
Haskell出身のあなたは次のことと関係があるはずです:MVCはプログラムのパーツ間の関係の抽象的なモデルにすぎないと思いますが、ビュー、モデル、またはコントローラーが果たすべき役割は、直面している問題によって異なります。同様に、カテゴリ理論はオブジェクト間の関係を形式化するのに役立つ一連のルールにすぎませんが、実際のオブジェクトをこれらのルールで使用できる厳密な定義はありません。CT自体はCTで形式化することができます。HMVCはそのアイデアの良い例です。MVC 内で MVCを使用できるためです(ただし、同じ種類の再帰ではありません)。
ディディエル14

1
物事の書き方を規定する他のルールもあります:DRY、SOLID、KISS。それらはMVCと競合しておらず、確かに(それ以上ではないが)適用されるはずです。
ディディエルク、2014

回答:


6

MVCはUIコードに適用されるSRPにすぎないため、MVCを理解する上での鍵は責任の分離にあります。表示する必要のあるデータ、その表示方法、画面イベントの処理方法を分離します。しかし、MVCの元の定義の重要な(そしてしばしば見落とされている)詳細は、MVCがはるかに細かいレベルで設計されていることです。たとえば、ButtonModel、ButtonView、およびButtonControllerオブジェクトがあり、画面上に1つのボタンを表示するだけです。この詳細が欠けていると、このテーマについて非常に多くの異なる意見が出されます。Java Swingアーキテクチャーを調べて、私の意味を確認できます。

MVCのポイントは、各責任を果たすコードを、他のコードに影響を与えることなく変更できるようにすることです。たとえば、データ表現やイベント処理ロジックに触れる必要なく、画面の(コンポーネント上の)レンダリングを切り替えることができます。したがって、ある程度、これはあなたがここで言うことと一致します。

このことから、コントローラーはページの「コンテンツ」ではなく動作のみを変更する必要があるため、モデルとビューがあれば、コントローラーのみをスワップしてもページが最初にレンダリングするデータは変更されないはずだと考えました。これは、鉄道システムの「駅コントローラー」としてのコントローラーの概念的な視覚化、モデルとしての鉄道の計画、および実際の物理的な外観とトラックの外観/感触(さまざまなフレーバーで、「ビューとして「リアル」または「バーチャル3D」)。

ただし、コンテキストでは、細分性のレベルはオフです。画面全体を担当しているように見えるSessionViewがあります。このレベルでは、MVCの意図どおりに責任が完全に分離するには結合しすぎてしまうため、十分なメリットが得られない可能性があります。

あなたの問題は、セッションとプロセスの両方で3つのUIの役割(レンダリング、データ、およびイベント処理)を分離することにあり、合計6つです。コンポーネント(画面全体)の細かさのレベルのため、これは不可能になり、思いがけない不協和音を引き起こします。

セッションとプロセスの両方のレンダリングとイベント処理の責任を分離したいのですが、それらのデータを結合します。同僚はデータを分離したいが、イベント処理を結合したいと考えています。

結局、これはSRPの問題です。私の解決策は、細分性のレベルを、セッションとプロセスを明確に区別できるレベルまで下げることです。経済学のためにそれを行うことができない場合は、トレードオフの両側に重みを付け、最悪のものを選択し、技術的負債としてサインオフする必要があります。結局のところ、これがすべての設計上の決定です。:)


あなたの時間とよく考え抜かれたコメントをありがとう。ここで考えることはたくさんあります!他の人がPOVを共有するのを妨げないように、答えを選択する前に、しばらくこのままにしておいても構いません。
kvanberendonck 14

今日私はこれについて考えていて、興味深い質問に遭遇しました:プロセスがセッションモデルにある場合、レンダリングはどのように見えるのですか?SessionViewはどのようにProcessControllerにアクセスしてProcessViewに渡すのですか?
kvanberendonck 2014

1
まあ、MVCでは、セッションをプロセスから完全に(例よりも細かく)分離するか、単一のモデル、ビュー、およびコントローラーを画面全体に作成し、セッションとプロセスを1つの大きなもの(より粗い)として扱います。問題は、オブジェクトの現在の細分性です。ここでは、物を分離しようとしますが、完全に分離することはできません。MVPやMVVMなどの他のパタ​​ーンは、画面上の小さな要素を対象とするMVCとは対照的に、「画面全体」に適しています。
MichelHenrich 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.