Eu estava lendo que NSArray é apenas uma coisa dessas. Soa pesado. Eu tenho 7 livros realmente gordos aqui na minha mesa sobre Objective-C, Cocoa e C. Nenhum deles menciona o Cluster de Classe, pelo menos eu não posso encontrá-lo no Index na parte de trás dos livros. Então, o que é isso?
Dos documentos da Apple … Em suma, é um padrão de design usado no framework Foundation, que é provavelmente o motivo pelo qual não é mencionado nos livros do ObjC.
Eu não sei o que está no CDP que Steve referenciou, mas basicamente o Objective-C Class Cluster é uma construção que suporta a implementação do padrão abstrato Factory .
A idéia é simples : você deseja fornecer uma interface Factory (Cluster) que, com descrição mínima, fabrica e retorna uma instância concreta específica de um Factory Object que satisfaz o comportamento da família de clusters descrita pela interface Factory (Cluster).
Um exemplo concreto simples : Este exemplo fornece uma fábrica de riso que produz classs concretas de tipos específicos de riso (por exemplo, Guffaw, Giggle). Preste atenção no método Laugh initWithLaughter:.
Em Laugh.h:
#define kLaughWithGuffaw 1 #define kLaughWithGiggle 2 @interface Laugh: NSObject {} - (Laugh *) initWithLaughter:(NSUInteger) laughterType; - (void) laugh; @end
Em 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
Da programação no objective c por Stephen Kochan na página 498 no glossário, cluster:
Uma class abstrata que agrupa um conjunto de subclasss particulares de concreto, fornecendo uma interface simplificada para o usuário através da class abstrata.
Os clusters de classs fornecem uma única interface pública para um grupo de implementações concretas de subclasss privadas. Um programador c-objective usa clusters de classs com frequência e raramente o percebe – e esse é o ponto principal de um cluster de classs. O trabalho de um cluster de class é ocultar a complexidade dos detalhes da implementação por trás de uma interface pública.
Muitas das classs Foundation são clusters de classs, como NSString, NSArray, NSDictionary e NSNumber. Quando você chama [NSString stringWithFormat:]
o cluster de classs fornece uma class concreta que implementa a interface NSString
. Pode ser um NSConcreteString
, NSCFString
, NSFooBarString
, etc. O que o cluster de classs fornece é baseado no construtor ou no inicializador que você está chamando e nos argumentos.
Por causa disso, os clusters de classs são um dos conceitos mais empoderadores na programação do Objective-C.
Se você estiver vindo de outras línguas, pode estar familiarizado com os padrões da Gang of Four. Os clusters de classs possuem elementos da fábrica abstrata e dos padrões de fachada.
A documentação pública da Apple abrange clusters de classs (e como implementá-los e estendê-los) extensivamente. Infelizmente, descobri que para muitos desenvolvedores iOS este e outros padrões específicos de Cocoa são um ponto cego.
Competências centrais de cacau: cluster de class
Guia de fundamentos do cacau: clusters de class
Exemplos de como implementar seus próprios clusters de classs estão disponíveis no GitHub
O cluster de classs NSArray não é “pesado”, é uma maneira de qualquer número de implementações de uma class de matriz ser usado sem que seu código saiba ou se importe com a implementação específica. Sob o capô, há subclasss concretas do NSArray que são apropriadas para diferentes casos de uso, como matrizes grandes e esparsas ou matrizes contendo um número específico de elementos que são conhecidos em tempo de compilation.
NSArray, NSString e NSNumber são os clusters de class que você encontrará com mais frequência.