すみません!アドベントカレンダー間に合いませんでした!!
現状、私の理解不足を多分に含む恐れがあります。何かが間違っている気がしてなりません。
間違いだと思う点があれば、コメントで指摘していただけると、間違いを正す機会を得られるので、大変ありがたいです。
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のそれと直接的に対応するクラスはありません。