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

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

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

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

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

MVVM

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

4回答

9747閲覧

MVCが理解できません

msss

総合スコア33

C#

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

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

MVVM

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

2グッド

8クリップ

投稿2017/10/10 08:52

編集2017/10/10 09:38

以下のページを読みました

##MVCのユーザアクション

MVCのユーザアクションの矢印がコントローラに向いているのは何故でしょうか。
ユーザが操作するのは画面なのでユーザアクションは必ずviewなのではないか、何故なんだ、と悩んでおります。

※例えばユーザがテキストに文字を入力した場合の動きとして、見た目上、viewにアクション(直接描画)している見えるけれど
実際は
コントローラ(Aという文字が入力されたよ)→モデル(Aという文字で状態を変更したよ)→ビュー(モデルの内容を表示するよ)
というようなことを表しているのでしょうか。

追記

以下のページも参考にしました

http://at-grandpa.hatenablog.jp/entry/2013/11/01/072636

このページによると

  • Userからの入力をControllerが受け取る
  • ControllerはModelの持っている加工メソッドを操作する
  • 加工メソッドによってModelの持つ "状態" が変わる
  • ControllerがViewに命令を送る
  • ViewはModelの "状態" を見て、その内容をディスプレイに表示する
viewはmodelの状態をディスプレイに表示する

とある為、MVCで画面に文字を入力した例で例えると

入力された文字は画面に表示されるよりも前にコントローラ経由でmodelが書き換わり、
最後にviewに反映されるという認識でよろしいでしょうか。

bochan2, ygoooo👍を押しています

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2017/10/10 08:59

あー、これややこしいですよね。自分も前におんなじような質問した気がします!
guest

回答4

0

ベストアンサー

サブミット方式のMVCと、SPAのMVVMがごっちゃになってますね。

サブミットは入力イベントを拾わずに、
入力情報をまとめてコントローラーに渡す(HTTPで送信する)のだから
コントローラーに線がいってるのは当然ですね。
他のみなさんも、「入力は関係ない」と言ってます。

SPAはイベントドリブンで実装されて、オブザーバーがビューにいるんだから、
ビューに線がいってるのは当然ですね。
Vが更新されるとVMに伝搬して、VMが更新されるとVへ伝搬されるってのが、
リアルタイムで行われてるように見えるから、この辺りがごっちゃになってるんでしょうね。

MVCでもVを変更(つまり入力)するとMに伝わって、Mを変更するとVに伝わるんですけど、
伝えるタイミングが、サブミットでのリクエストとレスポンスなだけです。

ユーザの入力(文字でなくても、オブジェクトの位置変更、色の変更、ラジオボタンのチェックも含めて)をサーバ側のmodelで状態管理したほうがよりMVCとして正しい姿ななのではないか?

これら全部サーバー側のモデルで管理してます。
でなければ、ステートレスなHTTPでどうやってビューを復元するんでしょう?

・モデルの更新をまとめて一発なのか、入力のたびにやっているか
・モデルの場所がサーバーなのかクライアントなのか
って違いでしかありません。

投稿2017/10/11 07:46

編集2017/10/11 07:55
root_jp

総合スコア4666

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

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

msss

2017/10/11 08:27

> サブミット方式のMVCと、SPAのMVVMがごっちゃになってますね。 まさしくそんな感じかもしれません。 サブミット方式を使った場合、サーバ側だけではなくフロントエンドも含めたシステム全体で見た場合、MVCとは言えないのではないか。 「viewはmodelの状態をディスプレイに表示する」が一時的にも守られていないじゃないか。 という事が言いたいのだと思います。 >>ユーザの入力(文字でなくても、オブジェクトの位置変更、色の変更、ラジオボタンのチェックも含めて)をサーバ側のmodelで状態管理したほうがよりMVCとして正しい姿ななのではないか? >これら全部サーバー側のモデルで管理してます。 私の知っているシステムでは画面でドラッグ&ドロップなどが発生したり、色の変更が行われた状態は(更新処理に必要のなさそうなもの)サーバ側では管理していない事がほとんどです。(しているものもありましたが) それはMVCのviewがmodelの状態を表示するのではなく、viewが自分で状態を保持している状態という事にならないでしょうか。 それがspaのようなフロントエンドの中で閉じるMVC(MV*)の話ならば(例えばangularのような)それはviewがmodelを参照しているという状態という話にはなると思います。
root_jp

