はじめに
※以下の内容には誤りが含まれる可能性があります
Railsでアプリケーションをつくるにあたって、MVCという言葉が出てくると思います。
MVC、MVCアーキテクチャについて深く知らなかったたこともあり調べてみることにしました。
と言ってもRailsは出てきません。
あくまでも学習のメモとしての記事になります。
最後のまとめで自分の意見を言って終わりたいと思います。
具体的な内容
- MVCの歴史
- 考え方
- MVCの機能、役割
- 機能① Model(モデル)
- 機能② view(ビュー)
- 機能③ Controller(コントローラー)
正式名称
正式名称は、Model View Controller (モデル・ビュー・コントローラー)です。
その頭文字を取ってMVCアーキテクチャといいます。
先生!アーキテクチャってなんですか!食べれるんですか!
君はあれだね、ちょっとアニメの観過ぎかな。ワンピースとか好きでしょ
アーキテクチャとは?英語わからへん
アーキテクチャ 【architecture】
アーキテクチャ(architecture)は、英語で「建築学」、「建築術」、「構造」を意味する語である。
語源は古代ギリシャ語の「αρχιτέκτων arkhitekton」(アルキテクトーン)である。
建築というとしっくりきますねぇ。なんとなくモノづくりのイメージがプログラムにはあるので。
そしてここから派生してアーキテクチャの意味がそれが使われる環境によって変わって行きます。
全部を紹介していくときりがないので、コンピュータアーキテクチャの分野にしぼります。
OKですか?でもコンピュータアーキテクチャだけでも3つに分かれます。ワ〜オ!多っ!
「命令セットアーキテクチャ」「マイクロアーキテクチャ」「システムアーキテクチャ」
- 命令セットアーキテクチャ(ISA)
機械語、またはアセンブリ言語から見たプロセッサの抽象化されたイメージで、
命令セット、アドレッシングモード、レジスタ、アドレスとデータの形式
などが含まれる。
- マイクロアーキテクチャ
さらに下位でのより具体的なシステムに関する記述であり、ISAを実
装するためにシステムの構成部品をどのように接続し、それらがどの
ように相互にやりとりするかを示す。
- システムアーキテクチャ
他のコンピュータシステムのハードウェア全般に関するもの。
1 バスやクロスバースイッチなどのシステムインターコネクト
2 メモリコントローラやメモリ階層
3 ダイレクト・メモリー・アクセスなどのCPUオフロード機構
4 マルチプロセッシングに関わる部分
5 複数のコンピュータによるシステム構成に関するもの(コンピュータ・クラスターやNUMAアーキテクチャなど)
MVCの歴史
ここで歴史っ! 唐突!
ええやん細かいことはググっとき
1979年にパロアルト研究所のトリグヴェ・リーンスカウクが考えた。
1988年に最初の論文「A Cookbook for Using the Model-View-Controller User Interface Paradigm in Smalltalk -80」が公開される。
1994年に書籍「Design Patterns:Elements of Reusable Object-Oriented Software」内で取り上げられる。
1999年、MVCのサーバサイド実装としてJavaServer Pages Model 2が発表。
考え方・概念
アプリケーションの内部処理と、ユーザーに対する入出力処理を分離することが目的。
デザインパターンの1種と扱われる場合もあるが
一般的な制御フローとしては、
-
コントローラが入力機器を監視する。
-
ユーザが入力機器に入力を与える。
-
コントローラがユーザのアクションに応じてモデルのメソッドを呼ぶ。その結果モデルのデータが書き換えられる場合もある。
-
モデルが変更された場合、自身が変更された旨をビューなどのオブザーバに対して通知する。
-
ビューはモデルから関連するデータを取得し、出力を更新する。典型的には画面に図形を描画する。
このシナリオではビューやコントローラをそれぞれ1つのオブジェクトと
して単純化して説明しているが、実際にはビューは階層構造になって
いて、各ビューごとに対応するコントローラが存在する。
そのためユーザからの入力を処理すべきコントローラを決定する作業が必要となる。
MVCとデザインパターン
MVCはデザインパターンの1種と扱われる場合もあるが、(MVCパタ
ーンと呼称される)、MVC自体が他の小さなデザインパターン
(Obsaerverパターン・Cmmandパターン・Factory Methodパタ
ーン・Facadeパターンなど)を利用して実装されることが多いところ
からすると、デザインパターンというより、さらに粒度の大きい1種のソ
フトウェアアーキテクチャという方が適当でしょう。
各モジュールが比較的はっきりと分かれ、プログラムの見通しがよくなるとともに、ユーザインタフェース(UI)の部分を別のモジュー
ルに切り替えることが容易となることが利点です。
MVCの役割、機能
- モデル
そのアプリケーションが扱う領域のデータと手続き(ビジネスロジック、ショッピングの合計額や送料を計算するなど)を表現する要素である。また、データの変更をビューに通知するのもモデルの責任である。(モデルの変更を通知するのにObserverパターンが用いられることもある)
- ビュー
モデルのデータを取り出してユーザが見るのに適した形で表示する要素である。すなわち、UIへの出力を担当する。
- コントローラ
ユーザからの入力(通常イベントとして通知される)をモデルへのメッセージへと変換してモデルに伝える要素である。すなわち、UIからの入力担当する。モデルに変更を引き起こす場合もあるが、直接に描画を行ったり、モデルの内部データを直接操作したりはしない。
なお、UIにおける入力と出力は本質的には不可分なものであり、したがって、ビューとコントローラはいつでも分離できるとは限らない。
まとめ
新しい知識としてMVCアーキテクチャを調べていくと知らないことばかりで戸惑いましたが、これから学んでいくいいきっかけとなったらいいと思った。