タイトル【今から始めるCocoaプログラミング】最初のアプリケーション(3)クラスを設計するカテゴリーCocoa, ProjectBuilder/Interface Builder, 今から始めるCocoaプログラミング
作成日2000/12/17 14:55:11作成者新居雅行
JavaでCocoaアプリケーションを作るシリーズの始めてのアプリケーション作りを紹介しているが、前回までにProject Builderの使い方やInterface Builderの使い方を説明した。特に、Interface Builderが単なるGUI作成ツールではなく、コントロールなどの関連性を定義できる点を示したかった。実用的にはあまりしないことだが、コントロール間を直接結び付けて、連係した動作をするあたりをチェックした。
いよいよ、プログラミングに話は進む。こうしてウインドウにコントロールを配置し、それらを適当に設定するだけでは、普通は望むプログラムを作ることはできない。ボタンを押したらなにか処理をしたりするようなことをプログラムとして記述しなければならない。古くはHyperCardがそうしたプログラムを記述しやすくするような体系を取っていたが、今ではREALbasicやあるいはWindowsでのVisual Basicでも、同様に、コントロールと背後にあるプログラムを連係させるような動作を行なう。ただ、これらの開発ツールでは、ある動作をしたときに呼び出されるものの名前が決まっていて、その決められた名前の一連のプログラムを作るとうのが基本になる。しかしながら、Cocoaの体系では名前で対応を取るということをしない。操作そのものにフォーカスすると「線を引いて対応付ける」ということで、コントロールとプログラムの対応を取ることができる。まさにオブジェクト指向そのものなのである。

ここで、プログラミングの考え方として、Model-View-Controller(MVC)という手法を意識してもらいたい。いくつかサイトを探しておいたので、どういうものなのかということはそちらも参照するとよいだろう。もちろん、Sherlockで検索するともっとたくさんのページが見つかる。

◇MVCモデルという言葉をよく聞きますが何のことですか?
 http://www.atmarkit.co.jp/fjava/javafaq/j2ee/j2e07.html
◇使わないと損をするModel-View-Controller
 http://www.jac-net.com/~tarzan/smalltalkers/mvc/mvc.html
◇MVCデザイン
 http://www.bekkoame.ne.jp/~sakamo_m/BeansFlavor/Swing3/SSS01-02.html

MVCの考え方は、ソフトウエアをどのように構成するかといった方針を与えるものだ。複雑になりがちなGUIアプリケーションの構成を整理する。まず、画面に見えているコントロールなどをViewとして考える。そして、実際に管理したいデータをModelとする。抽象的にはそういう意味だが、Modelについてはデータベースの中身だったり、あるいは単に変数をオブジェクトとして表現するというようないろいろなケースがあるだろう。そして、ControllerはViewとModelを管理するというものだが、場合によっては入力の処理を行なうといった表現もされる。ある意味では3階層システムでもあるわけだ。
Interface Builderでビジュアルに作成できるコントローラ群は、ここではViewと見ることにしよう。具体的な目的のあるアプリケーションなら、Model層については子細に設計するところだが、今回のアプリケーションではそこまでの目的意識はないので、Model層は省略する。そして、ViewをコントロールするControllerを、クラスとして定義するということを行なう。そのクラスで、コントロールを操作した時の振る舞いを記述することにする。

ただ、こうした中間層のクラスの作り方としては、かなり自由度があるというのはどの開発環境でも同じだろう。むしろ、決められた作り方しかできないほうが問題が出やすい。たとえば、Project Builderを使っていて、そうした中間層クラスを、1からスクラッチで書くということももちろん可能だが、ここでは、Interface Builderの機能を最大限に使う方法を紹介したい。Interface Builderは、ユーザインタフェースの意味でのインタフェースをビルドするものだけでなく、ソフトウエアの境界部分を定義するビルだでもあるわけだ。
さて、ここでは、Cocoa-Java Document-based Applicationというひな形を作り、そこで最初から用意されているMyDocument.nibファイルにコントロールを配置した。そのコントロール類を処理するControllerクラスを定義したい。Interface Builderで、MyDocument.nibの文書ファイルに相当するウインドウをアクティブにして、そのウインドウの「Classes」のタブを選択しておく。そして、新しいオブジェクトを作るのであるが、いきなりオブジェクトを作るのではなく、基本的には既存のクラスのサブクラスとする。ただ、もし、特に意図がなければ、オブジェクトの基底クラスであるNSObjectを親クラスにすればいい。リストから、NSObjectを探して選択し、ClassesメニューからSubclassを選択する。

◇NSObjectを親クラスとして新しくサブクラスを定義する
 

すると、ウインドウ内では、NSObjectの1階層下に「MyClass」という名前のクラスが定義される。ここでは、「MyWindowController」という名前にその場でキータイプして書き換えておいた(あまりいい名前ではないのだが…)。

◇作成したクラスをMyWindowControllerという名前にした
 

さて、このMyWindowControllerクラスはクラスだからプログラムで記述される。そのため、ここで、インスペクタを呼び出し、ポップアップメニューからAttributesを選択しておく。すると、このクラスを記述する言語が何かを指定するパネルになるので、Javaを選択しておこう。インスペクタは良く使うので表示したままにしておくのが便利だが、邪魔になったのならDockにしまっておくという便利な使い方ができる。

◇インスペクタで言語をJavaに選んでおく
 
関連リンク