92 votes

Qu'est-ce qu'un "Class Cluster" en Objective-C ?

J'ai lu que NSArray est justement une telle chose. Ça a l'air lourd. J'ai 7 gros livres sur Objective-C, Cocoa et C sur mon bureau. Aucun d'entre eux ne mentionne le Class Cluster, du moins je ne le trouve pas dans l'index à la fin des livres. Alors qu'est-ce que c'est ?

0 votes

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

2 votes

Pour information : récemment (décembre 2013), Apple a recommandé l'utilisation des clusters de classes comme moyen de gérer la rétrocompatibilité avec iOS 6 tout en utilisant iOS 7. C'était lors des Apple Tech Talks 2013/Berlin dans la session "Architecting Modern Apps, Part 2". Apple a indiqué qu'elle publierait des vidéos des sessions peu après le dernier événement (17 décembre). Peut-être cela aidera-t-il à comprendre les Class Clusters dans le contexte réel des changements apportés à iOS 6/7.

193voto

Frank C. Points 2630

Je ne sais pas ce que contient le CDP auquel Steve fait référence, mais en gros, le Class Cluster d'Objective-C est une construction qui permet d'implémenter l'abstraction Usine modèle.

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

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

A Laugh.h :

#define kLaughWithGuffaw  1
#define kLaughWithGiggle  2

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

En riant :

@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

24 votes

Alors que les autres réponses étaient bonnes et fournissaient des liens vers des documents et des livres, j'aime bien cette réponse parce qu'elle permet de voir facilement et simplement comment faire. Merci

0 votes

Cet exemple est bon mais dans un modèle Factory typique, les sous-classes sont publiques. Dans un cluster Class, les sous-classes sont privées. developer.apple.com/library/ios/documentation/general/

0 votes

Les sous-classes sont-elles privées par convention ou réellement privées ?

44voto

echo Points 3650

Dans les documents d'Apple... . En bref, il s'agit d'un modèle de conception utilisé dans le cadre de Foundation, ce qui explique probablement pourquoi il n'est pas mentionné dans les livres sur ObjC.

Un regroupement 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 publiquement visible.

1 votes

Roflmao. merci. je vais aller sur google la prochaine fois. je me suis dit que si ce n'est pas dans mes gros livres, ça ne peut être que sur vos têtes ;)

1 votes

La seule chose qui manque à ce lien est une explication sur la meilleure façon de modifier la mise en œuvre de l'ARC.

26voto

t011phr33 Points 161

Extrait de programming in objective c de Stephen Kochan, page 498 du glossaire, cluster :

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

5 votes

+1 Pour avoir cité une réponse tirée d'un livre sur Objective-C, compte tenu notamment de la question initiale. C'est un bon livre, aussi.

0 votes

(+1) pour l'excellente définition. Le problème que j'ai avec le fait d'appeler cela un pattern "Factory" est qu'un tel nom se concentre uniquement sur l'élément "Factory". création des objets, et non pas les interactions sous le capot des sous-classes privées gérées par la superclasse abstraite. En fait, le fait même de qualifier cette superclasse d'"abstraite" pourrait induire en erreur, car elle est en fait très dépendante (en interne) de ses propres sous-classes, et n'est donc pas une classe abstraite normale qui ne sait généralement rien de ses sous-classes.

18voto

quellish Points 5475

Les groupes de classes fournissent une interface publique unique à un groupe d'implémentations concrètes et privées de sous-classes. Un programmeur objective-c utilise souvent les clusters de classes sans s'en rendre compte - et c'est là tout l'intérêt d'un cluster de classes. Le rôle d'un cluster de classes est de cacher la complexité des détails d'implémentation derrière une interface publique.

De nombreuses classes de la Fondation sont des groupes de classes, tels que NSString, NSArray, NSDictionary et NSNumber. Lorsque vous appelez [NSString stringWithFormat:] le groupe de classes vous donne une classe concrète qui implémente la fonction NSString interface. Il peut s'agir d'un NSConcreteString , NSCFString , NSFooBarString etc. La classe que le cluster vous donne est basée sur le constructeur ou l'initialisateur que vous appelez et les arguments.

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

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

Si vous venez d'une autre langue, vous connaissez peut-être le modèle du Gang of Four. Les clusters de classes comportent des éléments de l'usine abstraite et des modèles de façade.

La documentation publique d'Apple couvre les clusters de classe (et la manière de les mettre en œuvre et de les étendre) de manière assez extensive. Malheureusement, j'ai constaté que pour de nombreux développeurs iOS, ce motif et d'autres motifs spécifiques à Cocoa constituent un angle mort.

Compétences de base du cacao : Groupe de classes

Guide des fondamentaux du cacao : Groupes de classes

Des exemples de l'implémentation de vos propres clusters de classes sont disponibles sur GitHub.

7voto

NSResponder Points 14459

Le groupe de classes NSArray n'est pas "lourd", c'est un moyen d'utiliser un nombre quelconque d'implémentations d'une classe de tableau sans que votre code ne connaisse 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 épars ou les tableaux contenant un nombre spécifique d'éléments connus au moment de la compilation.

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

6 votes

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

1 votes

@Chuck - Comment cela peut-il être le cas ? Si un NSMutableArray et un NSArray se déclarent comme étant de la même classe, ne serait-ce pas ? [myArray isKindOfClass:[NSMutableArray class]] renvoie un OUI alors qu'il ne devrait pas le faire ?

1 votes

@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 de dépendre de cela, car ils pourraient toujours le changer à nouveau.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X