O que exatamente é um chamado “Cluster de Classe” em Objective-C?

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.

  • Muito fácil de implementar
  • É fácil alterar a implementação subjacente sem alterar o código que a chama.
  • Fácil de fornecer diferentes implementações concretas em tempo de execução (ou seja, resources de teste ou objects simulados)
  • Por causa do acima, fácil de testar e refatorar

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.