उद्देश्य-सी में वास्तव में एक तथाकथित "क्लास क्लस्टर" क्या है?


91

मैं पढ़ रहा था कि NSArray सिर्फ इतनी सी बात है। भारी लगता है। मेरे पास उद्देश्य-सी, कोको और सी के बारे में मेरी डेस्क पर वास्तव में 7 मोटी किताबें हैं। उनमें से कोई भी क्लास क्लस्टर का उल्लेख नहीं करता है, कम से कम मैं इसे पुस्तकों के पीछे इंडेक्स में नहीं पा सकता हूं। तो वह क्या है?


ओह, अगली बार मैं उस शब्द के लिए एक लिंक जोड़ना चाहूंगा। यदि आपने पिछले प्रश्न पर आपके उत्तर के बारे में टिप्पणी की होगी, तो मैंने वहाँ उत्तर दिया होगा।
जॉर्ज फ्रिट्ज़शे

2
FWIW: हाल ही में (दिसंबर 2013) Apple ने iOS 6 का उपयोग करते हुए iOS 6 के लिए पिछड़े-सहजीवन को संभालने के तरीके के रूप में क्लास क्लस्टर्स का उपयोग करने की सिफारिश की। यह "आर्किटेक्चरिंग मॉडर्न ऐप्स, पार्ट 2" सत्र में Apple Tech 2013 / बर्लिन पर था। Apple ने कहा कि वे अंतिम कार्यक्रम (17. दिसंबर) के तुरंत बाद सत्रों के वीडियो पोस्ट करेंगे। तो शायद यह आईओएस 6/7 परिवर्तनों के वास्तविक संदर्भ में क्लास क्लस्टर्स को समझने में मदद करेगा।
दिमागी तौर

जवाबों:


42

एप्पल डॉक्स से ... । संक्षेप में, यह फाउंडेशन फ्रेमवर्क में उपयोग किया जाने वाला एक डिज़ाइन पैटर्न है, जो शायद इसीलिए इसका उल्लेख ओब्जेक बुक्स में नहीं है।

एक क्लास क्लस्टर एक आर्किटेक्चर है जो एक सार्वजनिक, अमूर्त सुपरक्लास के तहत कई निजी, ठोस उपवर्गों को समूहित करता है। इस तरह से कक्षाओं का समूहन उपयोगकर्ता को एक सरलीकृत इंटरफ़ेस प्रदान करता है, जो केवल सार्वजनिक रूप से दृश्यमान वास्तुकला को देखता है।


1
roflmao। धन्यवाद। अगली बार गूगल करेंगे। सोचा कि अगर यह मेरी मोटी किताबों में नहीं है, तो यह केवल आपके सिर पर हो सकता है;)
ओपनफ्रॉग

1
इस लिंक के गायब होने की एक बात यह है कि एआरसी के लिए कार्यान्वयन को सर्वोत्तम रूप से कैसे बदला जाए, इस पर एक स्पष्टीकरण है।
हाइपरबोले

193

मुझे नहीं पता कि सीडीपी में ऐसा क्या है जो स्टीव ने संदर्भित किया था लेकिन मूल रूप से ऑब्जेक्टिव-सी क्लास क्लस्टर एक ऐसा निर्माण है जो अमूर्त फैक्टरी पैटर्न को लागू करने का समर्थन करता है ।

यह विचार सरल है : आप एक फैक्ट्री (क्लस्टर) इंटरफेस प्रदान करना चाहते हैं, जो फैक्टरी ऑब्जेक्ट के एक विशिष्ट ठोस उदाहरण को कम से कम विवरण के साथ निर्मित और लौटाता है, जो फैक्टरी (क्लस्टर) इंटरफेस द्वारा वर्णित क्लस्टर परिवार के व्यवहार को संतुष्ट करता है।

एक सरल ठोस उदाहरण : यह उदाहरण एक हँसी का कारखाना प्रदान करता है जो विशिष्ट हँसी के प्रकारों (जैसे गुफ़ा, गिगल) के ठोस वर्गों का निर्माण करता है। हंसी 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

24
जबकि अन्य उत्तर डॉक्टर और पुस्तक लिंक प्रदान करने में अच्छे थे, मुझे यह पसंद है क्योंकि यह वास्तव में यह कैसे करना अच्छा और सरल बनाता है। धन्यवाद
jamone

