2012-05-10 10 views
9

मान लीजिए कि मैं एक उद्देश्य-सी वर्ग बना रहा हूं जो एक अंश का प्रतिनिधित्व करता है, और अपरिवर्तनीय और परिवर्तनीय संस्करण बनाना चाहता है।एक उद्देश्य-सी कक्षा के अपरिवर्तनीय और परिवर्तनीय संस्करण बनाने का सबसे प्रभावी तरीका क्या है?

फाउंडेशन ढांचे में पैटर्न के बाद, आप अपरिवर्तनीय संस्करण में fractionByAddingFraction: विधि और addFraction: को व्यवहार्य संस्करण में देखने की उम्मीद कर सकते हैं।

मैं जिस विरोधाभास में भाग रहा हूं वह यह है कि दो वर्गों के बीच एक बार अंश-जोड़ तर्क कैसे शामिल किया जाए। ऐसा लगता है कि अपरिवर्तनीय fractionByAddingFraction: विधि को कोड डुप्लिकेशंस से बचने के लिए म्यूटेबल addFraction: विधि के बारे में जानने (और इसका उपयोग करने की आवश्यकता है), और फिर भी अपरिवर्तनीय वर्ग के कार्यान्वयन में उत्परिवर्तनीय विधियों को शामिल करने का अर्थ है कि वे अनुमानित रूप से अपरिवर्तनीय पर बुलाए जा सकते हैं वस्तु, जो बिंदु को हरा देता है।

एक संक्षिप्त स्पष्टीकरण (या बेहतर अभी भी, इस सरलीकृत उदाहरण की निरंतरता) की बहुत सराहना की जाएगी!

+4

आपका क्लास उदाहरण _value object_ का प्रतिनिधित्व करता प्रतीत होता है, इसलिए मुझे नहीं लगता कि आपको इसके लिए एक परिवर्तनीय संस्करण प्रदान करना चाहिए। __ बस इसे अपरिवर्तनीय बनाएं .__ –

+0

@ Jordão इस विशेष उदाहरण के लिए, आप बिल्कुल सही हैं। मैंने महसूस किया कि सामान्य रूप से अवधारणा के बारे में मेरी भ्रम को समझाने का यह सबसे आसान और सबसे संक्षिप्त तरीका था (क्योंकि यह अधिक जटिल वर्गों से संबंधित है)। इस पर विचार किए बिना किसी भी विचार पर किया जाएगा? – user1385983

उत्तर

3

आपका दृष्टिकोण सही है (यदि आपको वास्तव में एक उत्परिवर्तनीय सबक्लास की आवश्यकता है, जिसे आपको तब तक टालना चाहिए जब तक आपको वास्तव में इसकी आवश्यकता न हो)। मैं बिल्कुल स्पष्ट नहीं हूं कि भ्रम कहाँ आ रहा है। fractionByAddingFraction: का उपयोग करके आप addFraction: को आसानी से कार्यान्वित करेंगे। यह थोड़ा अक्षम होगा, लेकिन वह दिशा है जो सबसे अधिक समझ में आती है। कुछ की तरह:

- (void)addFraction:(Fraction *)anotherFraction { 
    Fraction *newFraction = [self fractionByAddingFraction:anotherFraction]; 
    self.internalStuff = newFraction.internalStuff; 
} 

लेकिन आम तौर पर आप शायद यह और अधिक कुशलता से कुछ निजी _GetInternalStuffByAddingInternalStuffs() समारोह है कि दोनों वर्गों का प्रयोग करेंगे के साथ संभाल होगा।

+0

सुझावों के लिए धन्यवाद। मैंने पहले दृष्टिकोण को केवल इसलिए टाल दिया था, जैसा कि आपने बताया है, हर बार इसके किसी भी घटक को बदलने के बाद यह एक नई वस्तु बनाने में अक्षम हो सकता है। एक निजी समारोह बनाने का आपका विचार एक अच्छा विकल्प जैसा प्रतीत होता है, हालांकि मैं सोच रहा हूं कि समारोह आदर्श रूप से दोनों वर्गों के कार्यान्वयन के लिए सुलभ होने के लिए कहां स्थित होगा, फिर भी किसी और चीज के लिए पहुंच योग्य (जो इसे शीर्षलेख में डालने का नियम है)? – user1385983

