Что такое так называемый кластер классов в Objective-C?

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

Ответ 1

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

Ответ 2

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

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

Простой конкретный пример. В этом примере представлен смех Factory, который создает конкретные классы конкретных типов смеха (например, 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

Ответ 3

От программирования в объективе c Стивеном Кочаном на стр. 498 в глоссарии кластер:

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

Ответ 4

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

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

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

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

Если вы приедете с других языков, вы можете быть знакомы с шаблонами Gang of Four. Кластеры классов имеют элементы как абстрактного factory, так и фасонных шаблонов.

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

Cocoa Основные компетенции: кластер классов

Cocoa Руководство по основам: кластер классов

Примеры того, как реализовать свои кластеры классов, доступны в GitHub

Ответ 5

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

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