2017/10/12 04:28 編集

>「viewはmodelの状態をディスプレイに表示する」が一時的にも守られていないじゃないか。 それはその通りです。 サブミットするまでは、サーバー上のモデルと不一致の状態です。 ただそれを言うのであればMVVMでも、 入力がされて、入力イベントが発生して、ビューモデルが更新されるまでの時間は不一致の状態なので、 やはり更新タイミングの違いでしかないと思います。 不一致の時間が長いか短いかってだけですよね。 >私の知っているシステムでは画面でドラッグ&ドロップなどが発生したり、 >色の変更が行われた状態は(更新処理に必要のなさそうなもの) >サーバ側では管理していない事がほとんどです。 これはそういう風に実装しているだけであって、 色々入力が終わった後で、サブミットした時に状態保存しておけばいいでしょう。 MVVMだったとしても、ドラッグ&ドロップや色替えのイベントを監視しないように実装すれば、 同じ状態になるわけですし。 よくあるのは、ReactやAngularを使っているのに、ビューモデルの管理外でjQueryを使って DOMをいじくり回したりすると、こういうことがおきますね。 永続化する必要がないデータであったとしても、例えば更新時にバリデーションエラーになった場合などは 再度入力画面を表示する必要があるわけですから、ドラッグ&ドロップや色替えの結果も サーバー側のプレゼンテーションモデルとして保存する必要はあります。 >viewが自分で状態を保持している状態という事にならないでしょうか。 なりますね。 ですがそれは、前述した通りMVVMでも同じです。 viewが自分で状態を保持している時間が長いか短いだけの違いです。
guest

0

コントローラ(Aという文字が入力されたよ)→モデル(Aという文字で状態を変更したよ)→ビュー(モデルの内容を表示するよ)

これはブラウザで「A」を入力後にボタンをクリックするなどしてサーバーへのリクエストをするとブラウザの再描画画面に「A」が表示される場合のことを言っているでしょうか。
それともキーボードの入力でブラウザのテキストボックスに文字が表示されることを言っているでしょうか。

MVCで画面に文字を入力した例で例えると
入力された文字は画面に表示されるよりも前にコントローラ経由でmodelが書き換わり、
最後にviewに反映されるという認識でよろしいでしょうか。

「画面への文字の入力」はMVCとは関係なく、クライアント(ブラウザ)からサーバー(コントローラー)へのリクエストにより、入力した文字をモデルに反映する必要があるのであればモデル生成時に設定し、反映が不要であれば(コントローラでの分岐にしか使わないなど)モデルに反映しないと思います。

また、入力した文字がビューに反映されない場合もありますし、カンマ編集等されて表示されるのであれば入力した文字がビューに反映されていないともいえます。

画面への文字の入力にこだわっておられるようですが、「次へ」などのボタンをクリックすることも文字を入力することも、ラジオボタンを選択することも全てブラウザに対するただの操作ではないでしょうか。

投稿2017/10/11 05:36

編集2017/10/11 06:05
workaholist

総合スコア559

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

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

msss

2017/10/11 06:22

