Che cosa è esattamente un cosiddetto “Class Cluster” in Objective-C?

Stavo leggendo che NSArray è solo una cosa del genere. Sembra pesante. Ho 7 libri davvero grossi qui sulla mia scrivania su Objective-C, Cocoa e C. Nessuno di loro menziona affatto il Cluster di class, almeno non riesco a trovarlo nell’Index sul retro dei libri. Allora, cos’è?

Dai documenti di Apple … In breve, è un modello di progettazione utilizzato nel framework Foundation, che probabilmente è il motivo per cui non è menzionato nei libri ObjC.

Non so cosa ci sia nel CDP a cui Steve fa riferimento, ma fondamentalmente l’Objective-C Class Cluster è un costrutto che supporta l’implementazione del pattern Factory astratto.

L’ idea è semplice : vuoi fornire un’interfaccia Factory (Cluster) che, con una descrizione minima, produce e restituisce una specifica istanza concreta di un object Factory che soddisfa il comportamento della famiglia di cluster descritta dall’interfaccia Factory (Cluster).

Un semplice esempio concreto : questo esempio fornisce una fabbrica Laugh che produce classi concrete di tipi specifici di risate (ad es. Guffaw, Giggle). Presta attenzione alla riscrittura initWithLaughter: metodo.

In 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 

Dalla programmazione nell’objective c di Stephen Kochan a pagina 498 nel glossario, cluster:

Una class astratta che raggruppa un insieme di sottoclassi di calcestruzzo privato, fornendo un’interfaccia semplificata all’utente attraverso la class astratta.

I cluster di class forniscono un’interfaccia pubblica unica per un gruppo di implementazioni di sottoclassi concrete e private. Un programmatore di obiettivi-c utilizza spesso cluster di class e raramente lo realizza – e questo è il punto centrale di un cluster di classi. Il compito di un cluster di class è quello di hide la complessità dei dettagli di implementazione dietro un’interfaccia pubblica.

Molte delle classi Foundation sono cluster di classi, come NSString, NSArray, NSDictionary e NSNumber. Quando chiami [NSString stringWithFormat:] il cluster di class ti fornisce una class concreta che implementa l’interfaccia NSString . Potrebbe trattarsi di un NSConcreteString , NSCFString , NSFooBarString , ecc. Il cluster di classi NSFooBarString si basa sul costruttore o sull’inizializzatore che si sta chiamando e sugli argomenti.

Per questo motivo, i clusters di class sono uno dei concetti più potenti nella programmazione Objective-C.

  • Molto facile da implementare
  • Facile cambiare l’implementazione sottostante senza modificare il codice che la chiama.
  • Facile da fornire diverse implementazioni concrete in fase di esecuzione (es. Risorse di test o oggetti mock)
  • A causa di quanto sopra, facile da testare e refactoring

Se provieni da altre lingue potresti avere familiarità con i modelli di Gang of Four. I cluster di class hanno elementi sia della fabbrica astratta che dei modelli di facciata.

La documentazione pubblica di Apple copre i cluster di class (e come implementarli ed estenderli) in modo piuttosto estensivo. Sfortunatamente, ho scoperto che per molti sviluppatori iOS questo e altri pattern specifici di Cocoa sono un punto cieco.

Competenze del cocoa: gruppo di classi

Cocoa Fundamentals Guide: Class Clusters

Esempi di come implementare i propri cluster di class sono disponibili su GitHub

Il cluster di class NSArray non è “pesante”, è un modo per qualsiasi numero di implementazioni di una class di array da utilizzare senza che il tuo codice conosca o si preoccupi della particolare implementazione. Sotto il cofano ci sono sottoclassi concrete di NSArray che sono appropriate a diversi casi d’uso, come grandi array sparsi o array contenenti un numero specifico di elementi che sono noti al momento della compilazione.

NSArray, NSString e NSNumber sono i cluster di class che incontrerai più spesso.