こんにちは、やまだたいし( やまだ たいし (@OrotiYamatano) | Twitter )です。
過激なタイトルですが、「MVCという呼び方以外の呼び方をするか」or「MVCと略すのではなく、互いにどのようなMVCを想定しているのか話さないといけない」という話です。
目次
そもそもMVCとは?
そもそもMVCとは何でしょう?
Wikipediaには以下のようにあります。
MVC(Model View Controller モデル・ビュー・コントローラ)は、ユーザーインタフェースをもつアプリケーションソフトウェアを実装するためのデザインパターンである。プリケーションソフトウェアの内部データを、 ユーザーが直接参照・編集する情報から分離する。そのためにアプリケーションソフトウェアを以下の3つの部分に分割する。
- model: アプリケーションデータ、ビジネスルール、ロジック、関数
- view: グラフや図などの任意の情報表現
- controller: 入力を受け取りmodelとviewへの命令に変換する
(気になった点、Wiki内にコントローラの説明に「すなわち、UIからの入力を担当する。 」と書いてる部分があるが誤解を招く表現かも?)
少しこれだけでは、定義があいまいです。
ここで原初のMVCを参考にしてみましょう。
MVCの起源
1979年: パロアルト研究所にてTrygve Reenskaugが考案。
Smalltalk-80の実装のみが公開され、MVCに関する公開情報はなかった。(Wikipedia参照)
つまり、Trygveさんが考えた、Smailtalk-80が一番はじめということです。 (MVC1)
次の2つの資料が一番はじめの原点のMVCということです。
KrasnerPope88.pdf https://www.ics.uci.edu/~redmiles/ics227-SQ04/papers/KrasnerPope88.pdf
Trygve/MVC heim.ifi.uio.no
Controllerでデバイスからの入力を受付を行い、ViewとControllerは一対多で存在、モデルがそれに対して複数存在する形です。
まるで、マウスの入力とその情報を表示する画面、情報を保存しておくModelと定義できそうです。
しかし、Web系でいわれているMVCは少し違います。
Web系のMVC
適当なサイトにはこのように載っています。
Model:Modelとは、ビジネスロジックを書く部分です。簡単に言えば、データを処理したり、データをDBへ保存したりする部分になります。
View:Viewとは、ユーザーが実際に見る画面を示しています。主にHTMLで書かれていますが、if文の様なプログラムのコードも頻繁に書かれます
Controller: Controllerとは、ViewとModelを操作する部分です。
原初MVCの「Controller」が「入力を受け取る」ところ
Web系では「View」が「入力を受け取りと表示」を行い、
原初MVCの「Model」が「アプリケーションデータ、ビジネスルール、ロジック、関数等」ほぼすべての処理が書かれていましたが、
Web系では「Model」が「ビジネスロジックでDBに保存する処理」のみを書くようです。
そして、Web系の「Controller」はというと「モデルへのデータ渡しとViewへの表示」を取り扱います。
全く違いますね!
実はこれMVCとしては間違っています。(というか原初MVCという定義が曖昧なので完全に間違ってるとも言いづらい)
厳密に言うとWeb系でいうと伝わりますが、他職種では混乱を招くでしょう。
実はこのMVCはMVP(Model–view–presenter)と置き換えるのが適切です。(ちゃんとWikiのページもある)
最近はWeb系でもMVPと正しく呼ぶところが多くなってきていますが、未だに整理されていないようです。
それもそのはず。実はMVPが流行る前にMVC2というものが定義されていたからです。
MVC2
原初MVCは「入力(コントローラー)」とは「マウスやキーボード」を表し、「View」とは「画面やコンソール」と物理的なものをほぼ表していました。
しかし、MVC2はそれに対してWebの考えが追加されたのです。
MVC2. 1998年 JSP仕様のドラフトで提唱され、1999年にJavaServer Pages Model 2として発表された。
多分、MVC→MVC2→MVPと順々と進化してしてしまったがために,その流れでMVPも見方によってはMVCと呼べてしまうのです!
紛らわしい!
ゲーム系では?
ゲーム系も独自の進化を遂げていますが、私は詳しくありません。
ゲーム系は自社の技術を他社に対してシェアする文化が薄かったため、どのような進化を辿ったのかが曖昧だからです。
私が知っている限りでは
「ゲーム系のMVCはベースは原初MVCに近く。
ゲームのコントローラーをそのままControllerとして定義を行うのは昔から変わらない」
というくらいです。
(↓多分コレがゲーム業界で最終的に定着したMVC)
最近はIT業界から再度MVCが流入が始まり、ゲーム業界で育ってきたMVCとIT業界から輸入されたMVC(MVP)が混ざり合って
MVCと一言でWeb記事に書かれていても、解説を正しく読まなければ何を表しているのか分かりづらいです。
まさにカオス!
そのせいか、MVCはゲームに合わない!とゲーム業界で育ってきたMVCを否定する人も居るとか居ないとか。
参考: https://naruport.com/blog/2019/9/23/difference-of-mvc-with-game-and-web/naruport.com
結論
もうMVCって言っても伝わらないし、人によって頭の中に思い浮かべているMVCも違う。
そうならば、その場その場でMVCを定義するより新名称をつけたほうが良いんじゃないかとすら思う。
もうMVCっていう言葉を廃止したい。
余談:MVCについて考える様になったきっかけ
Unityゲーム開発者ギルドにて……
Unityゲーム開発者ギルドにてMVPパターンでインゲーム部分についてMVPで書けないか?
という話が上がったからです。
その疑問は私も持っていて、「UnityのMVP、MV(R)Pを調べたけど、どれが正しいんだ?」という記事の一番下に書きました。
ココに書いている通り、MVPだとインゲームの設計が難しいです。
その流れで「他の人はMVP、MVCでゲームを作った時にどの様に利用しているのだろう」と気になり調べてみると……。
ウェブ系ではMVPをMVCと呼んでおり、
ゲーム系ではMVC派生パターンについてもMVCと呼んでいました。
どれをMVCと呼んで良いのか分からない状態になっています。
MVCって言葉使いづらいな!?
と思ったのがことの発端でした。
皆さんはゲームにはどのようなロジックがふさわしいと思うのか私は色々知りたいです。
他の方々の記事をお待ちしております。