> これはブラウザで「A」を入力後にボタンをクリックするなどしてサーバーへのリクエストをするとブラウザの再描画画面に「A」が表示される場合のことを言っているでしょうか。 文字を入力した時のことを言っています。 > 「画面への文字の入力」はMVCとは関係なく そこがわからない部分で、何故関係ないのでしょうか。 >画面への文字の入力にこだわっておられるようですが、「次へ」などのボタンをクリックすることも文字を入力することも、ラジオボタンを選択することも全てブラウザに対するただの操作ではないでしょうか。 これも、開発者、またはwebアプリがあくまでそのような仕様としているだけではないでしょうか。 作り方の問題で、ユーザの入力(文字でなくても、オブジェクトの位置変更、色の変更、ラジオボタンのチェックも含めて)をサーバ側のmodelで状態管理したほうがよりMVCとして正しい姿ななのではないか?と思っている次第です。 そして、画面から更新ボタンが押された際には、画面の情報は渡す必要はなく、サーバ側のmodelの状態から処理を行うほうがMVCぽいのではないかと思いました。(現実的かどうかは置いておいて) 回答として、それはそうだけどwebアプリケーションなのだから事あるごとにサーバにリクエストして画面を描画するのはナンセンスだし、サーバにmodelを持つ意味もないし、現実的にはサーバ側のMVCだけにとどめている。という事であれば納得できるのですが。。。
workaholist

2017/10/11 06:31 編集

MVCではなくなんでも良いのでWEBシステムを作ったことはありますか? リクエストとかレスポンスとか意味はわかりますか? (一般的な意味ではなくWEBシステムにおける)
workaholist

2017/10/11 06:44

MVCに関するWEBとか本とかではおそらく 「リクエストからレスポンスまでのMVCライフサイクル」 についてまず説明されているように思えます。 つまり、リクエストを起こす前の事はMVCと無関係と 言えると思います。 リクエストを起こす手段は  ・文字入力してボタン押してリクエスト  ・ラジオボタン選択してボタン押してリクエスト  ・入力なしでボタン押してリクエスト  ・AJaxなどでリクエスト  ・URLを直接指定してリクエスト などいくつもあります。
msss

2017/10/11 08:13

> MVCではなくなんでも良いのでWEBシステムを作ったことはありますか? あります。 > リクエストとかレスポンスとか意味はわかりますか? わかります。 > MVCに関するWEBとか本とかではおそらく > 「リクエストからレスポンスまでのMVCライフサイクル」 > についてまず説明されているように思えます。 一般的にはそうだとは思います。 リクエストを起こすタイミングも開発者次第なので、やろうと思えば全てのイベントでリクエストを送信することも可能ですよね。 もう少しシステムを大きく見たときに、画面側の変更がwebのMVCではサーバ側にあるmodelで管理されておらず、画面側で管理されているように見えるのです。
workaholist

2017/10/12 00:58 編集

「システムを大きく見たとき」の意味がよくわかりませんが、仰るレベルで画面側の変更をモデルで管理したいのであれば、入力と同時にモデルを更新すればよいのではないでしょうか。 そうしたとしても、入力→モデルへの反映までに人間にはわからないぐらいのタイムラグはありますよね?  ・キーボード入力→1文字ずつモデル反映  ・キーボード入力→テキストボックス文字列変更→モデル反映  ・キーボード入力→テキストボックス文字列変更→ボタンクリック→モデル反映 どれにしても入力→モデル反映までタイムラグはあります。 長いか短いだけの違いです。
guest

0

ASP.NET MVC の話であれれば、

MVCのユーザアクションの矢印がコントローラに向いているのは何故でしょうか。

ユーザーが要求を出す・呼び出すのは必ず Controller のアクションメソッドになるからです。ユーザーが View を呼び出すということはありません。

参考にされている記事の図は、少なくとも Model のあたりが ASP.NET MVC のものとは異なります。データを処理するのが Model となってますが、そうではないです。(その機能を持たせることはできますが、それがメインではないです)

投稿2017/10/10 09:40

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

msss

2017/10/10 09:46

「ユーザが要求を出す・呼び出すという事」というのは、文字の入力は含まれないのでしょうか。 追記させていただきましたが、mvcとは「viewはmodelの状態をディスプレイに表示する」とのことですので、文字を入力して画面に表示されるものは、まずコントローラを経由してmodelに反映させ、それをviewすなわち画面に表示するべきなのではないかということが知りたい限りです。 ※現実的にはそうじゃないかもしれませんがmvcとしてそうであるべきかどうかが知りたいです。
退会済みユーザー

