web-dev-qa-db-fra.com

Qu'est-ce qu'un soi-disant "cluster de classes" dans Objective-C?

Je lisais que NSArray est exactement une telle chose. Cela semble lourd. J'ai 7 livres vraiment gros ici sur mon bureau à propos d'Objective-C, Cocoa et C. Aucun d'entre eux ne mentionne du tout le cluster de classe, du moins je ne le trouve pas dans l'index à la fin des livres. Alors qu'est-ce que c'est?

89
openfrog

D'après les documents d'Apple ... . En bref, c'est un modèle de conception utilisé dans le cadre de la Fondation, c'est probablement pourquoi il n'est pas mentionné dans les livres ObjC.

Un cluster de classes est une architecture qui regroupe un certain nombre de sous-classes privées et concrètes sous une superclasse publique et abstraite. Le regroupement de classes de cette manière fournit une interface simplifiée à l'utilisateur, qui ne voit que l'architecture visible publiquement.

39
echo

Je ne sais pas ce qui est dans le CDP auquel Steve a fait référence, mais fondamentalement, le cluster de classe Objective-C est une construction qui prend en charge la mise en œuvre du modèle abstrait Factory .

Le idée est simple : vous voulez fournir une interface Factory (Cluster) qui, avec une description minimale, fabrique et renvoie une instance concrète spécifique d'un objet Factory qui satisfait le comportement de la famille de cluster décrite par l'interface Factory (Cluster).

Un exemple concret simple : Cet exemple fournit une fabrique de rire qui produit des classes concrètes de types de rire spécifiques (par exemple Guffaw, Giggle). Faites attention à la méthode Laugh initWithLaughter:.

Dans Laugh.h:

#define kLaughWithGuffaw  1
#define kLaughWithGiggle  2

@interface Laugh: NSObject {}
- (Laugh *) initWithLaughter:(NSUInteger) laughterType;
- (void) laugh;
@end

In 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.

Extrait de la programmation de l'objectif C par Stephen Kochan à la page 498 du glossaire, cluster:

Une classe abstraite qui regroupe un ensemble de sous-classes concrètes privées, fournissant une interface simplifiée à l'utilisateur via la classe abstraite.

25
t011phr33

Les clusters de classes fournissent une interface publique unique à un groupe d'implémentations concrètes de sous-classes privées. Un programmeur objective-c utilise souvent des clusters de classe et s'en rend rarement compte - et c'est tout l'intérêt d'un cluster de classe. Le travail d'un cluster de classe consiste à masquer la complexité des détails d'implémentation derrière une interface publique.

De nombreuses classes Foundation sont des clusters de classes, tels que NSString, NSArray, NSDictionary et NSNumber. Quand vous appelez [NSString stringWithFormat:] le cluster de classes vous donne une classe concrète qui implémente l'interface NSString. Il peut s'agir d'un NSConcreteString, NSCFString, NSFooBarString, etc. Ce que le cluster de classes vous donne est basé sur le constructeur ou l'initialiseur que vous appelez et les arguments.

Pour cette raison, les clusters de classes sont l'un des concepts les plus stimulants de la programmation Objective-C.

  • Très facile à mettre en œuvre
  • Facile à changer l'implémentation sous-jacente sans changer le code qui l'appelle.
  • Facile à fournir différentes implémentations concrètes lors de l'exécution (c'est-à-dire des ressources de test ou des objets fictifs)
  • En raison de ce qui précède, facile à tester et à refactoriser

Si vous venez d'autres langues, vous connaissez peut-être les modèles Gang of Four. Les groupes de classes ont des éléments de l'usine abstraite et des motifs de façade.

La documentation publique d'Apple couvre les clusters de classes (et comment les implémenter et les étendre) de manière assez approfondie. Malheureusement, j'ai constaté que pour de nombreux développeurs iOS, cela et d'autres modèles spécifiques à Cocoa sont un angle mort.

Cocoa Core Competencies: Class cluster

Cocoa Fundamentals Guide: Class Clusters

Des exemples sur la façon d'implémenter vos propres clusters de classes sont disponibles sur GitHub

18
quellish

Le cluster de classes NSArray n'est pas "lourd", c'est un moyen pour un certain nombre d'implémentations d'une classe de tableau d'être utilisé sans que votre code ne connaisse ou se soucie de l'implémentation particulière. Sous le capot, il existe des sous-classes concrètes de NSArray qui conviennent à différents cas d'utilisation, tels que les grands tableaux clairsemés ou les tableaux contenant un nombre spécifique d'éléments connus au moment de la compilation.

NSArray, NSString et NSNumber sont les clusters de classes que vous rencontrerez le plus souvent.

7
NSResponder