web-dev-qa-db-ja.com

Objective-Cのいわゆる「クラスクラスター」とは正確には何ですか?

NSArrayはまさにそのようなものだと読んでいました。重いですね。 Objective-C、Cocoa、Cについては、机の上に7つの非常に太い本があります。クラスクラスターについてはまったく言及していません。少なくとも、本の最後のインデックスで見つけることはできません。それは何ですか?

89
openfrog

Appleのドキュメントから... 。要するに、それはFoundationフレームワークで使用されるデザインパターンであり、それがおそらくObjCの本で言及されていない理由です。

クラスクラスターは、パブリックな抽象スーパークラスの下に、多くのプライベートな具体的なサブクラスをグループ化するアーキテクチャです。このようにクラスをグループ化することにより、ユーザーに簡素化されたインターフェイスが提供され、ユーザーは公開されているアーキテクチャのみを見ることができます。

39
echo

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
191
Frank C.

用語集クラスターの498ページのStephen KochanによるObjective Cでのプログラミングから:

プライベートコンクリートサブクラスのセットをグループ化する抽象クラス。抽象クラスを介してユーザーに簡素化されたインターフェイスを提供します。

25
t011phr33

クラスクラスターは、具体的なプライベートサブクラス実装のグループに単一のパブリックインターフェイスを提供します。 Objective-Cプログラマーはクラスクラスターを頻繁に使用し、めったにそれを実現しません。これがクラスクラスターのポイントです。クラスクラスタの仕事は、パブリックインターフェイスの背後に実装の詳細の複雑さを隠すことです。

Foundationクラスの多くは、NSString、NSArray、NSDictionary、NSNumberなどのクラスクラスターです。 [NSString stringWithFormat:]を呼び出すと、クラスクラスターはNSStringインターフェイスを実装する具体的なクラスを提供します。クラスクラスターが提供するNSConcreteStringNSCFStringNSFooBarStringなどになります。呼び出すクラスターまたはイニシャライザーと引数に基づきます。

このため、クラスクラスターは、Objective-Cプログラミングの最も強力な概念の1つです。

  • 実装が非常に簡単
  • 呼び出すコードを変更せずに、基礎となる実装を簡単に変更できます。
  • 実行時に異なる具体的な実装を簡単に提供できます(つまり、テストリソースまたはモックオブジェクト)
  • 上記のため、テストとリファクタリングが簡単

他の言語を使用している場合、Gang of Fourパターンに精通しているかもしれません。クラスクラスタには、抽象ファクトリとファサードパターンの両方の要素があります。

Appleの公開ドキュメンテーションは、クラスクラスター(およびそれらの実装および拡張方法)を非常に広範囲にカバーしています。残念ながら、多くのiOS開発者にとって、このパターンやその他のCocoa固有のパターンは盲点であることがわかりました。

ココアコアコンピテンシー:クラスクラスター

ココアの基礎ガイド:クラスクラスター

GitHubで独自のクラスクラスターを実装する方法の例が利用可能です

18
quellish

NSArrayクラスクラスターは「ヘビーウェイト」ではありません。特定の実装をコードが認識したり、気にしたりせずに、配列クラスの任意の数の実装を使用する方法です。内部では、NSArrayの具体的なサブクラスがあります。これは、大規模なスパース配列、またはコンパイル時に既知の特定の数の要素を含む配列など、さまざまなユースケースに適しています。

NSArray、NSString、およびNSNumberは、最も頻繁に発生するクラスクラスターです。

7
NSResponder