1

単語推測ゲームの作業コードがいくつかあります。しかし、デザインルール、特にMVCパターンを制限するものではないのではないかと心配しています. 添付画像はGUI現在の私のものです。オブジェクトをあるクラスから別のクラスに放り込んでいますが、それはスタイルが悪いと聞きます。MVC私はそれに同意しますが、単語推測ゲームや一般的に呼ばれるハングマンの適切なパターンアプローチを思いつくことができません. メイン アプリケーションには次のようなものがあります。

public class Application {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                runApp();
            }

        });
    }

    public static void runApp() {
        Model model = new Model();
        View view = new View(model); //not sure if this correct, some suggest it is valid and some not

        Controller controller = new Controller(view, model);
    }

}

これにどのようにアプローチしますか?添付のGUI写真に見られるのはViewクラスです。これには、すべてのJButtons, Textfield, borders, labelsetc.actionlistenersが含まJButtonsViewます。

controllerを に渡しeventsますmodel。たとえば、一部letter buttonsがクリックされた場合、文字「A」をクリックするmodel と、更新のmodel指示が送信されるか、直接更新されます。パターンについての私の理解では、クラスは および とは別に実装およびテストする必要があります。ここでこれを達成する方法がわかりません。完全なコードが利用可能です。MVC パターンに限定するためにリファクタリングする必要があります。あなたの提案を親切に伝えてください。controllerviewviewMVCmodelviewcontrollerここに画像の説明を入力

4

4 に答える 4

2

編集: MVC (私が作成した netbeans プロジェクト) の作業例は、こちらからダウンロードするか、こちらからダウンロードしてください。netbeans を知らない人: dist は実行可能な .jar ファイルで、src はソースです。2 つの異なるビューで MVC パターンを示しています。左側では、左または右クリックして円または正方形を作成できます。右側では、これらの正方形と円を表で見ることができます。テーブル内の正方形または円の値 (サイズや位置など) を変更すると、モデルに更新されてビューが更新されるため、左側でその正方形または円がどのように移動またはサイズ変更されたかを確認できます。

あなたは良いアプローチをしていますが、間違っていることはほとんどありません。これは MVC の基本的でシンプルなモデルです:

ここに画像の説明を入力

ここでわかるように、 はmodelに何も送信しませんcontroller

MVCアプリケーションを構築するには?メイバイは、model. にはmodel、入出力処理以外のすべてが含まれている必要があります。すべてのデータ、すべてのロジック。

したがって、コントローラー、ビュー、モデルの 3 つの主要なクラスが必要です。

たとえば、各ヒットでフォームの中央に「A」の文字を1つ追加するボタンでフォームを作成するだけです。

Viewクラスには、update「A」文字の数をフォームに描画および/または再描画するメソッドがあります。

ボタンを押すと、メソッドにジャンプしますbuttonClicked。これはコントローラーのメソッドを呼び出し、そのコントローラーに何が起こったかを伝えます。コントローラーはそれを確認し、モデル内のデータを操作します (この例ではメソッドを呼び出しますaddA)。この後、モデルは自分が変更されたことを認識する必要があるため、接続されたビュー クラスで更新メソッドを呼び出し、フォームの中央に印刷された "A" のカウントを再描画します。

添加

1 つのモデルに対して複数のビューを使用できます。もう 1 つのビューを追加できます。フォームの左上隅に、使用された「A」の数が表示されます。モデルは、ビューだけでなくビューのリストを持つことができ、変更されると、それらすべてを更新するだけです。

疑似コード

public class Application {
    private Model model = new Model();
    private Controller controller = new Controller();
    private View view = new View();

    public Application(){
        model.registerView(view);
        controller.registerModel(model);
        view.registerController(controller);
    }
}
于 2013-10-24T01:25:04.020 に答える
2

あなたが混乱している分野の1つは「責任」だと思います。各コンポーネントが何を担当し、実際に何ができるか。

問題は、プログラムの周りにオブジェクトを渡していることではなく、渡しているオブジェクトが、受信者がビジネスを知らない、または操作を許可する必要があるアプリケーションの部分を公開していることです。