退会済みユーザー

2017/10/10 10:26

> 「ユーザが要求を出す・呼び出すという事」というのは、文字の入力は含まれないのでしょうか。 ユーザー入力の有無は Model, View, Controller の役割分担の本質的なところとは何の関係もないです。 ブラウザから Controller のアクションメソッドが呼ばれると、アクションメソッドは必要に応じて Model からデータを取得し、それを View に渡し、View が html ソースをレンダリングし、その結果の html ソースを web サーバーがブラウザに送信します。 つまり、View はブラウザに送信する html ソースを生成するまでが役目です。 「ユーザが要求を出す・呼び出す」のはブラウザで、ブラウザは Controller のアクションメソッドを呼び出します。ブラウザから送信されるユーザー入力があれば、それは直接アクションメソッドに渡されます。View は何の関係もないです。
msss

2017/10/10 12:54

ユーザの入力の有無は関係ない、○○なら関係あるというのはどう判断すればよろしいのでしょうか。 ボタンクリックもユーザの入力もイベントであり、controllerのアクションメソッドが呼ばれる対象になりうると思います。 例えば 文字入力のタイミングも開発者が都度コントローラのアクションメソッドを呼んでmodelを生成してviewに返せばMVCに則ったフローになるけれども、パフォーマンスやその他もろもろを考慮してその粒度でやる必要ないよね?ということであれば納得できます。 結局何が言いたいのかというと、一時的にもviewがmodelを参照していない状態があってもそれがMVCだといえるのか、それともそういう状況はMVCとはいえないかもしれないが、現状それをMVCと呼んでいるのかということが知りたいのです。
退会済みユーザー

退会済みユーザー

2017/10/10 13:43

回答の最初に、 > ASP.NET MVC の話であれれば、 と書きました通り、自分は Web アプリの話をしてます。Web アプリなので、ブラウザに表示された時点ではサーバー側で html ソースを生成するためにメモリにロードされた Model, View, Controller のインスタンスは全てメモリから削除されるのですが、そのあたり理解してますか?
msss

2017/10/10 23:52

webアプリの話である事は理解しているつもりです。 ですので、SurferOnWww様の仰るサーバからhtmlを生成するタイミングはMVCなのはわかりますが、サーバを介さない入力や画面上の見た目が変わる操作が行われてもmodelが登場しないのはMVCの考えから外れているのでは無いか、インスタンスが削除されるのもるwebアプリの都合であって、極端に言えばセッション単位にmodelを保持して画面とmodelの状態を合わせておくのが本来の形では無いのでしょうか。(現実的かは置いておいて)
退会済みユーザー

退会済みユーザー

2017/10/11 00:50

話が噛み合ってないような気がします。そもそものあなたの質問は、 > MVCのユーザアクションの矢印がコントローラに向いているのは何故でしょうか。 だったはず。それには答えているつもりですが・・・ そこは理解したのでしょうか? そして次の質問として Model の話が出てきたのですか?
msss

2017/10/11 01:47

> > MVCのユーザアクションの矢印がコントローラに向いているのは何故でしょうか。 > だったはず。それには答えているつもりですが・・・ そこは理解したのでしょうか? webアプリケーションではサーバ側の処理をMVCで表していると理解しています。 ただ、それはアプリケーションをそのように作っているからであって、 画面で入力された値や画面の状態が常にmodelの状態を反映していない事には違わないと思うのです。 質問は最初から「viewがmodelの状態を参照していないのではないか」です。 そこでまず「MVCのユーザアクションの矢印がコントローラに向いているのは何故でしょうか。」 と質問させていただきました。 SurferOnWww様からは、webアプリケーションのMVCについての説明と、webアプリケーションではユーザの入力の有無はMVCには関係ないという事でしたので、webアプリケーションは画面表示時はMVCではあるけれど、viewがmodelを参照していないタイミングがあるという事は厳密にはMVCではないのではないでしょうか?と質問させていただきました。 分かりずらい質問で申し訳ありません。
退会済みユーザー