यह उदाहरण अच्छा है लेकिन एक विशिष्ट फैक्टरी पैटर्न में उपवर्ग सार्वजनिक हैं। क्लास क्लस्टर में उपवर्ग निजी होते हैं। डेवलपर
.apple.com

1
@ AdriàNavarro जब से वे घोषित किए गए हैं तब से वे बाहर दिखाई नहीं दे रहे हैं .m-file
hfossli

4
(१) एक initविधि में स्वयं को मुक्त करना , और कुछ और लौटाना कितना सुरक्षित है ? क्या Apple के कोई कोड उदाहरण हैं जहां वे ऐसा करते हैं? (2) इसके अलावा, आप संभवतः जैसे कोड के साथ एक उदाहरण बना रहे हैं [[Laugh alloc] initWithLaughter:kLaughWithGiggle]। ध्यान दें कि कैसे Laughअनावश्यक रूप से आवंटित किया जा रहा है, क्योंकि यह इस कॉल के तुरंत बाद जारी किया जाएगा। इस तरह से क्यों करें जब आप एक वर्ग विधि बना सकते हैं जैसे [Laugh laughWithLaughter:kLaughWithGiggle]कि आपको निजी उपवर्गों के सभी फायदे मिलते हैं, जबकि ऊपर दिए गए मुद्दों पर 1 और 2 से बचते हैं?
सेंसफुल

1
@ परसेंटफुल तुम सही हो। वास्तविक जीवन में, +allocएक एकल कारखाना वर्ग देता है जो विभिन्न -initWith:तरीकों को लागू करता है । फैक्ट्री क्लास की -initWith:विधियाँ, दिए गए विधि मापदंडों के आधार पर एक ठोस उपवर्ग को आवंटित करने और आरंभ करने के लिए जिम्मेदार हैं, यदि आवश्यक हो, या कुछ मामलों में कुछ भी आवंटित नहीं कर सकते हैं (जैसे कि -[NSString initWithString:])। आप के रिटर्न मान पर निरीक्षण से यह कोशिश कर सकते हैं +[NSString alloc], +[NSArray alloc]आदि
डैरेन

25

ग्लोबरी, क्लस्टर में पेज 498 पर स्टीफन कोचन द्वारा उद्देश्य सी में प्रोग्रामिंग से:

एक अमूर्त वर्ग जो निजी ठोस उपवर्गों का एक समूह बनाता है, अमूर्त वर्ग के माध्यम से उपयोगकर्ता को एक सरलीकृत इंटरफ़ेस प्रदान करता है।


5
+1 उद्देश्य-सी पुस्तक के उत्तर को उद्धृत करने के लिए, विशेष रूप से मूल प्रश्न। यह एक अच्छी किताब है।
क्विन टेलर

(+1) उत्कृष्ट परिभाषा के लिए। इस "फ़ैक्ट्री" पैटर्न को कॉल करने में मुझे जो समस्या है, वह यह है कि इस तरह का नाम केवल वस्तुओं के निर्माण पर केंद्रित है , न कि निजी उपवर्गों के अंडर-हुड इंटरैक्शन के रूप में जो अमूर्त सुपरक्लास द्वारा प्रबंधित है। वास्तव में, यहां तक ​​कि इस सुपरक्लास को "अमूर्त" कहना भी भ्रामक हो सकता है क्योंकि यह वास्तव में काफी (आंतरिक रूप से) अपने उपवर्गों पर निर्भर है, और इसलिए यह एक सामान्य अमूर्त वर्ग नहीं है जो आमतौर पर इसके उपवर्गों के बारे में कुछ भी नहीं जानता है।
devios1

18

क्लास क्लस्टर्स एकल सार्वजनिक इंटरफ़ेस को ठोस, निजी उपवर्ग कार्यान्वयन के एक समूह को प्रदान करते हैं। एक उद्देश्य-सी प्रोग्रामर अक्सर क्लास क्लस्टर का उपयोग करता है और शायद ही कभी इसका एहसास होता है - और यह एक क्लास क्लस्टर का पूरा बिंदु है। क्लास क्लस्टर का काम सार्वजनिक इंटरफ़ेस के पीछे कार्यान्वयन विवरण की जटिलता को छिपाना है।

