■ Java MVCモデル Model-View-Controller
□ モデルとは何か?
・モデルとは、現実に存在する事物を特定の視点から見たもの
・特定の視点とは、構築しようとするコンピュータシステムの視点
・動物のモデルでも、生物学研究のためのモデルとペットショップのモデルは違う
・当該システムで、必要なデータのみを事物から取り出したものが「モデル」
□ MVCモデル(モデル/ビュー/コントローラ/Model/View/Controller)
・model view controllerの略
・由来はsmalltalk(パロアルト研究所)
MVCモデルとはオブジェクト指向プログラミングにおいて行われるオブジェクトの役割分担である。MVCのそれぞれはModel(モデル)、 View(ビュー)、 Controller(コントローラ)を意味する。ロジックを実現するときに、MVCにオブジェクトを分割して役割分担させると、うまくいく(ことが多い)と言われている。それぞれ役割分担は、次のようになる。
* Model(モデル)。プログラミングロジックの本体。
* View(ビュー)。画面など、Model(モデル)の表現形式。
* Controller(コントローラ)。Model(モデル)とView(ビュー)を制御するもの。
Controller(コントローラ)が分かりにくいかもしれない。それも含めて「プログラムの再利用性を高める」という観点からMVCモデルを説明してみよう。注、書籍などに載っている普通のMVCモデルの説明には、Controller(コントローラ)については、その必然性が説明されてはいない。
ソフトウェア開発者は、作成するプログラムが汎用的になるように非常に心を砕き、労力をかける。本能と言っても良いほどである。
一般に、あるプログラムは、業務処理のロジックとともに、画面表示やファイル入出力を行う。これをできるだけ再利用できるように考えた時、画面表示やファイル入出力は、 OSやコンピュータやインストールされている他のプログラムに依存する。
しかし業務処理のロジックは、OSには依存せず、業務処理固有のものだということができる。するとプログラム、この場合は特に業務処理ロジックの汎用性・再利用性・メインテナンス性を高めるという観点からは、業務処理部分と画面表示やファイル入出力の部分を分離すると都合がよいということになる。これが Model(モデル)とView(ビュー)となる。注、モデル、ビュー、コントローラの区別は、実際は状況に応じて変わりうるので、ここでの分類はサンプルと考えていただきたい。
これで残りはController(コントローラ)。ここでなぜController(コントローラ)が必要かという疑問に答える。
Model(モデル)とView(ビュー)の二本立てでいくと、 Model(モデル)がView(ビュー)を呼び出し、View(ビュー)がモデルを呼び出して全体を構成する。しかしView(ビュー)は前述したように、OSやコンピュータに依存する。すなわちOS やコンピュータに依存したインターフェースを持っている。
Model(モデル)がOSやコンピュータに依存するView(ビュー)の機能を呼び出したら、Model(モデル)もOSやコンピュータに依存してしまう。そこでController(コントローラ)という仲介者を設ける。Controller(コントローラ)は、OSやコンピュータに依存しないインターフェースでModel(モデル)から処理を受け付けて、OSやコンピュータに依存するView(ビュー)を呼び出す。これでModel(モデル)の OSやコンピュータに対する独立性が確保された。
一方View(ビュー)の方から考えてみよう。こちらもできれば汎用化したい。View(ビュー)はOSやコンピュータに依存することは承知の上。しかし、たとえばいろいろな業務処理の画面表示ができるようにしたい。だがModel(モデル)は特定の業務処理に特化しているので、直接呼び出すと業務処理に依存してしまう。
それでまた Controller(コントローラ)の登場となる。Controller(コントローラ)は、汎用的な画面からのイベントを受けて、それを業務処理に特化したインターフェースに変換して Model(モデル)を呼び出す。これでView(ビュー)が業務処理に縛られることはなくなった。あ~、よかった、よかった。
お分かりのように、Controller(コントローラ)は、業務処理とOS・コンピュータに依存した言わば使い捨ての存在。Controller(コントローラ)を使い捨てにすることによって、Model(モデル)とView(ビュー)の汎用性・再利用性が確保される構造になっていることが、理解していただけただろう。
注意、そもそも私はSmalltalkがどのようなものかは詳しく知らない。上記の説明は、現在の時点より考えて、MVCの意義を *私なりに* 説明したもので、元祖であるSmalltalkにおけるMVCの説明をしたものではないし、また現実に作成されているソフトウェアが、このようなことまで理解して作成されているわけではない。世間に流布しているMVCの説明とは若干異なるので注意していただきたい。
注、「MVCモデル」でMがモデルなので、モデルが重複している。なんか変だ。
□ Rails系のMVCは、少し構造が違う
Javaなど Rails系
Model 業務処理 DBアクセス
View 画面表示 画面表示
Controller MVを制御する 業務処理+制御
file:..\images\Rails-MVC.pdf 参照
□ ModelとViewの間に矢印がある図は間違いである
・MVCに分割した原則から言えば、ModelとViewの間に関係があってはいけない。
・「プログラムの独立性を確保する」という視点からMVCを解釈する。
・ModelとViewに関係があると、ModelとViewが依存し、コードの再利用が不可となる。
・「Controllerを使い捨てにする」ことによって、ModelとViewの独立性が保たれる。
・Controllerの本当の目的は、ViewとModel間の相互参照を避けるための仲介役。
・参考
http://www7.ocn.ne.jp/~fishbone/mvc/
・しかし、単にテーブルの内容を表示するようなプログラムでは、忠実にControllerを介するような実装はいわば「オーバースペック」となる。
□ 参考資料
Model View Controller
http://ja.wikipedia.org/wiki/Model_View_Controller
MVC のベストプラクティス
http://www.yiiframework.com/doc/guide/1.1/ja/basics.best-practices
MVCモデル
http://www7.ocn.ne.jp/~fishbone/mvc/
注、このページは素晴らしいが、量があるので、読むのが大変。
-----------------------------------------------------
・目次 Java システム開発
http://blogs.yahoo.co.jp/artery2020/40586660.html
・目次 - Java入門
http://blogs.yahoo.co.jp/artery2020/39975776.html
・目次 - ビジネスパーソンの常識と非常識
http://blogs.yahoo.co.jp/artery2020/39728331.html
・目次 - 論理・発想・思考についての考察と鍛え方
http://blogs.yahoo.co.jp/artery2020/39657784.html
-----------------------------------------------------