+0

यह आम तौर पर एक निजी शीर्षलेख जैसे फ्रैक्शन + Private.h के साथ किया जाता है। ध्यान दें कि यदि आप इस तरह की चीज हैं तो आप अभी भी म्यूटेबल फॉर्म को मिटाने पर विचार करना चाहेंगे। ध्यान दें कि एनएसएनंबर के पास कोई परिवर्तनीय रूप नहीं है। जब तक आप उनमें से बहुत से तेजी से निर्माण नहीं कर रहे हैं, तब तक मूल्य वस्तुओं की सादगी और धागा-सुरक्षा उन्हें बहुत आकर्षक बनाती है। यहां तक ​​कि यदि आप उन्हें बहुत जल्दी बनाते हैं, तो आप उनमें से कुछ को कैश कर सकते हैं। जैसा कि मुझे याद है, एनएसएनंबर सिंगलर्स के रूप में पूर्णांक -1-12 को कैश करता है। आप अपरिवर्तनीय वस्तुओं के साथ आसानी से उस तरह के कैशिंग कर सकते हैं। लेकिन उपरोक्त यह है कि जब आप उत्परिवर्तन की आवश्यकता होती है तो आप इसे कैसे संभालेंगे। –

+0

याद रखें कि आप जा सकते हैं और देख सकते हैं कि अंतर्निहित कोरफाउंडेशन ऑब्जेक्ट्स कैसे कार्यान्वित किए जाते हैं: http://opensource.apple.com/source/CF/CF-635/CFArray.c। –

0

फाउंडेशन के संग्रह धोखाधड़ी के प्राथमिक कार्यान्वयन: केवल एक ही कार्यान्वयन है, जो NSMutableFoo का उप-वर्ग है, और इसमें एक निजी उत्परिवर्तन झंडा है। इसका अर्थ यह है कि क्लाइंट कोड यह जांच नहीं कर सकता कि कोई विशेष वस्तु उत्परिवर्तनीय है या नहीं, लेकिन शायद यह कभी भी एक अच्छा विचार नहीं होगा, शायद डिबगिंग और दावे के अलावा।

+0

क्या मैं सही ढंग से समझ रहा हूं कि 'एनएसएफयू' 'एनएसएमयूटेबलफू' का उप-वर्ग होगा, और 'एनएसएमयूटेबलफू' में दोनों वर्गों के लिए सभी विधियां होंगी, हालांकि निजी ध्वज के आधार पर उत्परिवर्तनीय लोगों का उपयोग करने के लिए अपनी अपरिवर्तनीय उप-वर्ग की क्षमता को सीमित कर दिया गया है? – user1385983

+0

'एनएसएफयू '' एनएसएमयूटेबलफू' का उप-वर्ग नहीं है, नहीं। रिश्ते आम तौर पर 'एनएसएफयू' ← 'एनएसएमयूटेबलफू '←' एनएससीएफएफयू' है, जहां 'एनएससीएफएफयू 'एक ठोस कार्यान्वयन है। 'एनएससीएफएफयू की उत्परिवर्तन विधियां म्यूटेबल फ्लैग की जांच करें और अपरिवर्तनीय होने पर अपवाद फेंक दें। (वास्तव में वास्तविकता टोल-फ्री ब्रिजिंग की वजह से अधिक जटिल है, लेकिन इस तरह यह सीएफ के बिना काम करेगा।) अपने स्वयं के वर्गों के लिए, आप शायद कंक्रीट सबक्लास को 'XYConcreteFoo' जैसे कुछ कॉल करेंगे। –

संबंधित मुद्दे

 संबंधित मुद्दे