2009-12-04 2 views
84

Я читал, что NSArray - это просто такая вещь. Звучит тяжело. У меня есть 7 действительно толстых книг на моем столе о Objective-C, Cocoa и C. Никто из них не упоминает Class Cluster вообще, по крайней мере, я не могу найти его в Индексе в конце книг. Так что это?Что такое так называемый кластер классов в Objective-C?

+0

К сожалению, в следующий раз я буду думать, чтобы добавить ссылку на этот термин. Если бы вы прокомментировали ответ на предыдущий вопрос, я бы ответил на него. –

+2

FWIW: недавно (декабрь 2013 г.) Apple рекомендовала использовать кластеры класса как способ справиться с обратной совместимостью с iOS 6 при использовании iOS 7. Это было на Apple Tech Talks 2013/Berlin на сессии «Архитектура современных приложений, часть 2». Apple сообщила, что они будут размещать видеоролики сессий вскоре после последнего события (17 декабря). Возможно, это поможет понять кластеры Класса в реальном контексте изменений iOS 6/7. – brainray

ответ

38

From Apple's docs.... Короче говоря, это шаблон дизайна, используемый в рамках Foundation, что, вероятно, поэтому не упоминается в книгах ObjC.

+6

Да, низко висящие фрукты вы знаете ... – echo

+1

roflmao. Благодарю. собираюсь google в следующий раз. думал, если его не в моих толстых книгах, это может быть только на ваших головах;) – openfrog

+1

Единственное, чего не хватает этой ссылке, - это объяснение того, как лучше всего изменить реализацию для ARC. – Hyperbole

7

Класс кластера NSArray не является «тяжеловесным», это способ для любого количества реализаций класса массива, который будет использоваться без вашего кода, зная или заботясь о конкретной реализации. Под капотом существуют конкретные подклассы NSArray, которые подходят для разных вариантов использования, таких как большие, редкие массивы или массивы, содержащие определенное количество элементов, которые известны во время компиляции.

NSArray, NSString и NSNumber - это кластеры классов, с которыми вы чаще всего сталкиваетесь.

+5

Как ни странно, на практике только один конкретный класс для кластера используется больше - NSCF {Array | String | Number} - и изменения реализации являются внутренними для этого класса. насколько я знаю, в любом случае, даже экземпляры NSArray и NSMutableArray отображают один и тот же класс. – Chuck

+1

@Chuck - как это может быть? Если NSMutableArray и NSArray сообщили, что они являются одним и тем же классом, не будет '[myArray isKindOfClass: [NSMutableArray class]] 'return YES, хотя это не должно быть? – Robert

+1

@Robert: И действительно, это было во время моего комментария. В настоящее время Apple заменила NSCFArray на __NSArrayM и __NSArrayI, поэтому я думаю, что это уже не так, но Я все равно не буду чувствовать себя комфортно в зависимости от этого, поскольку они всегда могут изменить его снова. – Chuck

24

От программирования в Objective C Стивен Кочан на странице 498 в глоссарии, кластер:

Абстрактный класс, который группирует набор частных конкретных подклассов, обеспечивая упрощенный интерфейс для пользователя через абстрактный класс.

+5

+1 Для цитирования ответа от Objective-C bo хорошо, особенно учитывая исходный вопрос. Это хорошая книга. –

+0

(+1) за отличное определение. Проблема, с которой я сталкиваюсь с этим шаблоном «Factory», заключается в том, что такое имя фокусируется только на * создании * объектов, а не на подклассе взаимодействия частных подклассов, управляемых абстрактным суперклассом. Действительно, даже вызов этого суперкласса «абстрактный» может вводить в заблуждение, поскольку он на самом деле полностью (внутренне) зависит от его собственных подклассов и, следовательно, не является нормальным абстрактным классом, который вообще ничего не знает о своих подклассах. – devios1

185

Я не знаю, что в CDP, что Стив ссылается, но в основном кластера Objective-C Класс представляет собой конструкцию, которая поддерживает реализацию абстрактного Factory шаблона.

идея просто: Вы хотите, чтобы обеспечить интерфейс Factory (Cluster), что, с минимальным описанием, изготовляет и возвращает определенный конкретный экземпляр Factory объекта, который удовлетворяет поведение семейства кластеров, описываемое Интерфейс Factory (Cluster).

Простой конкретный пример: В этом примере представлена ​​фабрика смеха, которая производит конкретные классы конкретных типов смеха (например, Guffaw, Giggle). Обратите внимание на Смех initWithLaughter: метод.

В Laugh.h:

#define kLaughWithGuffaw 1 
#define kLaughWithGiggle 2 

@interface Laugh: NSObject {} 
- (Laugh *) initWithLaughter:(NSUInteger) laughterType; 
- (void) laugh; 
@end 

В 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 
+22

В то время как другие ответы были хорошими, предоставляя ссылки на документы и книги, мне это нравится, потому что это делает его приятным и простым, чтобы понять, как это сделать на самом деле. Спасибо – jamone

+1

+1 для небольшого примера !! – TheTiger

+0

+1 для приятного и эффективного объяснения ... !!!! держите его на месте ..... – Kamarshad

16

кластеры класса обеспечивают единый открытый интерфейс к группе бетона, частных реализаций подкласса. Программист object-c часто кластеризует кластеры и редко реализует его - и это целая точка кластера классов. Задача кластера классов состоит в том, чтобы скрыть сложность деталей реализации за открытым интерфейсом.

Многие из классов Foundation являются кластерными кластерами, такими как NSString, NSArray, NSDictionary и NSNumber. Когда вы вызываете [NSString stringWithFormat:], кластер классов предоставляет вам определенный класс, который реализует интерфейс NSString. Это может быть NSConcreteString, NSCFString, NSFooBarString и т. Д. Что кластер кластера дает вам, основан на конструкторе или инициализаторе, который вы вызываете, и аргументах.

В связи с этим кластеры классов являются одной из наиболее перспективных концепций в программировании Objective-C.

  • Очень легко реализовать
  • Легко изменить лежащий в основе реализации без изменения кода, который вызывает его.
  • Легко представить различные конкретные реализации во время выполнения (например, тест-ресурсы или фиктивные объекты)
  • Из вышесказанного, легко проверить и реорганизовывать

Если вы едете из других языков, вы можете быть знакомы с Банда четырех моделей. Кластеры кластера имеют элементы как абстрактной фабрики, так и фасадных узоров.

Публичная документация Apple охватывает обширные кластеры (и способы их реализации и расширения). К сожалению, я обнаружил, что для многих разработчиков iOS этот и другие какао-специфические шаблоны являются слепым местом.

Cocoa Core Competencies: Class cluster

Cocoa Fundamentals Guide: Class Clusters

Examples of how to implement your own class clusters are available on GitHub

 Смежные вопросы

  • Нет связанных вопросов^_^