見出し画像

[#30] Cocoa に負けないHIView それを支えるHIObject

初出: MacPower 2003年 1月号

先月の続きで、Jaguarから追加されたビユーシステムであるHIViewを取り上げる。まずはHIViewとは何か、どんなメリットがあるのかを見てみよう。

HIViewとは基本的にウィンドウ / メニュー / コントロールバー / アピアランス などを扱う昔ながらのQuickDraw系 ToolboxのAPIに完全に置き換わるシステムだ。画面上に見えているものはすべてHIView [*1]か、そこから派生したビューということになる。開発者にとってみればHIViewの使い方を覚えるだけでいいわけで、混乱気味だったAPIをすっきりさせることができる。またHIViewは、QuickDrawに代わるグラフィックエンジンであるQuartz との親和性ももちろん高いので、これからのアプリケーシションにはもってこいと言える。それでいて座標系は、Quartz 標準の左下原点ではなく、QuickDraw時代からおなじみの左上原点となっている。これもCarbon デベロッパにとってはうれしい仕様だ。

一方、ユーザーにとっての一番のメリットは性能である。HIViewはパフォーマンスが優れている。同じ表示方法ならHIViewのほうが素早く表示できる。これは、同ビューが最近のプログラムのトレンドを多く取り入れているため、内部的に効率化されていることが理由だ。Quartzの描画モデルを直接使っていることも大きな利点となっている。

また、表示の美しさもHIViewの特徴だ。これはQuartzの画像合成能力の威力によるものである。例えばMac OS X標準のウィンドウの背景は薄いグレーのストライブだが、QuickDrawを使っている場合、プログラミングのときに気をつけないとパーツの境目で背景がずれてしまったりする。これはMac OS X v10.1まではよく見られた現象だが、今後はアプリケーションがビューシステムとしてHIViewを使うようになっていくので、こうした現象はなくなるはずだ。

さらに、すべてのユーザーインターフェースのパーツが統一されたAPIを使っているおかげで、新機能の恩恵を素早く得られるということもユーザーにとってのメリットだろう。Jaguarで新たに追加されたユニバーサルアクセスでは、メニュー / ボタン / Dock / ツールバーなどに、キーボードで簡単にアクセスできるようになっている。パーツの種類を問わず、こうした機能が動作している裏ではHIViewが活躍しているのである。

HIViewの仕組みやメリットの説明はざっとこんなところである。表示の速度と美しさに優れるHIViewは、今後も内部的にさらに改良が加えられて進化していくことだろう。うむ……それは素晴らしいことなのだが、今回の話のネタは実はその足回りを支える下の部分である。ここからが本題だ。実はHIObjectというのがHIViewの下で頑張っているのである。この話がしたかったのだ。いやぁ、前置きが長かった(笑)。

Cocoaは、オブジェクト指向言語であるObjective-Cを標準の言語として採用している。なので、Interface Builder というオブジェクト指向的なツールで生成されるビューを問題なく扱うことができる。これは、わりとわかりやすい話だろう。一方、HIViewはCarbon とCocoaの区分けで言えば、Carbonに属するものだから、そのAPIはObjective-C用ではなく通常のC言語用のAPIということになる。プログラミング言語の側から見たら、HIViewはオブジェクト指向とは関係ないのだ。なのに、HIViewはとてもオブジェクト指向的な仕組みを実現している。バーツに階層構造を持たせられる[*2]し、システム標準のパーツを好きに拡張できるなど、オブジェクト指向的な特徴を数多く持っているのだ。なぜか?

実はオブジェクト指向的な機能とオブジェクト指向言語は、本当の意味では関係ない。もちろんオブジェクト指向言語であれば言語の仕様にオブジェクトという概念が組み込まれているので、とても扱いやすいということは確かだ。記述も簡潔で容易になる。しかし言語はあくまで補助的なものであって、オブジェクト指向的な実行環境が大事なのである。ただ一般的には言語と実行環境はセットになっていることが多いので、勘違いされても仕方がない。

例えばObjective-C だって、実は普通のC言語に変換されてからコンパイルされる。実行時には単なるC言語で書いたプログラムと変わりない。ただ、オブジェクト指向的に振る舞うためのライブラリーがMac OS Xに内蔵されているため、問題なく動いているだけなのである。やろうと思えば最初からすべてをC言語だけで [*3] 書けないことはない。

で、ここで登場するのがHIObjectなのである。これは純粋にC言語用のAPIであるが、このAPIを使えば、オブジェクトの生成や拡張メッセージの送受信などが簡単に行える。オブジェクトは画面上に見えているボタンやウィンドウでもいいし、アプリケーションや書類などの抽象的な概念でも構わない。何か機能する「もの」、それがオブジェクトなのである。長くなるので、オブジェクト指向とはなんぞやということについては回をあらためて説明したいと思う。

HIObjectの登場以前にも、C言語でオブジェクト指向的にプログラムを組める機能はたくさんあった。多くのプログラマーはウィンドウに関数をくっつけてオブジェクトとして扱っているし、システム標準のものとしてもQuickTime の Component Manager や QuickDraw GX の Message Manager 、 AppleEvent の Object Support Libraryなど、目的の違いによる差違はあるが同様の機能を提供している。しかしHIObjectは、何よりいまの時代のプログラミングに適しているのだ。Carbon Event Manager をメッセージ機能として使い、Core Foundationを基本データ型として採用している。まさにMac OS Xのためのシステム標準オブジェクトモデルなのである。

来月はオブジェクト指向の話かなぁ。

バスケ(basuke@mac.com)
世界遺産の島、屋久島に行って来ました。じゃなくて、屋久島で原稿を書いてます。なぜ(泣)。ま、それはともかく、のんびりしてます。自然と触れ合うことは大事です。しかし、なぜ原稿を・・・・(泣)。

[*1] すべてHIView - ただし現在のバージョンでは、置き換えは不完全だ。
[*2] パーツに階層構造を持たせられる - 階層構造は本質的にはオブジェクト指向と関係ないが、メッセージの送受信という点から見るとオブジェクト指向的と言える。
[*3] すべてをC言語だけで - もちろんそんな必要はまったくない。あくまで例だ。

編集・三村晋一

この記事が気に入ったらサポートをしてみませんか?