退会済みユーザー

2017/10/11 02:21

あなたが引用した、 > > MVCのユーザアクションの矢印がコントローラに向いているのは何故でしょうか。 > だったはず。それには答えているつもりですが・・・ そこは理解したのでしょうか? の答えがないように見えますが?
msss

2017/10/11 02:59

そのような問答をしたいわけではないので、特にないようであればご回答いただきありがとうございました。
退会済みユーザー

退会済みユーザー

2017/10/11 05:51

あなたがどこまで理解しているのか不明なので質問しているのです。それに答えない、一方的に話を止めるというのはマナー的にいかがなものでしょうか?
guest

0

https://teratail.com/questions/29574

2年近く前におんなじような質問をしてましたので、こちらも参考になさってみてください。コメント欄が参考になると思います。

投稿2017/10/10 09:04

編集2017/10/10 09:06
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

msss

2017/10/10 09:26

読ませていただき、2つ目の回答の方とのお話が特に近いように感じました。 ただ、この場合UIApplicationは自分で実装したコントローラではない為、 自分で実装するうえではやはりviewが受け、それをControllerで処理を委譲する事になる為 モヤモヤがぬぐい切れません。 また、見えないところで実はUIApplicationのようなものが動いているという話になると、MVVMの絵ではユーザアクションをviewが受け取っている為、じゃあこれはどういうこと?という疑問が浮かんできてしまいます。
退会済みユーザー

退会済みユーザー

2017/10/11 07:23

webが前提の場合はviewが入り口になるとかなのでは? 私の質問に回答下さった方の最初のコメントに「WWWブラウザのJavaScriptな環境では、ユーザーからのイベントを集中的に独占的に処理することが難しいため、MVCを適用できません。」とありますが、ブラウザ環境だとCが集約的にイベント処理できないって意味なのかなと。あんま理解出来てませんが。
退会済みユーザー

退会済みユーザー

2017/10/11 07:24

どの環境を前提にするのかで、もしかすると変わってくるのかもしれませんね。
msss

2017/10/11 08:36

特にwebにこだわるつもりはなくMVCとして~という話だったのですが、わかりやすいのでwebで話が進んでいるようです。もう少し環境を絞って質問をしたほうが良かったかもしれません。 >WWWブラウザのJavaScriptな環境では、ユーザーからのイベントを集中的に独占的に処理することが難しいため、MVCを適用できません。 確かにそうかもしれません。 逆にユーザからのイベントを集中的に独占的に処理すれば私が考えているMVCの形に近づくような気がします。 ただ、みなさんからの回答は「viewはmodelの状態をディスプレイに表示する」という考えに対して、一般的なwebのMVCはこうです。という回答が多くて考えがまとまらない次第です。
退会済みユーザー

退会済みユーザー

2017/10/11 09:12 編集

viewはmodelの状態を直接参照してディスプレイに表示しても良いし、controllerを介して単なるデータ化されたものを受け取ってディスプレイに表示しても良いってところだとは思います。iosの場合はcontrollerがmとvの間に仲介役として入るので、vはmを直接参照しません。(コントローラーが入力の入り口かは関係なく)Controllerがmediatorという役割です。https://developer.apple.com/library/content/documentation/General/Conceptual/CocoaEncyclopedia/Model-View-Controller/Model-View-Controller.html Reactなんかはobserverパターンでviewがモデルの状態の変更を監視するので、vがmを参照します。 SPAではない従来のhttpリクエストを随時行っていくステートレスなWebの場合は、サーバー側のほうで諸々処理してくれて、ビューには表示すべき結果だけを返してくれるので、そもそもクライアント側にモデルとかいう概念がないのでは?SPAの場合はサーバー側は単なるjson返してくるだけなので、そのjsonをどう扱うかはクライアント側に任されますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問