LoginSignup
1
0

すみません!アドベントカレンダー間に合いませんでした!!

現状、私の理解不足を多分に含む恐れがあります。何かが間違っている気がしてなりません。

間違いだと思う点があれば、コメントで指摘していただけると、間違いを正す機会を得られるので、大変ありがたいです。

MVCとは

MVCとは、Model-View-Controller の略で、トリグヴェ・リーンスカウクが考案し、最初の版をSmalltalkで実装しました。
その本質的な目的は、ユーザーに「ユーザーが自らのメンタルモデルと対応するコンピュータ内の計算モデルを見て直接的に操作している」という錯覚を与える事でした。

後に、SmalltalkでGUI (Graphical User Interface) アプリケーションを作成する際の指針、そしてクラスライブラリとなり、今日では広くGUIアプリケーションで模倣される様になりました。

MVCの経緯

リーンスカウクは1978年の夏から翌年1979の夏まで客員科学者として、アラン・ケイのDynaBook(後に一般名詞を意識してDynabookに改称)構想のためのXerox PARCのラーニング・リサーチ・グループ(LRG)にて作業しました。

MVCは、はじめからその名前だったわけではなく、Model-View-Editorが最初の名前でした。
長い、特にアデル・ゴールドバーグとの議論の末、Model-View-Controllerが最終的な名前になりました。

リーンスカウクがLRGを去った後、Jim Althoffらの版のSmalltalk-80用のMVCが実装されました。Jim Althoffはコントローラーという用語をリーンスカウクとはいくらか違った物として使いました。
オリジナルのMVCのコントローラーは、それに従属する1つ以上のビューを作成し、調整することがその役割でしたが、Smalltalk-80のMVCのコントローラーは、一つのビューとペアになり、ユーザーによるマウス操作やキーボード操作を受け付け、ビューを操作するものになりました。
Smalltalk-80のコントローラーは、オリジナルのMVCの4番目の要素であるエディターに相当します。
エディターは特殊なコントローラーの一種で、必要に応じてビューによって作成され、ビューとマウスやキーボード等のインプットデバイスとの間のインターフェースとなります。

オリジナルMVCの発展

リーンスカウクの後のMVCの実装では、ビューは自身に対するユーザー入力を受け付け、取り扱います。コントローラーは、自身と一つ以上のビューの組み合わせ全体に対する入力を受け付け、取り扱います。
現在では、リーンスカウクはオリジナルMVCのコントローラーとそれが調整する複数のビューの組み合わせをツールと呼んでいます。

Smalltalk-80のMVCの発展

Smalltalk-80のMVCではViewとそのサブクラス、Controllerとそのサブクラスが初めから用意されていて、これらと合わせて使うModelクラスとそのサブクラスが提供されています。

依存性(Dependency)の利用

Modelクラスはインスタンス変数としてdependentsを持ち、自らに変更が起きた際にdependentsを通じて変更が起きたことや、自身の何が変わったのかを通知します。

このインスタンス変数にはViewやControllerが、View/ControllerのペアとModelが組み合わせられる際に登録されます。

通知機能はObjectクラスでも定義されていますが、それよりも効率的に通知を行うためにdependentsを保持し使用します。

プラガブルMVC

Smalltalk-80で最も洗練されたMVC

Smalltalk-80後のMVCの発展

Smalltalk-80の直系の子孫であるVisualWorksでは、現在もViewとControllerは独立しています。
また、モデルをより本質的なドメインモデルとアプリケーションモデルに分けており、アプリケーションモデルでは、GUIに必要な情報やビュー/コントローラーを直接操作することもあります。

もう一つの直系の子孫であるSqueakとそこからフォークしたPharoでは、SELFから移植されたMorphicが標準のGUIフレームワークとなり、MorphicではSmalltalk-80の様にはViewとControllerには分割されずに、一つのクラスが表示とマウスやキーボード等のインプットデバイスを取り扱います。

Smalltalk-80のMVCとCocoaのMVCの対応関係

CocoaにおいてもMVCに従ってアプリケションを作成することを推奨されており、そのMVCはSmalltalk由来であると述べられています。
しかし、Mac OS X 10.0の時点でのAppKitのクラス群を見ると、オリジナルMVCやSmalltalk-80のMVCとはまた違った、クラス構成になっていることに気が付きます。

仮にSmalltalk-80のMVCを基準に、AppKitから対応するクラスを名前を元に探すと、NSViewとNSWindowController、NSCocumentoControllerがまず見つかるはずです。
NSWindowController、NSCocumentoControllerの役割を見ると、Smalltalk-80のControllerの特徴であるユーザーからの低レベルなマウスやキーボード等の入力を扱っていない事に戸惑うかも知れません。

実はSmalltalk-80のMVCのコントローラーに相当するクラスはNSResponderであり、ユーザーのマウスイベントやキーイベントを処理する能力を持っています。NSView, NSWindowControllerはNSResponderのサブクラスであるため、実際のところNSViewは、Smalltaklk-80のMVCのコントローラーとビューが合体したものだと気づくでしょう。

モデルに関しては、CocoaのAppKitとFoundationにはSmalltalk-80のそれと直接的に対応するクラスはありません。

オリジナルMVCとCocoaのMVCの対応関係

完成したらこのノートは消します。
ここはドキュメントを読んだだけなので、実装レベルでの確認が済んでいません!!
Smalltalk-80とSmalltalk-76、Smalltalk-72では世代が違い、もはや別言語だという知識はありましたが、実際シミュレーター使ってみたら見かけは似てるのに、言語的にかなり違ってる感じでてもう何が何だか🤯
吸収能力が落ちたなぁ🙄もう歳だしね😵🍵
これ、12/22までに完成するのかなぁ。頑張れ明日以降のわたし!!

Smalltalk-80を基準に解釈すると以上の様になりますが、今度はオリジナルMVCとその発展系を基準に解釈してみましょう。
オリジナルMVCではコントローラーはそれに従属する一つ以上のビューを調整することが役割でしたね。
その観点でCocoaのAppKitを見ると、NSWindowControllerがコントローラーであり、NSViewやそのサブクラスはビューであるとと考えるられます。

やはりモデルに関しては、CocoaのAppKitとFoundationにはオリジナルMVCのそれと直接的に対応するクラスはありません。

参照

MVC
トリグヴェ・リーンスカウク

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0