it-swarm.com.ru

Что именно представляет собой так называемый «кластер классов» в Objective-C?

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

88
openfrog

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

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

39
echo

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

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

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

В смехе:

#define kLaughWithGuffaw  1
#define kLaughWithGiggle  2

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

В смех.

@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
190
Frank C.

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

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

25
t011phr33

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

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

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

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

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

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

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

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

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

17
quellish

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

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

7
NSResponder