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?
Répondre
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.
oui, les fruits à portée de main que vous connaissez ... – echo
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
La seule chose que ce lien manque est une explication sur la meilleure façon de modifier l'implémentation pour ARC. – Hyperbole
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.
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
@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
@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
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.
+1 Pour avoir cité une réponse d'un bo ok, surtout compte tenu de la question initiale. C'est un bon livre aussi. –
(+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
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
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 pour le petit exemple !! – TheTiger
+1 pour l'explication gentille et efficace ... !!!! keep it up ..... – Kamarshad
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
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. –
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