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

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

Ответы [ 5 ]

190 голосов
/ 17 марта 2010

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

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

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

В смехе:

#define kLaughWithGuffaw  1
#define kLaughWithGiggle  2

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

In 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
39 голосов
/ 04 декабря 2009

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

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

25 голосов
/ 04 декабря 2009

Из программирования в задаче c Стивена Кочана на странице 498 в глоссарии, кластер:

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

17 голосов
/ 16 апреля 2014

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

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

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

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

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

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

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

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

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

7 голосов
/ 04 декабря 2009

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

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

...