ฉันกำลังอ่านว่า NSArray เป็นเพียงสิ่งนั้น ฟังดูหนักหนา ฉันมีหนังสืออ้วนจริงๆ 7 เล่มบนโต๊ะทำงานเกี่ยวกับ Objective-C, Cocoa และ C ไม่มีใครพูดถึง Class Cluster เลยอย่างน้อยก็หาไม่เจอใน Index ที่ด้านหลังของหนังสือ แล้วนั่นคืออะไร?
ฉันกำลังอ่านว่า NSArray เป็นเพียงสิ่งนั้น ฟังดูหนักหนา ฉันมีหนังสืออ้วนจริงๆ 7 เล่มบนโต๊ะทำงานเกี่ยวกับ Objective-C, Cocoa และ C ไม่มีใครพูดถึง Class Cluster เลยอย่างน้อยก็หาไม่เจอใน Index ที่ด้านหลังของหนังสือ แล้วนั่นคืออะไร?
คำตอบ:
จากเอกสารของแอปเปิ้ล ... ในระยะสั้นเป็นรูปแบบการออกแบบที่ใช้ในกรอบของมูลนิธิซึ่งอาจเป็นเหตุผลว่าทำไมจึงไม่กล่าวถึงในหนังสือ ObjC
คลัสเตอร์คลาสคือสถาปัตยกรรมที่จัดกลุ่มคลาสย่อยที่เป็นส่วนตัวและเป็นรูปธรรมภายใต้คลาสซูเปอร์คลาสนามธรรมสาธารณะ การจัดกลุ่มคลาสด้วยวิธีนี้ทำให้อินเทอร์เฟซที่เรียบง่ายสำหรับผู้ใช้ซึ่งมองเห็นเฉพาะสถาปัตยกรรมที่เปิดเผยต่อสาธารณะ
ฉันไม่รู้ว่ามีอะไรอยู่ใน CDP ที่ Steve อ้างถึง แต่โดยพื้นฐานแล้ว Objective-C Class Cluster เป็นโครงสร้างที่สนับสนุนการใช้รูปแบบโรงงานนามธรรม
ความคิดเป็นเรื่องง่าย : คุณต้องการที่จะให้โรงงาน (คลัสเตอร์) อินเตอร์เฟซที่มีคำอธิบายน้อยที่สุดผู้ผลิตและผลตอบแทนเช่นคอนกรีตที่เฉพาะเจาะจงของวัตถุโรงงานที่ตอบสนองพฤติกรรมของครอบครัวคลัสเตอร์อธิบายโดยอินเตอร์เฟซที่โรงงาน (คลัสเตอร์)
ตัวอย่างที่เป็นรูปธรรมง่ายๆ : ตัวอย่างนี้เป็นโรงงาน Laugh ที่สร้างคลาสของเสียงหัวเราะเฉพาะประเภท (เช่น Guffaw, Giggle) ให้ความสนใจกับLaugh initWithLaughter: method
ใน 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
.m-file
.
init
วิธีใดปลอดภัยเพียงใดและส่งคืนอย่างอื่น มีตัวอย่างโค้ดจาก Apple ที่ใช้ทำสิ่งนี้หรือไม่? (2)นอกจากนี้คุณน่าจะสร้างอินสแตนซ์ด้วยรหัสเช่น[[Laugh alloc] initWithLaughter:kLaughWithGiggle]
. สังเกตว่าLaugh
มีการจัดสรรโดยไม่จำเป็นอย่างไรเนื่องจากจะถูกปล่อยทันทีหลังจากการโทรนี้ เหตุใดจึงเป็นเช่นนี้เมื่อคุณสามารถสร้างเมธอดคลาสเช่น[Laugh laughWithLaughter:kLaughWithGiggle]
ซึ่งให้ข้อดีทั้งหมดของคลาสย่อยส่วนตัวในขณะที่หลีกเลี่ยงปัญหา 1 & 2 ข้างต้น
+alloc
ส่งคืนคลาสโรงงานเดี่ยวที่ใช้-initWith:
วิธีการต่างๆ -initWith:
จากนั้นวิธีการของคลาสโรงงานจะรับผิดชอบในการจัดสรรและกำหนดค่าเริ่มต้นคลาสย่อยที่เป็นรูปธรรมตามพารามิเตอร์วิธีการที่กำหนดหากจำเป็นหรือในบางกรณีอาจไม่จัดสรรอะไรเลย (เช่น-[NSString initWithString:]
) คุณสามารถทดลองใช้งานได้โดยการตรวจสอบที่ค่าตอบแทนของ+[NSString alloc]
, +[NSArray alloc]
ฯลฯ
จากการเขียนโปรแกรมในวัตถุประสงค์ c โดย Stephen Kochan ที่หน้า 498 ในอภิธานศัพท์คลัสเตอร์:
คลาสนามธรรมที่จัดกลุ่มชุดของคลาสย่อยคอนกรีตส่วนตัวจัดเตรียมอินเทอร์เฟซที่เรียบง่ายให้กับผู้ใช้ผ่านคลาสนามธรรม
คลัสเตอร์คลาสจัดเตรียมอินเทอร์เฟซสาธารณะเดียวให้กับกลุ่มของการใช้งานคลาสย่อยส่วนตัวที่เป็นรูปธรรม โปรแกรมเมอร์วัตถุประสงค์ -c ใช้คลัสเตอร์คลาสบ่อยครั้งและแทบไม่ได้ตระหนักถึงมัน - และนี่คือจุดรวมของคลัสเตอร์คลาส หน้าที่ของคลาสคลัสเตอร์คือการซ่อนความซับซ้อนของรายละเอียดการใช้งานไว้เบื้องหลังอินเทอร์เฟซสาธารณะ
คลาส Foundation จำนวนมากเป็นกลุ่มคลาสเช่น NSString, NSArray, NSDictionary และ NSNumber เมื่อคุณเรียก[NSString stringWithFormat:]
คลาสคลัสเตอร์จะทำให้คุณมีคลาสคอนกรีตที่ใช้NSString
อินเทอร์เฟซ มันอาจจะเป็นNSConcreteString
, NSCFString
, NSFooBarString
ฯลฯ ซึ่งคลัสเตอร์ชั้นเรียนจะช่วยให้คุณขึ้นอยู่กับการสร้างหรือการเริ่มต้นคุณโทรและข้อโต้แย้ง
ด้วยเหตุนี้คลัสเตอร์คลาสจึงเป็นหนึ่งในแนวคิดที่ช่วยเพิ่มขีดความสามารถในการเขียนโปรแกรม Objective-C
หากคุณมาจากภาษาอื่นคุณอาจคุ้นเคยกับรูปแบบ Gang of Four กลุ่มคลาสมีองค์ประกอบของทั้งโรงงานนามธรรมและรูปแบบซุ้ม
เอกสารสาธารณะของ Apple ครอบคลุมคลัสเตอร์คลาส (และวิธีการใช้งานและขยาย) ค่อนข้างครอบคลุม น่าเสียดายที่ฉันพบว่าสำหรับนักพัฒนา iOS หลายคนสิ่งนี้และรูปแบบเฉพาะของ Cocoa อื่น ๆ เป็นจุดบอด
สมรรถนะหลักของโกโก้: กลุ่มคลาส
คลัสเตอร์คลาส NSArray ไม่ใช่ "เฮฟวี่เวท" แต่เป็นวิธีสำหรับการใช้งานคลาสอาร์เรย์จำนวนเท่าใดก็ได้โดยที่โค้ดของคุณไม่ทราบหรือสนใจเกี่ยวกับการนำไปใช้งานนั้น ๆ ใต้ฝากระโปรงมีคลาสย่อยที่เป็นรูปธรรมของ NSArray ที่เหมาะสมกับกรณีการใช้งานที่แตกต่างกันเช่นอาร์เรย์ขนาดใหญ่ที่กระจัดกระจายหรืออาร์เรย์ที่มีองค์ประกอบเฉพาะจำนวนหนึ่งซึ่งเป็นที่ทราบกันดีในเวลาคอมไพล์
NSArray, NSString และ NSNumber เป็นกลุ่มคลาสที่คุณจะพบบ่อยที่สุด
[myArray isKindOfClass:[NSMutableArray class]]
ส่งคืน YES แม้ว่าจะไม่ควร?