モデル・ビュー・コントローラ)は、ユーザーインタフェースをもつアプリケーションソフトウェアを実装するためのデザインパターンである。アプリケーションソフトウェアの内部データを、ユーザーが直接参照・編集する情報から分離する。そのためにアプリケーションソフトウェアを以下の3つの部分に分割する。Reenskaugが考案。もつソフトウェアにおける有用性から他方面へ広がった。その後、Smtalltalk-80から派生したSqueakでは、Selfから移植されたGUIツールキットMorphicが主に使われるようになった[要出典]。Morphicではビューとコントローラを分離しておらず、その後の多くのGUIツールキット[どれ?]でもビューとコントローラは完全には分離されていない[要出典]。これはビューとコントローラはお互いに強く依存しており、分離する利点よりも欠点の方が上回ったためである[独自研究?]。MVCの構造編集MVCでは、プログラムを3つの要素、Model(モデル)、View(ビュー)、Controller(コントローラ)に分割する。ショッピングの合計額や送料を計算するなど)を表現する要素である。パターンが用いられることもある)。ビューモデルのデータを取り出してユーザが見るのに適した形で表示する要素である。UIへの出力を担当する。ウェブアプリケーションではHTML文書を生成して動的にデータを表示するためのコードなどにあたる。GUIにおいては通常、階層構造を成す。コントローラユーザからの入力(通常イベントとして通知される)をモデルへのメッセージへと変換してモデルに伝える要素である。UIからの入力を担当する。モデルに変更を引き起こす場合もあるが、直接に描画を行ったり、モデルの内部データを直接操作したりはしない。UIにおける入力と出力は本質的には不可分なものであり、したがってビューとコントローラはいつでも分離できるとは限らない。このようなM-VCとなるような構造をDocument-Viewと呼ぶ[7]。対象となるモデルにビュー・コントローラを持たせるだけでなく、ユーザとモデルの構成要素との対話のために各々の構成要素にもビュー・コントローラを持たせる構造を拡張MVCと呼ぶ[8]。MVCのシナリオ編集MVCの実装はさまざまであるが、制御フローは一般的に次のようになる[3]。コントローラが入力機器(マウスやキーボードなど。Smalltalk-80ではInputSensorで表わされる)を監視する。ユーザが入力機器に入力を与える。コントローラがユーザのアクションに応じてモデルのメソッドを呼ぶ。その結果モデルのデータが書き換えられる場合もある。モデルが変更された場合、自身が変更された旨をビューなどのオブザーバに対して通知する。ビューはモデルから関連するデータを取得し、出力を更新する。典型的には画面に図形を描画する。このシナリオでビューやコントローラをそれぞれ1つのオブジェクトとして単純化して説明しているが、実際にはビューは階層構造になっていて、各ビューごとに対応するコントローラが存在する。そのためユーザからの入力を処理すべきコントローラを決定する作業が必要となる。Smalltalk-80ではマウスカーソルを含むビューに対応するコントローラが入力を処理するのが原則であり、次のようなステップで入力を処理すべきコントローラを決定する。コントローラはビューに対し、入力を処理すべきコントローラを問い合わせる(ビューの位置や階層構造を知っているのはビューなので)。ビューはコントローラに現在のマウスカーソルの位置を問い合わせる(入力機器の状態を知っているのはコントローラなので)。ビューはマウスカーソルを含むビューを探す。そのビューに対応するコントローラを、入力を処理すべきコントローラとする。パターンなど)を利用して実装されることが多いところからすると、デザインパターンというより、さらに粒度の大きい1種のソフトウェアアーキテクチャという方が適当であろう[7][9]。部分を別のモジュールに取り替えることが容易となるのが利点である。自動プログラミングなどにも適している。133-134頁、2013年11月23日閲覧。3.0のもとで利用可能です。プライバシーデスクトップ。