@shirakana

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

MVCの設計とメソッドの書き方について

オブジェクト指向およびMVCを学習する過程でオセロを作っています。

以下のようなプログラムがあるとき、ResetGameメソッド内のController.ResetGameData()はViewがControllerを直接操作してしまっている(MVCに反する)ことになるのでしょうか?

これに問題がある場合は良い設計の仕方も教えていただけるとありがたいです。

データの初期化を分離できればよかったのですが、リセットボタンを押したときに実行したい兼ね合いでこのような書き方になってしまうと思っての実装です。

※質問用に一部を抜粋しているので細かい書式は変えています。

class View
{
    private void ResetGame() //ゲームを初期化し再描画
    {
        Controller.ResetGameData();
    
        DrawLabelsText(Controller.Cells);
        DrawPlayerLabel();
        DrawStoneCount();
        DrawCanPutPoint(Controller.SearchCanPutPoint());
    }

    private void ClickResetButton(object sender, EventArgs e)
    {
        if (MessageBox.Show("最初からプレイしますか?", "リセット", MessageBoxButtons.YesNo) == DialogResult.Yes)
        {
            ResetGame();
        }
    }
}

class Controller
{
    public void ResetGameData() //ゲームの設定を初期化
    {
        Cells.InitializeCellsState(); //全てのセルの初期化 CellInfoがModel
    
        CurrentStone = CellStone.Black;
        CurrentPlayer = Player.Player1;
        PassCount = 0;
    }
}
0 likes

2Answer

そもそも何を作っているのですか? C#、MVC というキーワードからは ASP.NET MVC を想像しますが。

1Like

Comments

  1. @shirakana

    Questioner

    初学者すぎて質問の芯が分からないのですが、おそらく答えとしてはASP.NET Framework 上での開発です。
    MVCにもとづいてオセロの開発をしよう、でやっています。

  2. おそらく答えとしてはASP.NET Framework 上での開発です。

    質問のコードを拝見しましたが、ASP.NET MVC のものとは全く違います。クライアントが使うのがブラウザでなければ ASP.NET MVC ではありませんが、どうなんですか?

    前の質問者さんのスレッドに MainForm という言葉がありましたが、それから想像するに作っているのは Windows Forms アプリ? Windows Forms アプリは MVC パターンにはなじまないので、「MVCを学習する」には不適切だと思いますけど。

    WPF アプリには MVC から派生した MVVM パターンを使うためのライブラリがあって、それをベースに実装していくという話になるようですが。

  3. @shirakana

    Questioner

    Formsアプリとしての開発ですね…

    ついさきほど自分も調べている中でMVVMの考え方を知りましたが自分が設計しているものはこちらに近いような気がします。

    MVCの観点においてレビューしてみると今Controller(のつもり)として書いているものがある1つのModelとも言えるよう(コマをひっくり返すメソッドなどを含んでいる)になっているのでこれがVMに見える理由なんでしょうか?

    今の知識量では自分で判断しきれる自信が持てることはありませんが、色々と根本から疑う必要があるのかもしれませんね

  4. 上にも書きましたが、Windows Forms アプリは MVC パターンにはなじまないので、「MVCを学習する」には不適切です。それでもあえて MVC フレームワークも自力で実装してやると言ってますか?

  5. @shirakana

    Questioner

    うーん、MVCモデルを意識してクラスを設計してねとしか言われていないので…恐らくそうだと思うのですが

  6. MVCモデルを意識してクラスを設計してねとしか言われていない

    講師に意図を聞きましょう。ここで聞いてもらちが明かない(想像ベースで見当違いの話になってお互い時間の無駄になる)と思います。

  7. @shirakana

    Questioner

    ですよね…
    ただ現状はまだ自分で考えてと具体的な答えが返ってこないので待ちです…

Controllerを通さないといけない処理なら,見かけ上は最初にControllerから呼ばれるという流れで書かないとだいぶ不自然な流れになる気がします.
ASPならリンク経由でControllerがActionを処理する訳ですし.

どっちみちControllerのResetから呼ばれるであろうView.Resetの中でControllerのResetを呼ぶとかいう変なロジックになりかねません.

リセット時の処理をまとめて書きたいのは分かりますがイベントとフィードバックは区別しないとめんどいことになります.

以下リンクはASPじゃないですが参考までにこちらをお読みください.

同じようなことをデスクトップアプリでやりたいならdelegateがありますので活用してください.

1Like

Comments

  1. MAUIでMVVMやる記事があったので置いときます.よかったらこっちも参考までに.

Your answer might help someone💌