クラスクラスタ
クラスクラスタは、パブリック(public) な、抽象スーパークラスの下のプライベートな、具象サブクラスの数をグループ化する、アーキテクチャです。このような、クラスのグループ化は、パブリックに見えるアーキテクチャのみを見ているユーザーに、単純化したインタフェースを提供します。舞台裏では、しかし、抽象クラスは、特定のタスクを実行するための最も適したプライベートサブクラスを呼び出しています。例えば、一般的な Cocoa のクラスのいくつかは、NSArray、NSString、そして NSDictionary を含む、クラスクラスタとして実装されています。それらは、内部データ保存庫としての働きができる多くの方法があります。特定のインスタンスの場合は、抽象クラスは、インスタンスが初期化されるデータに基づいて、使用する最も効率的なクラスを選択します。
クラスタのインスタンスを、他のすべてのクラスと全く同じように作成し、相互作用できます。舞台裏では、しかし、パブリッククラスのインスタンスを作成する時に、クラスは呼び出した作成メソッドに基づいて適切なサブクラスのオブジェクトを返します。(あなたは、インスタンスの実際のクラスを選択しませんし、できません。)
例として、Foundation フレームワークの NSString のクラスを例として取りあげ、3つの異なる文字列オブジェクトを作成してみましょう。
NSString *string1 = @"UTF32.txt"; NSString *string2 = [NSHomeDirectory() stringByAppendingPathComponent:string1]; NSTextStorage *storage = [[NSTextStorage alloc] initWithString:string2]; NSString *string3 = [storage string];
各文字列は、異なるプライベートサブクラス(実際には、OS X v10.5では、それぞれは) のインスタンスです。各オブジェクトは、NSString のプライベートサブクラスですが、各オブジェクトは NSString のクラスのインスタンスと考えると便利です。もしそれらが NSString 自身のインスタンスならば、NSString で宣言されたインスタンスメソッドを使うようにして下さい。
利点
クラスクラスタの利点は、主に効率です。インスタンスが管理するデータの内部表現は、それが作成されるか、使用されている方法に合わせて調整できます。また、書いたコードは、基本となる実装の変更があっても動き続けます。
検討事項
クラスクラスタアーキテクチャは、シンプルさと拡張性の間での交換を含みます。いくつかのパブリック·クラスはプライベート・クラスの多数の代わりをし、フレームワークのクラスを学んで使用することが容易になりますが、クラスタのいずれかの中にサブクラスを作成することがやや困難になります。
クラスクラスタ内に作成する新しいクラスは以下のようでなければなりません:
- クラスタの抽象スーパークラスのサブクラスである
- 独自のストレージを宣言する
- スーパークラスのプリミティブメソッドをオーバーライドする
Foundation フレームワーク内のクラスクラスタの場合のように、サブクラスを作成する必要がほとんどない場合は、クラスタアーキテクチャは明らかに有益です。また、composition を使用してサブクラス化を回避することもできるかもしれません。自身の設計のオブジェクト内でプライベート・クラスタ・オブジェクトを埋め込むことで、複合オブジェクトを作成できます。この複合オブジェクトは、それが何らかの特定の方法で処理したいメッセージを傍受した時のみ、その基本的な機能のためにクラスタ・オブジェクトに依存します。このアプローチを使用すると、書かなければならないコードの量を減らし、Foundation フレームワークに用意されているテストされたコードを利用できます。
前提条件の記事
(なし)
関連記事
(なし)
既出の議論
クラスクラスタ
次の章
前の章