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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

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

MVVM

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

WPF

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

Q&A

解決済

3回答

13631閲覧

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

g_uo

総合スコア212

C#

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

MVVM

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

WPF

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

1グッド

3クリップ

投稿2018/01/04 07:44

質問内容

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

詳細

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

ViewViewModelModel
MainView.xamlMainViewModel.csMainModel.cs

このような感じです。

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

C#

1/* 2[現行] 3 View --- MainViewModel --- MainModel --- 機能A 4 └- 機能B 5 └- 機能C 6*/

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

C#

1/* 2[変更案] 3 View --- ViewModel --- 機能A 4 └- 機能B 5 └- 機能C 6*/

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

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

開発環境

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

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

以上

TAKAYASU👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

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

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

投稿2018/01/04 10:12

hihijiji

総合スコア4150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

g_uo

2018/01/05 00:36

ご回答ありがとうございます。 Prismは導入しているのですが、Templateは知りませんでした。。。もっと早く質問しておけばよかったです。 >「定石は学ぶよりまねろ」ですよ。 この精神でネットのHow Toを真似てみたつもりでしたが、完全に調査不足でした。 真摯に受け止め精進します。ご指摘ありがとうございます。 hihijiji様のおっしゃるように、1対1対1は実際のコーディングに存在しないと思います。であれば、ネットのサンプルもそのような方向で充実していけば、MVVMがより普及するように感じます。 よければhihijiji様のご意見を伺ってみたいです。
hihijiji

2018/01/05 03:41

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

2018/01/05 03:50

早速のお返事ありがとうございます。 大変勉強になります。 hihijiji様の取り組みを参考に、今後とも様々なインフラを学習しつつMVVM、および言語の習得に努めようと思います。 年始早々ありがとうございました。 他の皆様方も、自身のお考えがおありでしたらコメントいただければ幸いです。
guest

0

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

投稿2018/01/09 11:23

omanuke

総合スコア109

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

g_uo

2018/01/09 14:29

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

2018/01/10 09:32

ユーザーコントロールというのはボタンやエディットボックス的なものを指してますか? ここで言ってるのはもう少しそれらが組み合わさってできた画面となるものを指してます。 例えばカラムタイプのツイッタクライアントなどを例に考えてみます。 複数のカラムが表示され各々のカラムにはカラムを編集する削除するなどのボタンなりメニューがあり、入力してツイートボタンを押せばツイートできるエディットボックス的なものが常に画面下部に表示されているとします。 それらをひとつのおおきなViewModelで処理することもできますが、だったらカラムごとに一つのViewModelがあり、そのカラムを表示するViewがあり入力とツイートを処理するViewModelとそれに対応したViewがあり、それらをまとめるViewModelとそれらViewをまとめて表示する全体のViewがある方が全体の見通しがよくなりませんかね? いずれにしてもMVVMはただのドメインとビューを分割する考えであってその根本は適切に内部を分割するというだけです。 であったら、原理原則などにこだわらず、自分が必要だと思う分割をやってみてもいいのではと思います。 そうしたうえでああやっぱりこういう分割をしたら又はしなかったらこういう時に困るとかこれはやらなくていいんじゃないかとかつかめてくると思います。 場合によっては全体をまとめるViewやViewModelやそれに対応するModelなどは必要なかったりもするかもしれません
g_uo

2018/01/10 14:18

丁寧なご回答、まことにありがとうございます。 示していただいた例は、文章だけでも全体の構成が理解でき、見通しのよい構成であると感じました。 改めて考えてみて、omanuke様のご意見をWindowFormのアプリケーションに当てはめて考えると大変しっくりと理解できました。(私がWindowFormの経験がほとんどであるため) ご指摘のとおり、MVVMという概念に固執しすぎていたようです。 画面をパーツごとに分割して実装することはWindowFormでは普通に行っていたことでした。それをWPFやMVVMなどの新しい取り組みのなかで、自分の知識不足を棚に上げて情報不足を嘆いていただけだったように思います。 他の回答者様からもご指摘頂戴しておりますが、もっと学習をしっかりと行いたいと思います。 また機会がありましたらご助力のほど、よろしくお願いします。 お忙しい中ありがとうござしました。
guest

0

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

投稿2018/01/04 08:04

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

g_uo

2018/01/05 00:27

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問