3

これは悪いことなのだろうか。ビューにコントローラーを認識させて、ビューで発生するアクションなどを委任できるようにし、コントローラーにビューを認識させます(これは明らかに正しいです)が、それは双方向の関係ですか? すべての作業をコントローラーに委譲し、ビューをクリーンに保ちたいので、ビュー内のコントローラーへの参照が必要です。

これは悪い設計ですか?もしそうなら、どうすれば別の方法で同じことを達成できますか?

コントローラ:

public class Controller {

    private View view;

    public Controller() {
        view = new View(this);
    }

    public void doSomeButtonAction() {
        // More code...
    }
}

意見:

public class View implements ActionListener {

    private Controller controller;
    private Button button;

    public View(Controller controller) {
        this.controller = controller;

        // Code for initializing button reference etc.
    }

    @Override
    public void actionPerformed(ActionEvent event) {
        controller.doSomeButtonAction();
    }    
}
4

5 に答える 5

0

一般的な考え方は次のとおりです。ロジック(actionPerformed()の実装をコントローラーに配置します。ビューには、パネル内のボタンなどのウィジェットが表示されます。これは、私には「MVC」のようには見えません。 VC」、データモデルが見えます。

ここには、まだ「悪い」と呼ぶのに十分なコードがありません。

于 2013-02-28T18:47:05.490 に答える
0

特定のボタンが実行する機能の割り当ては、ビュー レベルの問題です。コントローラーはhowを提供する責任がありますが、そのボタンが何をすべきかをビューに伝えません。ビューが「これが保存操作を呼び出すボタンである」ことを「認識」していれば問題ありません。ビューの全体的な目的は、人間の入力をソフトウェア操作に変換することです!

再利用可能なコンポーネントが必要な場合は、そこに抽象化の別のレイヤーを追加できますが、ボタンが実行する操作を割り当てるコードは、貼り付ける場所に関係なく、概念的には「ビュー」の一部です。

于 2013-02-28T21:03:48.270 に答える
0

これは MVC デザインではありません。MVC は、デザイン パターンの利点を得るために、モデル、ビュー、およびコントローラーをレイヤーで分離する必要があります。

JSF を使用しているように見えるため、 View クラスと Controller クラスの両方が実際には JSF の View レイヤーの一部です。PageAction、ViewFinder、ViewFrontController などの名前に変更することをお勧めします。

于 2013-02-28T18:50:35.437 に答える
0

後で役立つ可能性があることの 1 つは、Controllerのコンストラクターで依存関係を削除することです。ビューを引数として渡すか、setter を使用します。

public class Controller {

    private View view;

    public Controller(View view) {
        this.view = view;
    }

    public void doSomeButtonAction() {
        // More code...
    }
}

このように、コントローラーはView. プログラム自体 (例: メイン) は、View必要な実装を作成し、Controller. これは、モック ビューまたはコントローラーを使用する場合のテストにも役立ちます。

ビューは、ユーザーとプログラムの対話を担当します。ユーザー入力を受け取ると、コントローラーに通知する必要があるため、それへの参照が必要です。には、そのフィールドViewのセッターも必要です。Controllerこのようにして、両方を構築し、お互いに渡すことができます。

于 2013-02-28T18:43:56.020 に答える
0

意見はさまざまですが、私はアプリケーション層の最上位クライアントになるようにモデルを設計したいと考えています。つまり、ビューやモデルによってではなく、コンテナー (アプリ サーバー + 任意のフレームワーク) によってのみ呼び出されることを意味します。わかりやすく簡潔にするために、言語レベルでコントローラー オブジェクトと直接やり取りするビュー コンポーネントを避け、代わりにプロトコルを介してコンテナーを通過させます。そのため、Web ページが Java サーブレットに追加のリクエストを提供する必要がある場合は、サーブレットを直接呼び出すのではなく、HTTP (またはその他のプロトコル) リクエストをサーバーに送信し、サーバーがそれを適切なコントローラー コンポーネントにルーティングできるようにします。このようにして、MVC のさまざまなコンポーネント間に抽象化レイヤーがあり、

したがって、私の答えは「はい」です。ビューがコントローラーに話しかけるのは悪いことです。実際、私は MVC を設計する際に制御の完全な反転に依存するのが好きです。これにより、コンポーネントは別のコンポーネントに直接アクセスせず、コンテナーによって管理される抽象化レイヤーを持ちます。

于 2013-02-28T19:20:57.640 に答える