【コラム】
前回は、Mediatorパターンの概要を紹介した。今回からは、Cocoaフレームワークの中で、このパターンを利用して解釈できるものを紹介しよう。
取り上げるのは、Cocoaアプリケーションの中でも中心的な概念になる、コントローラだ。
ある程度複雑なアプリケーションを設計する際に、言語やプラットフォームを問わず、広く使われている重要な概念がある。MVCアーキテクチャだ。アプリケーションの構成要素を、M(モデル)、V(ビュー)、C(コントローラ)の3つに分割するという考え方だ。Cocoaも、このアーキテクチャを全面的に採用している。
MVC自体は一般的な考え方であり、それをどのように採用しているかは、言語やフレームワークによって微妙に異なる。Cocoaの考え方では、コントローラが最も重要となる。というのは、MVCの3つの構成要素のうち、ビューはCocoaフレームワークが提供する。それをそのまま使えば、ほぼ問題ない。モデルは、書類を保存するタイプのアプリケーションでは重要になる。だが、ユーティリティのように編集対象がないアプリケーションでは、必要なくなる。
ということで、Cocoaアプリケーションを作るときは、まずコントローラから作り始めることになる。ビューやモデルは、他のアプリケーションでも再利用できるように考慮して設計すべきだが、コントローラはそのアプリケーションの専用のものになるだろう。主となるビジネスロジックも、コントローラに実装することが多い。
CocoaのMVCでは、コントローラがアプリケーションの多くの役割を担う。これは、コントローラ万能主義とも言えるかもしれない。
そのCocoaのコントローラだが、GoFのデザインパターンを使って解釈してみると、MediatorパターンにおけるMediatorの役割を担っている、と捉えることが出来るだろう。
Cocoaフレームワークは、ビューとなるクラスはたくさん用意している。ビューはユーザインタフェースとなる部品で、ウインドウ、ボタン、スライダー、ポップアップメニュー、スクロールバー、テキストフィールドなどがある。だが、これらのほとんどは、互いに独立して動作するように設計されている。もちろん、再利用性を高めるためだ。
実際にアプリケーションを作成するときは、これらの部品を連携させて動作させる必要がある。それを行うのが、コントローラだ。つまり、ビュー同士の働きを、仲介する立場にある訳だ。Mediatorパターンの言葉を使えば、コントローラはMediator、ビューはColleagueと言うことが出来るだろう。
では、MediatorとColleagueとの間、つまりコントローラとビューの間のやり取りはどうなっているのだろうか。ビューを汎用的な部品とするには、ここの結びつきは出来るだけ弱くしておきたい。
まず、MediatorからColleague、つまりコントローラからビューへのアクセスを考えてみよう。この場合は、コントローラをビューにあわせて作り込むことになる。ビューは、そのクラスによって、独自のAPIを提供している。ボタンならボタンのAPI、スライダーならスライダーのAPIがある訳だ。これらを、アプリケーションの目的にあわせて、コントローラが利用する。コントローラはアプリケーションごとに専用になるので、ここでは汎用化は必要ない。この実装を行うのが、アプリケーション作成の中心となるだろう。
問題は、ColleagueからMediator、つまりビューからコントローラへのアクセスだ。これがコントローラごとに変わるのではいただけない。ビューを汎用的な部品にするには、このアクセスも汎用的にしたい。
Cocoaで使われているのは、ターゲット/アクションの考え方だ。それぞれのビューでは、ユーザの操作に応じて、「アクション」を起こす。アクションの発生のさせ方は、インタフェースによって異なる。たとえば、ボタンであれば、ボタンをクリックしたときに発生する。スライダーであれば、ノブを動かして、表している値が変更されたときに発生する。
このアクションが発生したときに、ユーザが期待する、そのインタフェースが行うべき処理を行うのだ。もっと具体的に言えば、ビューの操作によって、コントローラのメソッドを呼び出し、そこで実装されているビジネスロジックを実行するのだ。
では、ビューはコントローラのどのメソッドを実装するのか。これは、コントローラがあらかじめ、ビューに対して実行してほしいメソッドを登録しておく、というスタイルになっている。このメソッドのことを、アクションメソッドと呼ぶ。
アクションメソッドとして登録出来るメソッドには、1つだけ条件がある。それは、引数として、id型の変数を1つ取ることだ。たとえば、次のようなメソッドがアクションメソッドとして使用出来る。
- (void)actionMethod:(id)sender;
アクションメソッッドになるための条件は、これだけだ。あとは、どんな名前のものでもいい。何か特定のクラスを継承して、そこに含まれるメソッドをオーバーライドして、などとしてやる必要はない。この考え方を、ターゲット/アクションパラダイムと呼ぶ。詳しくは、本連載の第4回も参考にしてほしい。
これが、ビューからコントローラへのアクセスとなる。Mediatorパターンの言葉を使えば、ColleagueからMediatorへの呼び出しは、汎用的なものになっている。Mediatorがあらかじめ継承しておくべき、AbstractMediatorのようなクラスは存在しない。従って、この結びつきは弱いと言えるだろう。
次回は、このコントローラをさらに汎用化させたものについて紹介しよう。MediatorとColleagueの結びつきは、極限まで弱くなる。
「Gears Geolocation API」がWi-Fi信号サポート、ノートPC対応を強化
【コラム】Hello Worldコレクション 第18回 続・X Window System編 - あえてメジャーではないツールキットを使う
| トマトを食べれば痩せられる!? -京大ら、新発見の成分で肥満改善効果を実証 [21:00 2/10] |
| JAXA、液体シリコン中に残存する共有結合を観察 -大口径ウェハの実現に期待 [20:11 2/10] |
| NEDOなど、熱膨張が小さな樹脂複合材料ペレットの量産化に成功 [19:22 2/10] |
| 理研、一般顕微鏡を蛍光顕微鏡に強化できるアダプタを試作して性能を実証 [19:15 2/10] |
| 天の川のブラックホールが小惑星を飲み込んでいる - NASAが発表 [18:08 2/10] |
|
坂本教授、木の光合成に着目した不思議な音楽的挑戦!『ETV特集』 [10:08 2/11] キャリア |
|
バロックで異端!水墨画の巨匠、雪村周継の神業に迫る! [10:07 2/11] キャリア |
|
元・宝塚の真琴つばさ、ドラマ初主演で小学生の母親役に挑戦! [10:07 2/11] キャリア |
|
「四大陸フィギュア」今夜は連覇のかかった高橋、昨年末復活した浅田、村上に注目! [10:07 2/11] キャリア |
|
【EU発!Breaking News】精神疾患治療のため?マラリア患者の血液を注射された男性。(オーストリア) [10:05 2/11] キャリア |