Czytałem, że NSArray jest właśnie taką rzeczą. Brzmi ciężko. Mam tutaj na biurku siedem naprawdę grubych książek o Objective-C, Cocoa i C. Żadna z nich w ogóle nie wspomina o Klastrze Klas, przynajmniej nie mogę jej znaleźć w Indeksie na końcu książek. Więc co to jest?
91
Odpowiedzi:
Od docs Apple ... . Krótko mówiąc, jest to wzorzec projektowy używany we frameworku Foundation, dlatego prawdopodobnie nie ma o nim wzmianki w książkach ObjC.
źródło
Nie wiem, co jest w CDP, do którego odwoływał się Steve, ale w zasadzie klaster klasy Objective-C to konstrukcja, która obsługuje implementację abstrakcyjnego wzorca Factory .
Pomysł jest prosty : chcesz zapewnić Factory (Cluster) interfejs, który przy minimalnym opisem, produkuje i wraca konkretnej instancji beton Obiektu Fabryki że spełnia zachowanie rodziny klastra opisaną przez interfejs Factory (Cluster).
Prosty konkretny przykład : ten przykład przedstawia fabrykę śmiechu, która produkuje konkretne klasy określonych typów śmiechu (np. Guffaw, Giggle). Zwróć uwagę na metodę Laugh initWithLaughter:.
W Laugh.h:
#define kLaughWithGuffaw 1 #define kLaughWithGiggle 2 @interface Laugh: NSObject {} - (Laugh *) initWithLaughter:(NSUInteger) laughterType; - (void) laugh; @end
W 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
źródło
.m-file
.init
metody i zwrócenie czegoś innego? Czy są jakieś przykłady kodu firmy Apple, w których to robią? (2) Ponadto prawdopodobnie tworzysz instancję z kodem takim jak[[Laugh alloc] initWithLaughter:kLaughWithGiggle]
. Zwróć uwagę, jakLaugh
jest niepotrzebnie przydzielany, ponieważ zostanie zwolniony natychmiast po tym wywołaniu. Po co to robić, skoro można utworzyć metodę klasową, taką jak ta,[Laugh laughWithLaughter:kLaughWithGiggle]
która zapewnia wszystkie zalety prywatnych podklas, unikając jednocześnie problemów 1 i 2 powyżej?+alloc
zwraca pojedynczą klasę fabryki, która implementuje różne-initWith:
metody. Metody klasy fabrycznej-initWith:
są następnie odpowiedzialne za przydzielanie i inicjowanie konkretnej podklasy na podstawie podanych parametrów metody, jeśli jest to konieczne, lub w niektórych przypadkach mogą w ogóle niczego nie przydzielać (na przykład-[NSString initWithString:]
). Można spróbować go poprzez kontrolę w wartości zwracanej+[NSString alloc]
,+[NSArray alloc]
itpZ programowania w celu c autorstwa Stephena Kochana na stronie 498 w glosariuszu, klaster:
źródło
Klastry klas zapewniają pojedynczy interfejs publiczny dla grupy konkretnych, prywatnych implementacji podklas. Programista z celem-c często używa klastrów klas i rzadko zdaje sobie z tego sprawę - i o to właśnie chodzi w klastrze klas. Zadaniem klastra klas jest ukrycie złożoności szczegółów implementacji za publicznym interfejsem.
Wiele klas Foundation to klastry klas, takie jak NSString, NSArray, NSDictionary i NSNumber. Kiedy wywołujesz
[NSString stringWithFormat:]
klasę, klaster udostępnia konkretną klasę, która implementujeNSString
interfejs. To może byćNSConcreteString
,NSCFString
,NSFooBarString
, itd. Które klaster klasa daje bazuje na konstruktora lub inicjator dzwonisz i argumenty.Z tego powodu klastry klas są jedną z najbardziej inspirujących koncepcji programowania w języku Objective-C.
Jeśli pochodzisz z innych języków, być może znasz wzorce Gang of Four. Klastry klas zawierają elementy zarówno abstrakcyjnej fabryki, jak i wzorów elewacji.
Publiczna dokumentacja firmy Apple dość obszernie obejmuje klastry klas (oraz sposoby ich implementacji i rozszerzania). Niestety odkryłem, że dla wielu programistów iOS ten i inne wzorce specyficzne dla Cocoa są martwym punktem.
Podstawowe kompetencje kakao: Klaster klas
Przewodnik po podstawach kakao: Klastry klas
Przykłady sposobów implementacji własnych klastrów klas są dostępne w witrynie GitHub
źródło
Klaster klas NSArray nie jest „ciężki”, jest sposobem na użycie dowolnej liczby implementacji klasy tablicowej bez wiedzy Twojego kodu lub dbania o nią. Pod maską znajdują się konkretne podklasy NSArray, które są odpowiednie dla różnych przypadków użycia, takich jak duże, rzadkie tablice lub tablice zawierające określoną liczbę elementów, które są znane w czasie kompilacji.
NSArray, NSString i NSNumber to najczęściej spotykane klastry klas.
źródło
[myArray isKindOfClass:[NSMutableArray class]]
zwróciłyby TAK, nawet jeśli nie powinno?