【コラム】
Prototypeパターンの話も四回目。デザインパターンからは少しそれた話題が続いたが、今回からは戻ろう。
例によって、Cocoaの中からPrototypeパターンを使っているものを探してみよう。取り上げるのは、セルとコントロールだ。
Cocoaはたくさんのビュー、つまりユーザインタフェースの部品を提供している。部品には、ボタンやスライダーといった単純なものもあるが、それらを組み合わせたり、内部に含んだりする、複雑なものもある。
例えば、テーブル表示機能を提供するNSTableViewを見てみよう。テーブルには文字列や画像の他に、ボタンやスライダーといったユーザインタフェースの部品を入れる事もできるのだ。
|
こういったことを実現するために、Cocoaのビューのいくつかは、セルとコントロールと呼ばれるものから構成される。1つの部品を、あえて2つに分けるのだ。
セルは、描画を担当する。かつ、ユーザインタフェースのメインとなる処理も受け持つ。ユーザインタフェースの実質となる部分だ。
それに対してコントロールは、ユーザからのイベントを受け付ける。また、ウィンドウのビュー階層の中で、自身がどこに位置するか、自身の内部にどうセルを配置するか、ということを管理する。つまり、外部とのインタフェースとなる部分だ。
具体的な例を挙げよう。ボタン機能を提供するNSButtonというクラスがあるが、これはコントロールになる。これと対になる、NSButtonCellというクラスもある。これがセルだ。NSButtonは、その内部にNSButtonCellを配置する事で、ボタンとして機能する事になる。
そしてコントロールには、様々な種類のセル内部に持つものもある。先ほどのテーブルでは、コントロールであるNSTableViewの内部に、NSButtonCellや、スライダー機能を提供するNSSliderCellが配置されているのだ。このように、セルとコントロールの分離によって、複雑なビューが実現できる。
さて、ここからが本題だ。デザインパターンの文脈で言うと、コントロールはセルをPrototypeパターンとして使っている。
どういうことか説明しよう。テーブルビューの例で見たように、コントロールは複数のセルを持つ事ができる。この場合、元になるセルを、Prototypeとして、あらかじめ設定しておくのだ。セルを増やすときは、この元になるセルをコピーして、インスタンスを作成する。正に、Prototypeパターンのやり方だ。
このような構造を持つコントロールはいくつかある。ここでは、NSMatrixを紹介しよう。
NSMatrixは、内部にセルを格子状に(マトリック状に)並べるビューだ。セルは、どんな種類のものでも構わない。例えば、ボタンをツールボックスのように並べるときに使われる。
NSMatrixでは、並べるセルの元になるセルを設定するためのメソッドが二種類ある。一つは、セルのクラスを指定するsetCellClass:。もう一つは、その名もズバリ、setPrototype:だ。こちらはセルのインスタンスを指定する。
setCellClass:を使うと、このクラスからalloc、initを使ってインスタンスを作る事になる。setPrototype:の場合は、Prototypeとなるインスタンスを指定するので、これをコピーすることでインスタンスを作る訳だ。メソッドの名前といい、Prototypeパターンの考え方がそのまま当てはまる仕組みだろう。もっとも、NSMatrixがデザインされたのは、GoFによるデザインパターンが発表される前なのだが。
NSMatrixの面白いところは、PrototypeをInterface Builderで指定できる事だ。Interface Builderは、ユーザインタフェースのデザイナであり、ボタンやスライダーにGUIを使って細かい設定ができる。このGUIを、そのままNSMatrixのPrototypeのデザインに使えるのだ。
下の図が、Interface Builderで、NSMatrixをデザインしている様子である。ここでは、NSButtonCellを配置している。
|
まず、NSMatrix自体の設定として、行と列の数や、XとYのスペースなどを設定できる。さらに、下にある「Match Prototype」と「Prototype」ボタンに注目してほしい。ここでPrototypeの設定を行うのだ。
まず、右下のPrototypeボタンを押す。すると、Prototypeの種類に応じた設定画面に移行する。ここでは、NSButtonCellを使っているので、ボタンを設定するための画面になる。その後、Match Prototypeボタンを押すと、その設定が全体に反映されるのだ。
Interface Builderでの編集結果は、ソースコードではなく、インスタンスのアーカイブとなる。NSMatrixのPrototypeとして指定するのはインスタンスであるので、そのまま使えることになる。Interface Builderの特徴と、Prototypeパターンが、うまくマッチした好例だろう。
| TI、リチウムイオンバッテリの駆動時間を延長させる急速充電技術を発表 [15:05 6/20] |
| イーソル、ルネサスのHMI向けMPU「RZ/A」シリーズをサポート [14:55 6/20] |
| NEDOなど、先進型イットリウム系超電導線材の低コスト長尺製造技術を確立 [14:49 6/20] |
| ルネサス、10MBのRAMを内蔵したハイエンドマイコン「RZ/A1」シリーズを発表 [14:39 6/20] |
| 筑波大と東工大、水泳ロボットを用いて泳動作の手部の推進力などを計測 [14:34 6/20] |
|
疲労回復を促す、運動後に着る機能性ウェアにネオンカラーTシャツ登場 [15:33 6/20] ライフ |
|
ビーズ、自動車に使われる軽量新素材を採用した、国内初省エネ自転車発売 [15:33 6/20] ライフ |
|
宮古島の雪塩を使った「ハウスとんがりコーン 雪塩バター味」発売 [15:33 6/20] ライフ |
|
"夏"を感じる素材が人気!! ストックフォト「PIXTA」、5月の利用動向を発表 [15:23 6/20] クリエイティブ |
|
[西山茉希]出産は「めちゃくちゃ怖い」 早乙女太一の立ち会い希望 [15:14 6/20] エンタメ |