LoginSignup
9
10

More than 5 years have passed since last update.

ViewModelがModelを生成するのは良くないと思う件

Posted at

ModelをViewModelが作成するべきか?

時々見かけるMVVMコードのサンプルで, ↓のようなものがあります.

MyViewModel.cs

public MyViewModel
{

    MyModel _Model;

    public MyViewModel()
    {
       // モデルのインスタンスを生成
       _Model = new MyModel();
    }
}

ただ, 自分的には違和感ありあり...

何が(自分的に)おかしいと感じるか

「ViewModelってModelの影な筈なのに, なんでModelがViewに依存しとんねん...」

どのような場合に問題か

異なるModel同士でやりとりしたい場合, Modelを参照するためにViewModelを作ることになります

MVVM.png

→なんでModelがViewModelに依存してるねーん

また, 例えば, バックグラウンド(=Viewが無いときに)実行するためにはWindow(=View)を作らなければなくなります.

MVVM2.png

→なんでModelが(ry

どうするか

自分が良くやるのがSingletonクラスにModelをもたせる方法

Workspace.cs(Model層)

public Workspace : Singleton
{
    public static Workspace Instance
    {
         ....
    }
    public Model MyModel {get; private set;} = new MyModel();
}

MyViewModel.cs

public class MyViewModel
{

     MyModel _Model;

     public MyViewModel()
     {
          _Model = Workspace.Instance.Model;
     }
}

もちろんVisualStudioなどのIDE上では, プロジェクトファイル(ソリューションンファイル)ごとに関心のあるWorkspaceを作るなど, Modelを正しく分割する工夫は必要です.

ViewがModelを作っても問題ない場合

シリアライズする気も他Modelとの連携もなく, Windowが出ている時だけ編集したいデータ(Viewの寿命とほぼ同じ寿命のModel)ならあまり問題ない気がします.
反論・反例あればご意見頂ければ幸いです.

9
10
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
10