Estaba leyendo que NSArray es tal cosa. Suena pesado. Tengo 7 libros realmente gordos aquí en mi escritorio sobre Objective-C, Cocoa y C. Ninguno de ellos menciona Class Cluster en absoluto, al menos no puedo encontrarlo en el Índice al final de los libros. Entonces, ¿qué es eso?
objective-c
cocoa
cocoa-design-patterns
class-cluster
rana abierta
fuente
fuente
Respuestas:
A partir de documentos de Apple ... . En resumen, es un patrón de diseño utilizado en el marco de la Fundación, por lo que probablemente no se menciona en los libros de ObjC.
fuente
No sé qué hay en el CDP al que hizo referencia Steve, pero básicamente el clúster de clase Objective-C es una construcción que admite la implementación del patrón abstracto de fábrica .
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úster descrita por la interfaz Factory (Cluster).
Un ejemplo concreto simple : este ejemplo proporciona una fábrica de risas que produce clases concretas de tipos de risa específicos (por ejemplo, Guffaw, Giggle). Preste atención al método Laugh initWithLaughter : .
En Laugh.h:
En Laugh.m:
fuente
.m-file
.init
método y devolver algo más? ¿Hay ejemplos de código de Apple donde hacen esto? (2) Además, presumiblemente está creando una instancia con un código como[[Laugh alloc] initWithLaughter:kLaughWithGiggle]
. Observe cómoLaugh
se asigna innecesariamente, ya que se liberará inmediatamente después de esta llamada. ¿Por qué hacerlo de esta manera cuando puede crear un método de clase como el[Laugh laughWithLaughter:kLaughWithGiggle]
que le brinda todas las ventajas de las subclases privadas, mientras evita los problemas 1 y 2 anteriores?+alloc
devuelve una clase de fábrica singleton que implementa los diversos-initWith:
métodos. Los-initWith:
métodos de la clase de fábrica son responsables de asignar e inicializar una subclase concreta en función de los parámetros del método dados, si es necesario, o en algunos casos pueden no asignar nada en absoluto (como-[NSString initWithString:]
). Se puede probar mediante la inspección en el valor de retorno de+[NSString alloc]
,+[NSArray alloc]
, etc.De la programación en el objetivo c de Stephen Kochan en la página 498 del glosario, grupo:
fuente
Los clústeres de clases proporcionan una única interfaz pública a un grupo de implementaciones de subclase privadas concretas. Un programador de objetivo-c usa grupos de clases a menudo y rara vez se da cuenta, y este es el objetivo de un grupo de clases. El trabajo de un clúster de clases es ocultar la complejidad de los detalles de implementación detrás de una interfaz pública.
Muchas de las clases Foundation son grupos de clases, como NSString, NSArray, NSDictionary y NSNumber. Cuando llamas
[NSString stringWithFormat:]
al clúster de clases, obtienes una clase concreta que implementa laNSString
interfaz. Podría ser unaNSConcreteString
,NSCFString
,NSFooBarString
, etc., que el grupo de clase le da se basa en el constructor o el inicializador que está llamando y los argumentos.Debido a esto, los grupos de clases son uno de los conceptos más empoderadores en la programación de Objective-C.
Si viene de otros idiomas, es posible que esté familiarizado con los patrones de la Banda de los Cuatro. Los grupos de clases 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 extenderlos) de manera bastante extensa. Desafortunadamente, he descubierto que para muchos desarrolladores de iOS, este y otros patrones específicos de Cocoa son un punto ciego.
Competencias básicas del cacao: grupo de clases
Guía de conceptos básicos de cacao: grupos de clases
En GitHub hay ejemplos de cómo implementar sus propios clústeres de clases.
fuente
El clúster de clases NSArray no es "pesado", es una forma de utilizar cualquier número de implementaciones de una clase de matriz sin que su código sepa o se preocupe por la implementación en particular. Bajo el capó, hay subclases concretas de NSArray que son apropiadas para diferentes casos de uso, como matrices grandes y dispersas o matrices que contienen una cantidad específica de elementos que se conocen en el momento de la compilación.
NSArray, NSString y NSNumber son los grupos de clases que encontrará con más frecuencia.
fuente
[myArray isKindOfClass:[NSMutableArray class]]
devolverían SÍ aunque no debería?