つまり、ボタンがクリックされたときに「推測」パネルが検出できるようにするために、「ボタン」パネルを「推測」パネルに渡す場合、 「ボタン」パネルを、実際に表示する権利のないアプリケーションの領域に移動します。

「推測」パネルがコンポーネントを削除するのを妨げているのは何ですか? 何もない...

代わりにinterfaces、アプリケーションの各部分でできることとできないこと、およびどの情報を利用できるかを判断するために、 which を使用する必要があります。

ここでモデルの出番です。モデルは、利用可能な情報、アクセス方法、およびモデルが変更されたことを関係者に通知するためにトリガーされるイベントを決定します。

例えば。「ボタン」パネルは、ユーザーが別の推測を行ったことをモデルに伝えます (ユーザーがボタンを押したことに応答して)。次に、モデルはイベントを発生させ、変更が発生したことを「推測」パネルに通知します。「推測」パネルは、それに応じて状態を更新し、モデルの現在の状態を表すために必要な情報をモデルに要求します (責任がある限り)。

あなたは見てみることができます

さて、MCV パターンでは、ビューはモデルを見ることができなければならず、コントローラーはビューとモデルを見ることができなければならず、モデルは気にしません。

コントローラーは、モデルに渡すビューへの変更 (つまり、ユーザーの操作) をリッスンしています。モデルはその状態の変更に関する通知を発行し、ビューは必要に応じて自身を更新することでそれらの変更に応答します。

たとえば、「ボタン」パネルのボタンをクリックします。「ボタン」パネルのコントローラーはこのイベントを (おそらく を介してActionListener) 検出し、このアクションを処理してモデルを更新します。

モデルは内部状態を更新し、何らかのイベントを発生させます。

「推測」パネルは、モデルのこの変更を (ある種のリスナーを介して) 検出し、それに応じてビューを更新します (モデルによって指示されたように推測と画像を更新します)。

ここで、Swing は純粋な MCV パターンを使用しないことを思い出してください。そのコントロール (つまりボタン) はコントローラーとビューの両方であるため、これらをいじるときは注意してください...

HangManModel interfaceたとえば、推測、「秘密」の単語、おそらく間違った推測の数、ゲームの状態 (勝敗) など、公開するすべてのプロパティを定義する から始めます。

また、モデルに登録できるリスナーも定義します。これは、このモデルが生成できるイベントを記述します。たとえば、独自のニーズに基づいて、 a またはPropertyChangeListeneraまたは 独自に定義することもできます...ChangeListener

public interface HangManModel {

    public void addGuess(char guess);

    public char[] getGuesses();
    public String getSecretWord();
    public int getState(); // running, win or lose

    public void addChangeListener(ChangeListener listener);
    public void removeChangeListener(ChangeListener listener);

}

これは単なる例です。個人的には、秘密の言葉を隠して、それに関するプロパティを公開することに気を散らすかもしれません (たとえば、長さなど)。また、秘密の単語のセッターを提供して、モデルをリセットすることもできます...

これはアプリケーションの「心臓部」を表し、これを中心にビューとコントローラーを構築します。

于 2013-10-24T03:02:43.283 に答える
1

興味深い質問です...デスクトップ アプリで使用される MVP と MVVM の設計パターンについては聞いたことがありますが、この種のアプリの MVC は見たことがありません。ただし、Spring MVC (最高の Java Web フレームワーク) をデスクトップ アプリに適用しようとしました。

  1. アプリのすべてのイベントを処理するフロント コントローラーを作成します。
  2. このコントローラーはイベントを取得し、それを EventResolver に送信します。
  3. EventResolver は、フロント コントローラーに対して「コントローラー」の役割を果たすメソッドとクラスの名前または何かを返します。
  4. フロントコントローラーがこのクラスのインスタンスを作成し、メソッドを呼び出した後。
  5. メソッド本体では、いくつかのビジネス ロジックを呼び出し、ViewResolver のモデルと ID をフロント コントローラーに返します。6 再度、フロント コントローラーが結果を分析し、適切な ViewResolver を呼び出します。

はい、これがSpring MVCの仕組みであり、私はそれをコピーしただけです)しかし、最高のものを使用しないのはなぜですか!

于 2013-10-24T01:26:05.663 に答える