2009-11-05

MVC と Cocoaバインディング

ヒレガス本、Chapter 8 から Chapter 16 までのまとめ (ただし、Chapter 11 は除く)。

(p.124)
Over the next few chapters, you will create a full-featured application (・・・中略・・・) As this book progresses, you will add file saving, undo, user preferences, and printing capabilities.

これらの章では一つのアプリを継続して作る。少しずつ機能を追加していき、一般的なアプリに必要とされる機能を網羅した状態にまで作り込む (Chapter 27 ではさらに印刷機能が追加される)。

ここで作るアプリ自体に実用性はないが、備える機能はどうしてどうして立派なものだ。上記の引用にもある通り、GUI を使ったデータの入力・編集に始まり、編集時の Undo (と Redo)、ファイルへのセーブ(とロード)、環境設定用のパネル、そして GUI 部分の翻訳。機能を羅列すると入門書のサンプルプログラムとは思えないものだ。これは Cocoa と Objective-C の特性による。

実際にサンプルコードを打ち込みつつ、本に書かれた通りに作っていくと、打ち込むコード量に驚く。実現する機能に比べてあまりにも少ないから。↓がそのサンプルアプリだ。扱うデータはごく単純なものなので、何をするアプリなのかはウィンドウを見ればわかるだろう。

送信者 Macをプログラムする

このサンプルアプリを構築するために使われている主な技術を挙げてみよう。

各種 GUI 部品(ビュー)
ここでは表形式でデータを表示するための部品(table view)が主役になる。
ターゲット-アクション
GUI 部品(ビュー)とアプリのコードをつなぐ仕組み
キー値コーディングとキー値監視
オブジェクトのプロパティに対して、直接メソッドを呼び出すのではなく、名前を文字列で与えて間接的にアクセスする仕組み。
通知
あるオブジェクトの変更を他のオブジェクト群に知らせる仕組み
アンドゥマネージャ
undo と redo の仕組み
アーカイブ
データの保存(セーブ)と読み込み(ロード)の仕組み
ユーザ設定
ユーザ設定の保管と読み込みの仕組み
Info.plist
データを保存するファイルの拡張子やアプリのアイコンなど、付加情報の設定。

Cocoa のアプリは MVC アーキテクチャで作られることになる。フレームワークが提供するのは主にビュー(GUI 部品)、さらにビュー (V) とモデル (M)、コントローラ (C) をつなぐための仕組みだ。アプリプログラマはモデルとコントローラを書くことになるが、モデルとコントローラのためにもいろいろと便利な技術が用意されている (NSArrayController とか)。

MVC アーキテクチャは、1 つのシステムを 3 つの部分に分けて作ろうという設計思想だ。当然、それぞれの部分は他から独立していることが望ましい。独立性が高いほど、別々に作りやすくなるし、再利用性も高まる。一方で、最後は 1 つのシステムとして連携しなければならないのだから、間をつなぐ仕組みが必要。この「つなぐ仕組み」次第で 3 つの部分の設計(と実装)のしやすさが変わる。Cocoa で、この「つなぐ仕組み」として提供されているのが、「ターゲット-アクション」であり、キー値コーディング、キー値監視による「Cocoa バインディング」である。

「ターゲット-アクション」は、主にビュー(GUI 部品)とコントローラの「つなぎ」として使われていて(GUI 同士もこれでつなぐ)、一方「Cocoa バインディング」はモデルとコントローラの「つなぎ」になる。これらの特徴を端的に表現すると、「どこにつなぐかを実行時まで決めない」となる。実行時になってから決めるということは、コンパイル時には知らなくても良いということだ。だから、別々に作って、別々に配布・展開できる。Cocoa が提供するビューは、コントローラがどんなアクションを備えているかを知らない。Cocoa が提供するコントローラ(の再利用できる部分)は、モデルがどんなプロパティを持っているかを知らない。知らなくて良い。アクションやプロパティとの「つなぎ」はコンパイル時のリンクとは別の仕組みで伝えられるから。動的言語である Objective-C ならではの仕組みと言える。

「Cocoa バインディング」についてもっと知りたいんだが、ヒレガス本も荻原(2.0)本もこれについては詳しくはない。ここは原典というべき ADC ドキュメントに取り組むしかないようだ。このあたり(↓):

これの前提条件として、以下の文書を読め、と書いてある:

ちなみに *1 によれば、「Cocoaバインディング」が使えるようになったのは OSX の version 10.3 からだとのこと。Panther だ。

追記@2010-12-01

その後 Cocoa バインディングについて調べたり試したりしたことをまとめた記事をいくつか書いた。

関連記事

0 件のコメント:

コメントを投稿