MVC:私のコントローラーは半分の時間、役に立たないようです。これは問題ですか?


9

多くの場合、MVCを使用してプログラムを設計すると、コントローラーが半分の時間無駄になります。

つまり、ビューで何かが発生します(ボタンのクリックなど)。次に、ビューはコントローラーに通知します。次に、コントローラーはモデルに直接委任し、何もする必要がないため、他に何もしません。

例えば:

ユーザーはボタン「カラーブルー」を押します>ビューはコントローラーに通知しますcontroller.colorBlue()>コントローラーはモデルに通知しますmodel.colorBlue()>モデルの色が何か青いです。

この例では、コントローラーは役に立たないようです。それは何も追加しません。ビューはモデルに直接話しかけたかもしれません。

ただし、残りの半分の時間は、コントローラービューとモデルの間で何らかのメディエーションを行います。

私の質問はこれです:これはMVC構造でどのくらい一般的ですか?コントローラの半分の時間が不要であるように見えるのは理にかなっていますか?それともこれは問題ですか?これは一般的ですか?私はこれにどのように取り組むべきですか?

私の質問が十分に明確でない場合は、そのように言ってください。


1
ただし、この特定の例では、RobertHarveyが示唆しているようcontroller.colorBlue()に、実際にを呼び出した方がよい場合がありますmodel.setColor(0, 0, 255);。モデルとビューを分離する1つの理由は、モデルの単一の状態を表すために複数のUI要素を使用していることが多いためです(たとえば、アイテムがメニューでチェックされ、ツールバーが押され、ポインターが塗りつぶしに変わります)アイコンはすべてモデルで現在選択されているツールフィールドに対応します)。MVC分離により、モデルはさまざまなUI要素の同期について心配する必要がありません。
リーライアン

回答:


12

ユーザーインターフェイスとモデルの間に抽象化の層を設けることの重要性を過小評価しています。コントローラーは、この機能を100%実行します。

あなたの例model.colorBlue()は少し怪しげです。実際のモデルでは、これはおそらくCRUDメソッドになります。したがって、ボタンは[Create Customer]ボタン、コントローラーメソッドはCreateCustomer()、モデルはになりますCreateCustomer()。確かに、あなたはただ通話を通過しているだけです。

しかし、モデルの動作方法を変更する必要がある場合はどうでしょうか。ビューがモデルを直接呼び出している場合、モデルを変更するとアプリケーションが壊れます。コントローラメソッドは、ビューに「アクセスポイント」を提供します。おそらくModel呼び出しをCreateCustomerWithVerification()に変更することで、コントローラーメソッドに簡単な変更を加えることができ、すべてが引き続き機能します。

同じ理由がサービス層を持っているために適用されます。モデルに単にCRUDメソッドを含めるのではなく、ビジネスアクションを用意する必要があります。このようにして、ビジネスロジックをコントローラーの外に置き、モデルをWPFアプリケーションなどの別の場所で使用できるようにします。

コントローラを「スイッチヤード」と考えてください。これは、UIとモデルの間の仲介的なリクエストである必要がありますが、コントローラーメソッドのロジックはできるだけ少なくする必要があります。


私があなたの言っていることが理解できるかどうか見てみましょう。コントローラーがモデルに直接委任している場合でも、ビューとモデルの間に1つを置くとよいでしょう。これは、モデルが変更された場合、そのメソッドを呼び出すすべてのオブジェクトを変更する必要がある場合があるためです。ビューがモデルのメソッドを呼び出すビューである場合、ビューを変更する必要があります。コントローラがメソッドを呼び出す場合、それも変更する必要があります。ただし、ビューがUIを表示する責任があるという点が異なります。これは、アプリの重要な部分です。ただし、コントローラーの唯一の責任はこれです-通信[..]
Aviv Cohn

モデルで。このため、モデルが変更されたときにコントローラーを変更し(そしてビューをそのままにして)、ビューを変更することをお勧めします。
Aviv Cohn 2014年

3
はい、その通りです。コントローラーレイヤーによって提供される分離により、UIやルーティングを壊すことなくモデルを変更できます。
Robert Harvey

そうですか。そして、念のために言っておきます。ビューは重要なロジック(UIの表示)を担当するため、モデルが変更されたときは、ビューよりもコントローラーを変更する方が適切です。理論的に変更すると、他のすべてのコードが危険にさらされます。ただし、コントローラーの唯一の目的はまさにこれであり、モデルと通信し、モデルに依存するため、ビューはそうする必要がありません。また、コントローラーには他の重要なロジックが含まれていないため、ビューを変更する必要があるよりも、モデルが変更されたときにコントローラーを変更する方が適切です。これは正確ですか?
Aviv Cohn

はい、本質的に。このようなモデルのAPIサーフェスとコントローラーメソッドへの変更を分離することで、UIからの分離を改善できます。ビューがビジネスの運用方法の変更を反映する必要がない限り、ビジネスロジックに発生する変更の結果としてビューを変更する必要はありません。別の言い方をすれば、ビューはModelオブジェクトについての知識をできるだけ少なくする必要があります。これが、ViewModels(モデルからの追加の分離を提供する)のようなものがある理由です。
Robert Harvey

-1

コーディング中は、次のように考えることができます。

  • ビューを別のもの(コンソール、サービス)に変更したり、同じコントローラーを別のビューに変更したりできますか?
  • モデルを変更して別のデータベースを処理したり、外部サービスに書き込んだりできますか?

あなたの場合、ドメインロジックをモデルに入れているようで、それを変更したい場合に問題が発生します: "model.colorBlue"のようなメソッドを新しいモデルにコピーする必要があります。

そして、「青」の定義が変わったらどうなるでしょうか?2つのモデルに変更する必要があります。また、コントローラでは、データベースに直接書き込むべきではありませんが、Lie Ryanが指摘したように、を使用する必要がありますmodel.setColor

ビューと同じです。ロジックまたは検証をビューに配置し始めた場合、ビューを変更したい場合は、そのすべての機能をコピーする必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.