फाउंडेशन की कई कक्षाएं क्लास क्लस्टर हैं, जैसे NSString, NSArray, NSDictionary, और NSNumber। जब आप कॉल [NSString stringWithFormat:]करते हैं तो क्लास क्लस्टर आपको कुछ ठोस क्लास दे रहा है जो NSStringइंटरफ़ेस को लागू करता है। यह एक हो सकता है NSConcreteString, NSCFString,NSFooBarString , आदि कौन सा वर्ग क्लस्टर आप निर्माता के आधार पर या आप बुला रहे हैं और तर्क प्रारंभकर्ता है देता है।

इस वजह से, क्लास क्लस्टर्स ऑब्जेक्टिव-सी प्रोग्रामिंग में सबसे सशक्त अवधारणाओं में से एक हैं।

  • लागू करने के लिए बहुत आसान है
  • कोड को बदलने के बिना अंतर्निहित कार्यान्वयन को बदलना आसान है जो इसे कॉल करता है।
  • रनटाइम पर अलग-अलग ठोस कार्यान्वयन प्रदान करना आसान (यानी परीक्षण संसाधन या नकली वस्तुएं)
  • उपरोक्त के कारण, परीक्षण करने में आसान और रिफलेक्टर

यदि आप अन्य भाषाओं से आ रहे हैं, तो आप गैंग ऑफ़ फोर पैटर्न से परिचित हो सकते हैं। क्लास क्लस्टर में अमूर्त कारखाने और मुखौटा पैटर्न दोनों के तत्व हैं।

Apple के सार्वजनिक दस्तावेज में क्लास क्लस्टर्स (और उन्हें कैसे लागू किया जाए और कैसे बढ़ाया जाए) शामिल हैं। दुर्भाग्य से, मैंने पाया है कि कई आईओएस डेवलपर्स के लिए यह और अन्य कोको-विशिष्ट पैटर्न एक अंधा स्थान है।

कोको कोर प्रतियोगिताएं: क्लास क्लस्टर

कोको बुनियादी बातों गाइड: कक्षा समूहों

GitHub पर अपने स्वयं के क्लास क्लस्टर्स को कैसे लागू किया जाए, इसके उदाहरण हैं


7

NSArray वर्ग क्लस्टर "हैवीवेट" नहीं है, यह किसी भी वर्ग के कार्यान्वयन की संख्या के लिए एक तरीका है जो आपके कोड को बिना किसी विशेष कार्यान्वयन के बारे में जाने या देखभाल किए बिना उपयोग किया जा सकता है। हुड के तहत, NSArray के ठोस उपवर्ग हैं जो अलग-अलग उपयोग के मामलों के लिए उपयुक्त हैं, जैसे कि बड़े, विरल सरण, या एक विशिष्ट संख्या वाले तत्वों के सरणियाँ जो संकलन समय पर ज्ञात हैं।

NSArray, NSString, और NSNumber वर्ग के क्लस्टर हैं जिनका आप अक्सर सामना करेंगे।


6
विडंबना यह है कि व्यवहार में, प्रति क्लस्टर केवल एक ठोस वर्ग का उपयोग किया जाता है - NSCF {Array | String | Number} - और कार्यान्वयन परिवर्तन उस वर्ग के लिए आंतरिक हैं। जैसा कि मुझे पता है, वैसे भी। यहां तक ​​कि NSArray और NSMutableArray उदाहरण भी एक ही वर्ग दिखाते हैं।
चक

1
@ चक - यह मामला कैसे हो सकता है? यदि एक NSMutableArray और NSArray ने खुद को एक ही वर्ग होने की सूचना दी तो [myArray isKindOfClass:[NSMutableArray class]]भी हां नहीं लौटेगा, हालांकि यह नहीं होना चाहिए?
रॉबर्ट

1
@ रॉबर्ट: और वास्तव में मेरी टिप्पणी के समय ऐसा ही था। आजकल Apple ने NSCFArray को __NSArrayM और __NSArrayI से बदल दिया है, इसलिए मुझे लगता है कि यह अब ऐसा नहीं है, लेकिन मैं अभी भी इसके आधार पर सहज महसूस नहीं करूंगा, क्योंकि वे हमेशा इसे फिर से बदल सकते हैं।
चक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.