NSArrayはまさにそのようなものだと読んでいました。重いですね。 Objective-C、Cocoa、Cについては、机の上に7つの非常に太い本があります。クラスクラスターについてはまったく言及していません。少なくとも、本の最後のインデックスで見つけることはできません。それは何ですか?
Appleのドキュメントから... 。要するに、それはFoundationフレームワークで使用されるデザインパターンであり、それがおそらくObjCの本で言及されていない理由です。
クラスクラスターは、パブリックな抽象スーパークラスの下に、多くのプライベートな具体的なサブクラスをグループ化するアーキテクチャです。このようにクラスをグループ化することにより、ユーザーに簡素化されたインターフェイスが提供され、ユーザーは公開されているアーキテクチャのみを見ることができます。
Steveが参照したCDPの内容はわかりませんが、基本的にObjective-Cクラスクラスターは、抽象 Factory パターンの実装をサポートする構造です。
ideaはシンプルです:最小限の説明でファクトリ(クラスター)インターフェースを提供したい場合、Factory(Cluster)インターフェースによって記述されるクラスターファミリの動作を満たすFactoryオブジェクトの特定の具体的なインスタンスを製造して返します。
簡単な具体例:この例は、特定の笑いのタイプの具体的なクラス(Guffaw、Giggleなど)を生成するLaughファクトリーを提供します。 Laugh initWithLaughter:メソッドに注意してください。
Laugh.hで:
#define kLaughWithGuffaw 1
#define kLaughWithGiggle 2
@interface Laugh: NSObject {}
- (Laugh *) initWithLaughter:(NSUInteger) laughterType;
- (void) laugh;
@end
Laugh.mで:
@interface Guffaws:Laugh {}
- (void) laugh;
@end
@interface Giggles:Laugh {}
- (void) laugh;
@end
@implementation Laugh
- (Laugh *) initWithLaughter:(NSUInteger) laugherType {
id instanceReturn=nil;
; // Removed for ARC [self release]
if ( laughterType == kLaughWithGuffaw )
instanceReturn = [[Guffaws alloc]init];
else if( laughterType == kLaughWithGiggle )
instanceReturn = [[Giggles alloc]init];
else
; // deal with this
return instanceReturn;
}
- (void) laugh {
NSLog(@"Humbug");
}
@end
@implementation Guffaws
- (void) laugh {
NSLog(@"OH HA HA HOWAH HA HA HA");
}
@end
@implementation Giggles
- (void) laugh {
NSLog(@"Tee hee");
}
@end
用語集クラスターの498ページのStephen KochanによるObjective Cでのプログラミングから:
プライベートコンクリートサブクラスのセットをグループ化する抽象クラス。抽象クラスを介してユーザーに簡素化されたインターフェイスを提供します。
クラスクラスターは、具体的なプライベートサブクラス実装のグループに単一のパブリックインターフェイスを提供します。 Objective-Cプログラマーはクラスクラスターを頻繁に使用し、めったにそれを実現しません。これがクラスクラスターのポイントです。クラスクラスタの仕事は、パブリックインターフェイスの背後に実装の詳細の複雑さを隠すことです。
Foundationクラスの多くは、NSString、NSArray、NSDictionary、NSNumberなどのクラスクラスターです。 [NSString stringWithFormat:]
を呼び出すと、クラスクラスターはNSString
インターフェイスを実装する具体的なクラスを提供します。クラスクラスターが提供するNSConcreteString
、NSCFString
、NSFooBarString
などになります。呼び出すクラスターまたはイニシャライザーと引数に基づきます。
このため、クラスクラスターは、Objective-Cプログラミングの最も強力な概念の1つです。
他の言語を使用している場合、Gang of Fourパターンに精通しているかもしれません。クラスクラスタには、抽象ファクトリとファサードパターンの両方の要素があります。
Appleの公開ドキュメンテーションは、クラスクラスター(およびそれらの実装および拡張方法)を非常に広範囲にカバーしています。残念ながら、多くのiOS開発者にとって、このパターンやその他のCocoa固有のパターンは盲点であることがわかりました。
NSArrayクラスクラスターは「ヘビーウェイト」ではありません。特定の実装をコードが認識したり、気にしたりせずに、配列クラスの任意の数の実装を使用する方法です。内部では、NSArrayの具体的なサブクラスがあります。これは、大規模なスパース配列、またはコンパイル時に既知の特定の数の要素を含む配列など、さまざまなユースケースに適しています。
NSArray、NSString、およびNSNumberは、最も頻繁に発生するクラスクラスターです。