Facadeパターンとは

今回からは、Facadeパターンを取り上げよう。Facadeは、複雑な構造に対して、簡単に使えるようにする「窓口」を提供するためのパターンだ。

プログラミングを行うときは、クラス構成などをできる限りシンプルにしておくのが鉄則だ。だが、ある程度複雑な機能を提供しようと思ったら、どうしてもクラス構成が複雑になってしまう。複雑な構成のクラス群を使いこなすのは、難しい。すべてのクラスを把握した上で使うのがもちろん望ましいが、そうも言っていられないときも多い。

そこで、その機能全体の窓口となるクラスを用意するようにしよう。そのクラス(1つか数個)を使えば、基本的な機能は簡単に使用できるようにしておく。これが、Facadeパターンの考え方だ。

この、ある機能にアクセスするための、ラッパーとなるクラスを用意するという形は、AdapterパターンやBridgeパターンとも似ている。それらと比べたときのFacadeパターンの特徴は、背後にある複雑なクラス群を非公開にする必要はない、ということだ。窓口クラスが提供するのは、あくまで基本的な操作のみだ。もっと細かい制御を行いたいときは、背後のクラスに直接アクセスすることができる。

テキストビュー

さて、いつもの流れでいくならば、次にFacadeパターンのObjective-Cでの実装を紹介することになる。だが、Facadeパターンの場合は、そのパターンが従わなくてはいけないクラス階層のようなものはない。そこで、いきなりCocoaでの実例を紹介していこう。

今回取り上げるのは、テキストの編集機能だ。テキストエディタのように、テキストの表示や編集を行うことができるビューで、多くのアプリケーションで使われる基本機能の1つだ。

テキストビュー

ここで、テキストの編集を行うビューを一から作ることを想像してみてほしい。少しでもプログラミングの経験がある方ならわかると思うが、恐ろしく大変な作業になるだろう。なぜなら、求められる機能が膨大だからだ。テキストの保持、画面上での文字列のレイアウト、効率的なグリフ情報の取得、フォントや色などの属性の付加、キーボードやマウスイベントによる編集など、少し考えただけでもやらなくてはいけないことがたくさん出てくる。そして、このような複雑な機能を提供するには、クラス構成も自然と複雑になってくる。

このようなときが、Facadeパターンの出番となる。

FacadeとしてのNSTextView

Cocoaでは、もちろん、高機能なテキスト編集機能が提供されている。どのくらい高機能かというと、Mac OS Xに標準で付属する、テキストエディットアプリケーションでもそのまま使われているほどだ。

この機能は多くのクラスによって実現されている。だが、自分のアプリケーションで使うのは簡単だ。ある1つのクラスを通して、基本的な機能はすべて使うことができるからだ。つまり、Facadeパターンが使われているとみなすことができる。その窓口となるクラスは、NSTextViewだ。

NSTextViewと、その継承元であるNSTextのメソッドを使えば、テキスト編集のプログラミングで必要になる基本的な機能はすべて使うことができる。たとえば、テキストのビューに文字列を設定したり、ユーザが編集した文字列を取得するには、次のNSTextのメソッドが使える。

NSText.h

- (NSString*)string;
- (void)setString:(NSString*)string;

他にも、フォントや色の設定、編集中の選択領域の管理など、一通りのメソッドが揃っている。

テキスト編集機能の構造

NSTextViewをFacadeとみなしたのは、その背後にあるクラス群も公開されているからだ。それを紹介しよう。

NSTextViewを作成すると、同時にこれだけのクラスが背後で作られることになる。

NSTextViewに関連するクラス

一通り、簡単に説明しておこう。

  • NSTextView, NSText - テキスト機能の窓口となるクラス

  • NSTextContainer - 文字を描画する領域を規定する

  • NSLayoutManager - テキストのレイアウトを行う。また、テキストのグリフ情報も管理する

  • NSTextStorage, NSMutalbeAttributedString - テキスト自体を保持する

  • NSGlyphGenerator - グリフ情報を取得する

  • NSTypeSetter - 行のレイアウトを行う

単純なテキスト編集以上の処理を行いたい場合は、これらのクラスに直接アクセスすることになる。1つのサンプルを紹介しよう。文字を円形に配置するCircleViewサンプルだ。開発環境のサンプルとして付属する。このサンプルでは、NSLayoutManagerにアクセスしてグリフ情報を取得し描画を行なっている。

CircleViewサンプルの画面

というわけで、通常のテキスト編集を行いたいときは、FacadeにあたるNSTextViewを使用する。特殊な処理を行いたいときは、その背後にあるクラスにアクセスする、という使い分けができているのだ。

提供:毎日キャリアバン ク

毎日キャリアバンクではITエンジニア出身のキャリアコンサルタントで形成する IT専門のチームを編成し、キャリアに応じた専任コンサルタントがご相談を承り ます。キャリアチェンジから市場価値の可能性、ご収入などの相談から面接のア ドバイスまでお気軽にご相談ください。求人情報誌や転職情報サイトなどで一般 に公開されていないような「急募求人案件」も随時ご紹介が可能です。まずはご 登録ください!