objective-c cocoa cocoa-design-patterns class-cluster

objective c - ¿Qué es exactamente un llamado "Grupo de clase" en Objective-C?



cocoa cocoa-design-patterns (5)

Estaba leyendo que NSArray es una cosa así. Suena pesado Tengo 7 libros muy gordos aquí en mi escritorio sobre Objective-C, Cocoa y C. Ninguno de ellos menciona el Clúster de Clase en absoluto, al menos no lo puedo encontrar en el Índice al final de los libros. Entonces, ¿qué es eso?


De la programación en el objetivo c de Stephen Kochan en la página 498 en el glosario, clúster:

Una clase abstracta que agrupa un conjunto de subclases particulares privadas, proporcionando una interfaz simplificada para el usuario a través de la clase abstracta.


El clúster de clase NSArray no es "pesado", es una forma de utilizar cualquier cantidad de implementaciones de una clase de matriz sin que su código conozca o se preocupe por la implementación en particular. Debajo del capó, hay subclases concretas de NSArray que son apropiadas para diferentes casos de uso, como matrices dispersas grandes o matrices que contienen un número específico de elementos que se conocen en tiempo de compilación.

NSArray, NSString y NSNumber son los clústeres de clases que más a menudo encontrará.


Los clústeres de clase proporcionan una única interfaz pública para un grupo de implementaciones de subclases concretas y privadas. Un programador de Object-c usa clústeres de clase a menudo y rara vez se da cuenta de ello, y este es el objetivo de un clúster de clase. El trabajo de un grupo de clase es ocultar la complejidad de los detalles de implementación detrás de una interfaz pública.

Muchas de las clases de Foundation son clústeres de clases, como NSString, NSArray, NSDictionary y NSNumber. Cuando llama a [NSString stringWithFormat:] el clúster de clases le proporciona una clase concreta que implementa la interfaz NSString . Podría ser un NSConcreteString , NSCFString , NSFooBarString , etc. Lo que el clúster de clase le da se basa en el constructor o inicializador que está llamando y los argumentos.

Debido a esto, los clusters de clase son uno de los conceptos más enriquecedores en la programación de Objective-C.

  • Muy fácil de implementar
  • Fácil de cambiar la implementación subyacente sin cambiar el código que lo llama.
  • Fácil de proporcionar diferentes implementaciones concretas en tiempo de ejecución (es decir, recursos de prueba u objetos simulados)
  • Debido a lo anterior, es fácil de probar y refactorizar

Si vienes de otros idiomas, puedes estar familiarizado con los patrones de la Banda de los Cuatro. Los clústeres de clase tienen elementos tanto de la fábrica abstracta como de los patrones de fachada.

La documentación pública de Apple cubre los grupos de clases (y cómo implementarlos y ampliarlos) bastante extensamente. Desafortunadamente, he descubierto que para muchos desarrolladores de iOS, este y otros patrones específicos de cacao son un punto ciego.

Competencias principales de Cocoa: clúster de clase

Guía de conceptos básicos de cacao: clústeres de clase

Ejemplos de cómo implementar sus propios clústeres de clase están disponibles en GitHub


No sé qué hay en el CDP al que se refirió Steve, pero básicamente el Objective-C Class Cluster es una construcción que admite la implementación del patrón abstracto de Factory .

La idea es simple : desea proporcionar una interfaz Factory (Cluster) que, con una descripción mínima, fabrique y devuelva una instancia concreta específica de un Factory Object que satisfaga el comportamiento de la familia de clústeres descrito por la interfaz Factory (Cluster).

Un simple ejemplo concreto : este ejemplo proporciona una fábrica de Laugh que produce clases concretas de tipos específicos de risa (por ejemplo, Guffaw, Giggle). Preste atención al método Laugh 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


De los documentos de Apple ... En resumen, es un patrón de diseño utilizado en el marco de la Fundación, que es probablemente la razón por la que no se menciona en los libros de ObjC.