2009-12-04 10 views
84

Je lisais que NSArray est juste une chose pareille. Cela semble lourd. J'ai 7 livres vraiment gros sur mon bureau sur Objective-C, Cocoa et C. Aucun d'entre eux ne mentionne le Class Cluster, au moins je ne peux pas le trouver dans l'Index à la fin des livres. Alors qu'est-ce que c'est?Qu'est-ce qu'un «cluster de classes» en Objective-C?

+0

Oops, la prochaine fois que je vais y ajouter un lien pour ce terme. Si vous aviez commenté la réponse à votre question précédente, j'y aurais répondu. –

+2

FWIW: récemment (déc. 2013) Apple a recommandé d'utiliser les Class Clusters pour gérer la rétrocompatibilité avec iOS 6 en utilisant iOS 7. C'était sur Apple Tech Talks 2013/Berlin dans la session "Architecting Modern Apps, Part 2". Apple a déclaré qu'ils publieront des vidéos des sessions peu après le dernier événement (17 décembre). Alors peut-être que cela aidera à comprendre les clusters de classe dans le contexte actuel des changements iOS 6/7. – brainray

Répondre

38

From Apple's docs.... En bref, c'est un modèle de conception utilisé dans le cadre de la Fondation, ce qui explique probablement pourquoi il n'est pas mentionné dans les livres ObjC.

+6

oui, les fruits à portée de main que vous connaissez ... – echo

+1

roflmao. Merci. va google la prochaine fois. pensé que ce n'est pas dans mes gros livres, il ne peut être que sur vos têtes;) – openfrog

+1

La seule chose que ce lien manque est une explication sur la meilleure façon de modifier l'implémentation pour ARC. – Hyperbole

7

Le cluster de classe NSArray n'est pas un "poids lourd", c'est un moyen d'utiliser n'importe quel nombre d'implémentations d'une classe de tableau sans que votre code ne sache ou ne 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 à la compilation. NSArray, NSString et NSNumber sont les clusters de classe que vous rencontrerez le plus souvent.

+5

Ironiquement, en pratique, une seule classe concrète par cluster est utilisée - NSCF {Array | String | Number} - et les changements d'implémentation sont internes à cette classe. Pour autant que je sache, même les instances NSArray et NSMutableArray montrent la même classe – Chuck

+1

@Chuck - comment cela peut-il être le cas? Si un NSMutableArray et NSArray se sont déclarés être la même classe ne serait pas [myArray isKindOfClass: [NSMutableArray class]] 'renvoie YES même si ce n'est pas le cas – Robert

+1

@Robert: Et effectivement, c'était le cas au moment de mon commentaire Aujourd'hui, Apple a remplacé NSCFArray par __NSArrayM et __NSArrayI, donc je pense que ce n'est plus le cas, mais Je ne me sentirais toujours pas à l'aise, car ils pourraient toujours le changer à nouveau – Chuck

24

De la programmation en c objective par Stephen Kochan à la page 498 dans le glossaire, cluster:

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

+5

+1 Pour avoir cité une réponse d'un bo ok, surtout compte tenu de la question initiale. C'est un bon livre aussi. –

+0

(+1) pour l'excellente définition. Le problème que j'ai avec l'appel d'un modèle "Factory" est qu'un tel nom se concentre uniquement sur la * création * d'objets, et non sur les interactions sous-jacentes des sous-classes privées gérées par la superclasse abstraite. En effet, même appeler cette superclasse "abstraite" pourrait être trompeur car il dépend en fait (intérieurement) de ses propres sous-classes, et n'est donc pas une classe abstraite normale qui ne connaît généralement pas ses sous-classes. – devios1

185

Je ne sais pas ce qui est dans le CDP que Steve référencé mais, fondamentalement, la Classe Objective-C Cluster est une construction qui prend en charge la mise en œuvre du modèle Factory abstrait.

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

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

En Laugh.h:

#define kLaughWithGuffaw 1 
#define kLaughWithGiggle 2 

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

En 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 
+22

Alors que les autres réponses étaient bonnes en fournissant des liens doc et livre, j'aime ça parce que ça rend agréable et simple de voir comment faire cela. Merci – jamone

+1

+1 pour le petit exemple !! – TheTiger

+0

+1 pour l'explication gentille et efficace ... !!!! keep it up ..... – Kamarshad

16

clusters de classe fournissent une seule interface publique à un groupe de béton, les implémentations de sous-classe privée. Un programmeur d'objectifs-c utilise souvent des grappes de classes et le réalise rarement - et c'est tout le point 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.

La plupart des classes Foundation sont des clusters de classe, tels que NSString, NSArray, NSDictionary et NSNumber. Lorsque vous appelez [NSString stringWithFormat:], le cluster de classe 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 classe vous donne dépend du constructeur ou de l'initialisateur que vous appelez et des arguments.Pour cette raison, les clusters de classe sont l'un des concepts les plus habilitants dans la programmation Objective-C.

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

Si vous venez d'autres langues que vous connaissez peut-être la bande des quatre modèles. Les classes ont des éléments de l'usine abstraite et des modèles de façade.

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

Cocoa Core Competencies: Class cluster

Cocoa Fundamentals Guide: Class Clusters

Examples of how to implement your own class clusters are available on GitHub