2009-12-22 11 views
44

में बाहरी का उपयोग उद्देश्य सी में बाहरी का उपयोग करना कितना अच्छा है? यह कुछ हिस्सों के लिए कोडिंग आसान बनाता है .. लेकिन क्या यह ऑब्जेक्ट ओरिएंटेशन खराब नहीं करता है?उद्देश्य सी

उत्तर

54

आप पाएंगे कि extern कोको चौखटे में बड़े पैमाने पर प्रयोग किया जाता है, और एक एक ठोस तर्क को खोजने के लिए बहुत मुश्किल हो जाएगा कि उनका ओओ "खराब" है। इसके विपरीत, कोको अच्छी तरह से encapsulated है और केवल बाहरी के माध्यम से, यह क्या पता होना चाहिए। विश्व स्तर पर परिभाषित स्थिरांक निश्चित रूप से सबसे आम उपयोग हैं, लेकिन जरूरी नहीं कि केवल वैध उपयोग ही हो।

आईएमओ, extern का उपयोग करके "ऑब्जेक्ट ओरिएंटेशन" खराब नहीं होता है। ओओ में भी, यह अक्सर उन चरों का उपयोग करने के लिए होता है जो कहीं से भी सुलभ होते हैं। उद्देश्य-सी में "कक्षा चर" (जैसे जावा में static के साथ घोषित किए गए) की कमी के लिए extern का उपयोग करना सबसे अधिक लगातार कामकाज है। यह आपको उस स्कोप का विस्तार करने की अनुमति देता है जिसमें आप संकलन इकाई से परे एक प्रतीक का संदर्भ दे सकते हैं जहां इसे घोषित किया जाता है, अनिवार्य रूप से यह वादा करके कि इसे किसी के द्वारा कहीं परिभाषित किया जाएगा।

आपको __attribute__((visibility("hidden"))) के साथ भी जोड़ सकते हैं ताकि एक प्रतीक बना सके जिसका उपयोग इसके संकलन इकाई के बाहर किया जा सके, लेकिन इसके लिंकेज इकाई के बाहर नहीं, तो बोलने के लिए। मैंने इसे कस्टम लाइब्रेरी और फ्रेमवर्क कोड के लिए उच्च स्तर के आंतरिक विवरणों को सही ढंग से समाहित करने के लिए उपयोग किया है।

+0

एचएम .. लेकिन अगर कोड को बड़ी मात्रा में दस्तावेज नहीं किया गया है तो यह कोड पठनीयता को कम करता है। –

+0

क्या कक्षा घोषणा के साथ इसका उपयोग करने का कोई तरीका है? (यानी http://stackoverflow.com/questions/22798660/extern-with-class-in-objective-c) – Senseful

+0

FOUNDATION_EXPORT पर भी विचार करें क्योंकि यह सी ++ कोड के साथ भी काम करता है। http://stackoverflow.com/a/10953284/142358 –

10

यह इस बात पर निर्भर करता है कि आप इसका क्या उपयोग करते हैं। वैश्विक स्तर पर परिभाषित स्थिरांक तक पहुंच के लिए इसका उपयोग करने के लिए यह पूरी तरह से मान्य है।
यदि आपके पास वैश्विक वस्तु है, तो मैं इसके बजाय Singleton का उपयोग करने का सुझाव दूंगा।

15

उद्देश्य-सी में extern कीवर्ड के लिए कुछ उपयोग मामले हैं।
हारून हिलेग्रास वैश्विक अधिसूचना नाम बाहरी बनाने का सुझाव देता है। जैसे:

extern NSString* const XYYourNotification; 

तब आप अपने कार्यान्वयन में वास्तविक NSString* परिभाषित

+0

हिलेग्रास के सुझाव के बारे में मुझे और कहां मिल सकता है? क्या आप यूआरएल जानते हैं? – Joshua

+1

मैंने पहली बार इसे "मैक ओएस एक्स के लिए कोको प्रोग्रामिंग" (हारून हिलेग्रास) में देखा था। अब तक पढ़ने वाली सबसे अच्छी कोको संबंधित किताबों में से एक। http://www.bignerdranch.com/book/cocoa®_programming_for_mac®_os_x_3rd_edition –

+0

मुझे बाहरी उपयोग करने की आवश्यकता क्यों है? क्या मैं सिर्फ स्थिर चर घोषित नहीं कर सकता? धन्यवाद – aneuryzm

2

आपकी ज़रूरत पर निर्भर करता है, उदाहरण के लिए आपके पास लॉगिन पृष्ठ है। लॉग इन करने के बाद आप एप्लिकेशन में अन्य पृष्ठों को सूचित कर रहे हैं।

#import <Foundation/Foundation.h> 

extern NSString *const DidLoginNotification; 

@interface LoginViewController : NSObject 
- (void)login; 
@end 


// LoginViewController.m 
#import "LoginViewController.h" 

//define extern const in implementation file only once for the whole process 
NSString *const DidLoginNotification = 
    @"DidLoginNotificationNotified"; 

@implementation LoginViewController 

- (void)login { 
    // Perform notification 
    [[NSNotificationCenter defaultCenter]; 
    sendNotificationName: DidLoginNotification 
                    object:nil]; 
} 

पार्टी प्राप्त करने वाली अधिसूचना को कॉन्स्ट के मूल्य को जानने की आवश्यकता नहीं है।