質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.05%

  • C#

    5541questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • WPF

    583questions

    Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

  • MVVM

    61questions

    MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

[MVVM] ViewModelとModelは一対でなければなりませんか?

解決済

回答 3

投稿

  • 評価
  • クリップ 3
  • VIEW 489

g_uo

score 103

質問内容

MVVMではViewModelとModelは一対でなければなりませんか?
ViewModelから複数のModelを参照することはルール違反でしょうか?

詳細

MVVMの学習を行っています。
ネットにあるサンプルの場合、View - ViewModel - Model が一対となっている説明が散見されます。
ファイル構成でいうと、

View ViewModel Model
MainView.xaml MainViewModel.cs MainModel.cs

このような感じです。

私もはじめこの構成でもってプログラミングを開始したのですが、今現在MainModel.csが肥大化し続けています。
機能レベルでクラスの分割は行っておりますが、それらオブジェクトのインスタンスをMainModel.csが抱えてしまっているため、機能追加の度にMainModel.csが大きくなります。
(要するにMainModelが全ての機能をラップした神オブジェクトになってしまっている感じです。。。)

/*
[現行]
 View --- MainViewModel --- MainModel --- 機能A
                                      └- 機能B
                                      └- 機能C
*/

この肥大化をやめるため、以下のような構成を考えているのですがこれはルール違反ですか?

/*
[変更案]
 View --- ViewModel --- 機能A
                    └- 機能B
                    └- 機能C
*/

それとModelと呼ばれるクラスはクラス名に必ず"Model"をつけないといけないものなのでしょうか?

恐れ入りますがご意見頂戴できれば幸いです。よろしくお願いします。

開発環境

OS: Windows 10 (64bit)
開発言語: C#(WPF)
.Net: 4.6.1
IDE: VS 2017

※ 開発中のアプリケーションは、画面が1枚(細かいダイアログは除く)のアプリケーションです。

以上

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+3

View - ViewModel - Model が一対となっている説明が散見されます

説明しやすくするためにそうしているだけです。
1対10対100でも100対10対1でもかまいません。
と言うか、1対1対1になる事はほぼありません。
我流で作り始めるより、まずはテンプレートなりサンプルなり開いてみることをお勧めします。
「定石は学ぶよりまねろ」ですよ。
Prism Template Packがお勧めです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/05 09:36

    ご回答ありがとうございます。
    Prismは導入しているのですが、Templateは知りませんでした。。。もっと早く質問しておけばよかったです。
    >「定石は学ぶよりまねろ」ですよ。
    この精神でネットのHow Toを真似てみたつもりでしたが、完全に調査不足でした。
    真摯に受け止め精進します。ご指摘ありがとうございます。

    hihijiji様のおっしゃるように、1対1対1は実際のコーディングに存在しないと思います。であれば、ネットのサンプルもそのような方向で充実していけば、MVVMがより普及するように感じます。
    よければhihijiji様のご意見を伺ってみたいです。

    キャンセル

  • 2018/01/05 12:41

    万人に対して完璧なサンプルを作るのは不可能だと考えております。
    私の信条としましては、一つの傑作を参考にするより十の良作を、十の良作より百の凡作を参考にするようにしています。
    私自身MVVMインフラは、MVVM Light toolkit → Livet → Prism と使ってきましたが、全て傑作だとおもいます。
    MVVM Lightでは扱いやすさに感動し、Livet では開発効率の高さに感激し、Prism では完成度の高さに感銘を受けました。
    MVVMインフラを変遷したことはけして無駄ではなく、それぞれ身になったと実感しております。

    キャンセル

  • 2018/01/05 12:50

    早速のお返事ありがとうございます。
    大変勉強になります。
    hihijiji様の取り組みを参考に、今後とも様々なインフラを学習しつつMVVM、および言語の習得に努めようと思います。
    年始早々ありがとうございました。

    他の皆様方も、自身のお考えがおありでしたらコメントいただければ幸いです。

    キャンセル

+1

機能は分割すべきです。
命名規則は自由です。
サンプルの場合は読み手にわかりやすくするために Model ということを強調した名前をつけているんだと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/05 09:27

    ご回答ありがとうございます。
    Modelも分割すべきなのですね。分割する方向でリファクタリング進めます。

    キャンセル

0

補足ですが、Modelを機能で分類したら、ViewModelやViewも必要に応じて機能に応じた分類をしたほうが良い場合も多々ある気がします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/09 23:29

    omanuke様
    ご回答ありがとうございます。
    重ね重ね初歩的な質問で恐縮なのですが、Viewを分割するというのは画面をユーザーコントロールで分割していくということでしょうか?
    もし具体的な事例や、認識の違いに対するご指摘があればご教示いただけないでしょうか。
    よろしくお願いいたします。

    キャンセル

  • 2018/01/10 18:32

    ユーザーコントロールというのはボタンやエディットボックス的なものを指してますか?
    ここで言ってるのはもう少しそれらが組み合わさってできた画面となるものを指してます。
    例えばカラムタイプのツイッタクライアントなどを例に考えてみます。
    複数のカラムが表示され各々のカラムにはカラムを編集する削除するなどのボタンなりメニューがあり、入力してツイートボタンを押せばツイートできるエディットボックス的なものが常に画面下部に表示されているとします。

    それらをひとつのおおきなViewModelで処理することもできますが、だったらカラムごとに一つのViewModelがあり、そのカラムを表示するViewがあり入力とツイートを処理するViewModelとそれに対応したViewがあり、それらをまとめるViewModelとそれらViewをまとめて表示する全体のViewがある方が全体の見通しがよくなりませんかね?

    いずれにしてもMVVMはただのドメインとビューを分割する考えであってその根本は適切に内部を分割するというだけです。
    であったら、原理原則などにこだわらず、自分が必要だと思う分割をやってみてもいいのではと思います。
    そうしたうえでああやっぱりこういう分割をしたら又はしなかったらこういう時に困るとかこれはやらなくていいんじゃないかとかつかめてくると思います。
    場合によっては全体をまとめるViewやViewModelやそれに対応するModelなどは必要なかったりもするかもしれません

    キャンセル

  • 2018/01/10 23:18

    丁寧なご回答、まことにありがとうございます。
    示していただいた例は、文章だけでも全体の構成が理解でき、見通しのよい構成であると感じました。

    改めて考えてみて、omanuke様のご意見をWindowFormのアプリケーションに当てはめて考えると大変しっくりと理解できました。(私がWindowFormの経験がほとんどであるため)
    ご指摘のとおり、MVVMという概念に固執しすぎていたようです。
    画面をパーツごとに分割して実装することはWindowFormでは普通に行っていたことでした。それをWPFやMVVMなどの新しい取り組みのなかで、自分の知識不足を棚に上げて情報不足を嘆いていただけだったように思います。

    他の回答者様からもご指摘頂戴しておりますが、もっと学習をしっかりと行いたいと思います。
    また機会がありましたらご助力のほど、よろしくお願いします。
    お忙しい中ありがとうござしました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 91.05%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    5541questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • WPF

    583questions

    Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

  • MVVM

    61questions

    MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。