Eu estava lendo que NSArray é exatamente isso. Parece pesado. Eu tenho 7 livros bem gordos aqui na minha mesa sobre Objective-C, Cocoa e C. Nenhum deles menciona Class Cluster, pelo menos não consigo encontrar no Index no final dos livros. Então o que é isso?
objective-c
cocoa
cocoa-design-patterns
class-cluster
rã aberta
fonte
fonte
Respostas:
De docs da Apple ... . Resumindo, é um padrão de design usado na estrutura da Fundação, provavelmente por isso não é mencionado nos livros ObjC.
fonte
Não sei o que há no CDP que Steve fez referência, mas basicamente o Objective-C Class Cluster é uma construção que dá suporte à implementação do padrão Factory abstrato .
A ideia é simples : você deseja fornecer uma interface Factory (Cluster) que, com uma descrição mínima, fabrique e retorne uma instância concreta específica de um Factory Object que satisfaça o comportamento da família de cluster descrita pela interface Factory (Cluster).
Um exemplo concreto simples : Este exemplo fornece uma fábrica de risos que produz classes concretas de tipos específicos de risos (por exemplo, Guffaw, Giggle). Preste atenção ao método Laugh initWithLaughter : .
Em Laugh.h:
Em Laugh.m:
fonte
.m-file
.init
método e retornar outra coisa? Existe algum exemplo de código da Apple onde eles fazem isso? (2) Além disso, você provavelmente está criando uma instância com código como[[Laugh alloc] initWithLaughter:kLaughWithGiggle]
. Observe comoLaugh
está sendo alocado desnecessariamente, pois será liberado imediatamente após esta chamada. Por que fazer isso quando você pode criar um método de classe como o[Laugh laughWithLaughter:kLaughWithGiggle]
que oferece todas as vantagens das subclasses privadas, enquanto evita os problemas 1 e 2 acima?+alloc
retorna uma classe de fábrica de singleton que implementa os vários-initWith:
métodos. Os-initWith:
métodos da classe de fábrica são então responsáveis por alocar e inicializar uma subclasse concreta com base nos parâmetros do método dado, se necessário, ou em alguns casos podem não alocar nada (como-[NSString initWithString:]
). Você pode experimentá-lo pela inspeção no valor de retorno+[NSString alloc]
,+[NSArray alloc]
etc.Da programação no objetivo c por Stephen Kochan na página 498 no glossário, agrupe:
fonte
Os clusters de classes fornecem uma única interface pública para um grupo de implementações concretas de subclasses privadas. Um programador objetivo-c usa clusters de classes com frequência e raramente percebe isso - e esse é o ponto principal de um cluster de classes. O trabalho de um cluster de classe é ocultar a complexidade dos detalhes de implementação por trás de uma interface pública.
Muitas das classes Foundation são clusters de classe, como NSString, NSArray, NSDictionary e NSNumber. Quando você chama
[NSString stringWithFormat:]
a classe cluster está dando a você alguma classe concreta que implementa aNSString
interface. Poderia ser umNSConcreteString
,NSCFString
,NSFooBarString
, etc. Qual o cluster classe dá-lhe é baseado no construtor ou initializer você está chamando e os argumentos.Por causa disso, os clusters de classe são um dos conceitos mais poderosos na programação Objective-C.
Se você está vindo de outras línguas, pode estar familiarizado com os padrões da Gangue dos Quatro. Os clusters de classes têm elementos tanto da fábrica abstrata quanto dos padrões de fachada.
A documentação pública da Apple cobre clusters de classes (e como implementá-los e estendê-los) de forma bastante extensa. Infelizmente, descobri que, para muitos desenvolvedores de iOS, esse e outros padrões específicos do Cocoa são um ponto cego.
Competências essenciais do cacau: grupo de classes
Cocoa Fundamentals Guide: Class Clusters
Exemplos de como implementar seus próprios clusters de classe estão disponíveis no GitHub
fonte
O cluster da classe NSArray não é "pesado", é uma maneira de qualquer número de implementações de uma classe de array ser usado sem que seu código saiba ou se importe com a implementação específica. Sob o capô, existem subclasses concretas de 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 compilação.
NSArray, NSString e NSNumber são os clusters de classe que você encontrará com mais frequência.
fonte
[myArray isKindOfClass:[NSMutableArray class]]
retornariam SIM, embora não devesse?