Что именно представляет собой так называемый "кластер классов" в Objective-C?
Я читал, что NSArray как раз такая вещь. Звучит тяжело. У меня на столе 7 действительно толстых книг о Objective-C, Cocoa и C. Ни в одной из них нет упоминания о Class Cluster, по крайней мере, я не могу найти его в Указателе в конце книги. Так что это?
5 ответов
Из документов Apple... Короче говоря, это шаблон проектирования, используемый в среде Foundation, поэтому, вероятно, он не упоминается в книгах по ObjC.
Кластер классов - это архитектура, которая группирует ряд частных, конкретных подклассов в общем абстрактном суперклассе. Группировка классов таким способом обеспечивает упрощенный интерфейс для пользователя, который видит только общедоступную архитектуру.
Я не знаю, что находится в CDP, на который ссылался Стив, но в основном кластер классов Objective-C - это конструкция, которая поддерживает реализацию абстрактного шаблона Factory.
Идея проста: вы хотите предоставить интерфейс фабрики (кластера), который с минимальным описанием производит и возвращает конкретный конкретный экземпляр объекта фабрики, который удовлетворяет поведению семейства кластеров, описываемого интерфейсом фабрики (кластера).
Простой конкретный пример: этот пример предоставляет фабрику смеха, которая производит конкретные классы определенных типов смеха (например, Guffaw, Giggle). Обратите внимание на метод смеха 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
От программирования в задаче c Стивена Кочана на странице 498 в глоссарии, кластер:
Абстрактный класс, который группирует набор частных конкретных подклассов, предоставляя пользователю упрощенный интерфейс через абстрактный класс.
Кластеры классов предоставляют единый открытый интерфейс для группы конкретных, частных реализаций подклассов. Программист Objective-C часто использует кластеры классов и редко осознает это - и в этом весь смысл кластера классов. Задача кластера классов состоит в том, чтобы скрыть сложность реализации за общедоступным интерфейсом.
Многие из базовых классов являются кластерами классов, такими как NSString, NSArray, NSDictionary и NSNumber. Когда вы звоните [NSString stringWithFormat:]
кластер классов дает вам какой-то конкретный класс, который реализует NSString
интерфейс. Это может быть NSConcreteString
, NSCFString
, NSFooBarString
и т.д. То, что дает вам кластер классов, основано на вызываемом вами конструкторе или инициализаторе и аргументах.
Из-за этого кластеры классов являются одним из наиболее вдохновляющих понятий в программировании на Objective-C.
- Очень легко реализовать
- Легко изменить базовую реализацию без изменения кода, который ее вызывает.
- Легко предоставлять различные конкретные реализации во время выполнения (например, тестовые ресурсы или фиктивные объекты)
- Из-за вышесказанного, легко тестировать и рефакторинг
Если вы пришли с других языков, вы можете быть знакомы с паттернами "Банды четырех". Кластеры классов имеют элементы как абстрактной фабрики, так и шаблонов фасадов.
Публичная документация Apple довольно широко охватывает кластеры классов (а также способы их реализации и расширения). К сожалению, я обнаружил, что для многих разработчиков iOS этот и другие специфичные для Какао шаблоны являются слепым пятном.
Основные компетенции Cocoa: кластер классов
Руководство по основам какао: кластеры классов
Примеры того, как реализовать ваши собственные кластеры классов, доступны на GitHub
Кластер класса NSArray не является "тяжеловесным", это способ использования любого количества реализаций класса массива без знания вашего кода или заботы о конкретной реализации. Под капотом есть конкретные подклассы NSArray, которые подходят для различных вариантов использования, таких как большие, разреженные массивы или массивы, содержащие определенное количество элементов, которые известны во время компиляции.
NSArray, NSString и NSNumber - это кластеры классов, с которыми вы чаще всего сталкиваетесь.