初心者必見! 知られざるMVCのなりたちとファミリー
以前のコラムでMVCとフレームワークについて、書かせていただきました。
超初心者PG向け MVC&フレームワーク
今回はなぜMVCがここまで広まり、必要とされてきたのか?ということについて、歴史から紐解いてみたいと思います。
MVCのなりたち
下記にwikipediaより引用したMVCの始まりについての説明を掲載します。
元来Smalltalkにおけるウィンドウプログラム開発のための設計指針として生まれたが、構造が複雑となりがちなグラフィカルユーザインターフェース (GUI) をもつソフトウェアにおける有用性から他方面へ広がった。
ここで重要なのは「(GUI) をもつソフトウェアにおける有用性」という部分です。
「GUIは当たり前」だと思っている方も多いと思いますが、GUIの前にCUI(キャラクターユーザインターフェース)だけで開発していた時代もあったのです。
今でもWindowsのバッチファイル(コマンドプロンプト)やLinuxのシェル、サービスなどエンドユーザが直接利用しないGUI以外の開発は行われています。
CUIでの開発経験がある方であればお分りいただけると思いますが、MVCの全体の流れである「ユーザー画面からの操作を受け取り、それを処理してまたユーザー画面へ返す」というのはGUIだからできることです。
つまり、MVCはGUIでの開発により誕生し、GUIでの開発と共に世の中へ広まっていった、とても歴史のある考え方です。
MVCから派生した色々な考え方
MVCの歴史がとても古いことはお分りいただけたと思いますが、ではずっと最初の考え方のまま今日に至っているのかと言うと、当然そんなことはありません。
時代と共にMVCの考え方も色々と応用、改良され、MVCから派生した考え方がいくつも生まれています。
ここでいくつか紹介します。
モデル2MVC
JSP(JavaServer Pages)におけるサーバサイド実装として生まれたMVCです。
実は以前私が説明したMVCはこのモデル2にあたります。
そして、現在多くのWEBのフレームワークで採用されているMVCもこのモデル2です。
今一般的にMVCと言うとこちらをイメージする方が多いと思います。
原初のMVCはModelとViewが繋がっていて、ModelからViewへ表示データの通知を行ない、ViewでModelから受け取ったデータを表示するというものでしたが、モデル2ではModelとViewを完全に独立させ、間に入るControllerがModelとViewを制御するという点が大きな違いです。
・原初のMVCのイメージ図
・モデル2MVCのイメージ図
個人的にはModelとViewが依存していない方が役割を分けるときも考えやすいため、モデル2の方がイメージが湧きやすくプログラムも構成しやすいと思っています。
MVVM(Model-View-ViewModel)
データバインディングという機能によりViewと保持データを結びつけ、両者の変更を互いに反映することで常にViwModelがViewと同じデータを保持すると言う考え方です。
・MVVMのイメージ図
このMVVMは下記のようなクライアント側での開発でよく使われています。
・Visual Stadioを使ったWindowsアプリの開発
・Androidアプリの開発
・Javascriptフレームワークを使ったWEBフロント開発
このMVVMの一番のメリットはViewへの変更、またViewからの変更を意識せずに済むため、Viewとの連携処理を都度プログラミングしなくて良いこと(プログラミング量の削減とViewへの反映漏れの防止)です。
最近では特にWEBフロント開発で広まっているため、WEBフロント開発に携わる機会があれば勉強することをお勧めします。
その他にもMVPやMVWといった考え方もあります。
ここでは説明いたしませんが、インターネット等でも多くの情報がありますので、気になる方は是非調べてみてください。
結局目指していることは同じ
ここまでMVCの歴史から派生して生まれた色々な考え方を見てきましたが、どれも目指しているのは「開発効率の向上」や「メンテナンス性の向上」です。
これは私たち開発技術者にとって永遠のテーマであり、各々が考え続けなければいけないことでもあります。
それ故に、MVCは長い歴史の中で今までの技術者達が改良を重ね、形を変えながら広まり、GUI開発における基本的な考え方の一つとなっています。
このことからも私はMVCが絶対ではなく、常に自分なりに考え、失敗と成功を繰り返しながらMVCよりも優れた「自分の黄金パターン」を作ったり、状況によって既存の技術を応用できるようになるととても良いと思います。
もしかするとあなたが考えたパターンが今のMVCに取って代わる画期的なものになるかもしれません。
この記事を書いた人について
-
オーシャン・アンド・パートナーズ株式会社 システムエンジニア
顧客をリードし、最適なシステムを構築、提供できる技術者を目指しています。
コラムでは若手技術者向けを中心に今までの経験を踏まえた実際の開発現場で役立つ情報を発信していきます。
プライベートでは家族の足(専属運転手)となり、今ではかねてからやりたかった日々の送り迎えが日課になっています。
最新記事一覧
- プログラマ向け2020.04.27逆転の発想でオブジェクト指向の「継承」を使いこなす
- プログラマ向け2020.04.10オブジェクト志向のカプセル化を、総合医療病院で例えると「窓口」という説を語ってみる。
- 働き方改革2020.03.04【働き方改革】リモートワークを成功させる3つのポイント
- プログラマ向け2020.01.21MVCの導入を成功させるためのベストプラクティス!