2011-06-20 14 views
9

मेरी टीम ने पाया कि हम अपने कोड बेस के दौरान विभिन्न प्रकार के NSDateFormatter ऑब्जेक्ट्स का उपयोग कर रहे थे, और यह देखना शुरू कर दिया कि हम अलग-अलग स्थानों के समूह में सामान्य स्वरूपण आवंटित/आरंभ करने की लागत/भ्रम से कैसे बच सकते हैं।साझा NSDateFormatter - सर्वोत्तम व्यवहार?

एक विचार था कि हम NSDateFormatter कक्षा पर एक श्रेणी बनाना चाहते थे जो एक सामान्य रूप से कॉन्फ़िगर किए गए फ़ॉर्मेटर के स्थिर उदाहरण का संदर्भ प्रदान करेगा। उदाहरण के लिए, हम कई स्थानों में "कम समय" तिथि फ़ॉर्मेटर उपयोग कर रहे थे, और निम्न वर्ग विधि जोड़ने के लिए देख रहे थे:

@implementation NSDateFormatter (NSDateFormatter_PDDateFormatters) 

static NSDateFormatter * shortTimeFormatter = nil; 

+ (NSDateFormatter *) PDSharedShortTimeFormatter { 

    @synchronized([NSDateFormatter class]){ 

     if(shortTimeFormatter == nil){ 

      // Create new formatter for SHORT times (e.g. 12:00 pm) 

      shortTimeFormatter = [[NSDateFormatter alloc] init]; 
      [shortTimeFormatter setDateStyle: NSDateFormatterNoStyle]; 
      [shortTimeFormatter setTimeStyle:NSDateFormatterShortStyle]; 
     } 

     return shortTimeFormatter; 

    } 

    return nil; 
} 

@end 

मुद्दों मैं इस दृष्टिकोण के साथ है में से एक है कि हम वर्तमान में नहीं हैं कि " "NSDateFormatter को बदलने से" की रक्षा। चूंकि फ़ॉर्मेटर हमारे आवेदन के दौरान अनिवार्य रूप से "साझा" है, इसलिए संभावित रूप से समस्याएं पैदा हो सकती हैं यदि कोई अन्य वस्तु फॉर्मेटर की कॉन्फ़िगरेशन (जैसे समय/दिनांक शैली) को बदलना था।

क्योंकि हम इसे आंतरिक रूप से उपयोग कर रहे हैं, इसलिए मैं इस कार्यक्षमता का दुरुपयोग करने वाली हमारी टीम के जोखिम से अधिक चिंतित नहीं हूं (यानी यह एक छोटी सी टीम है, और स्पष्ट रूप से टिप्पणी की गई है)।

हालांकि, मैं यहां सर्वोत्तम प्रथाओं के बारे में सोच रहा था।

क्या डेट फॉर्मेटर के अपरिवर्तनीय संदर्भ को वापस करने का कोई तरीका है? अगर मैं एक फॉर्मेटर की एक प्रति वापस लौटाता हूं, तो क्या हम अब आवंटित आवंटन/इनिट करने से कम महंगे हैं?

क्या यहां कुछ और दृष्टिकोण है?

हम इसके साथ चलेंगे और चलेंगे, लेकिन "बेहतर" कोड लिखने में कुछ प्रतिक्रिया प्राप्त करना हमेशा अच्छा होता है।

उत्तर

9

आम तौर पर, आप इसके बारे में चिंता नहीं करेंगे। Obj-C आपको लगभग किसी भी चीज़ के रसदार अंदरूनी के साथ बेवकूफ़ बना देगा। @private-valueForKey:_thatFunPrivateIvar के खिलाफ भी सुरक्षा नहीं करता है। और यदि सब कुछ विफल हो जाता है, तो आप केवल रनटाइम फ़ंक्शन का आह्वान कर सकते हैं।

हालांकि, यहां सबसे आसान कामकाज एक एपीआई का पर्दाफाश करना होगा जो आंतरिक रूप से कैश किए गए स्वरूपण का उपयोग करता है, लेकिन यह उस फ़ॉर्मेटर्स तक पहुंच प्रदान नहीं करता है जो इसका उपयोग कर रहा है। आपका कोड अब +[Formatter shortTimeStringFromDate:] का उपयोग करने के लिए करेगा जो आपका नमूना कोड अब कर रहा है। प्रश्न में स्वरूपक को आलसी आवंटित किया जा सकता है, और आप शुद्ध करने योग्य स्मृति का उपयोग कर सकते हैं ताकि स्मृति दबाव के तहत एलआरयू फैशन में कैश किए गए स्वरूपण को साफ़ किया जा सके।

+0

इस विशेष मामले में, मैंने 'एनएसडीएटी' कक्षा में "सार्वजनिक" एपीआई जोड़ने के बारे में भी सोचा है: '[तारीख पीडीशॉर्टटाइम]'। फिर, कैश किए गए 'NSDateFormatter' ऑब्जेक्ट को केवल दृश्यों के पीछे पहुंचाया जाता है। जवाब के लिए धन्यवाद! – thauburger

+0

यह एनएसएसटींग यानी [एनएसएसटींग शॉर्टटाइम फ्रॉमडेट:] – ADAM

+0

"बस इसके बारे में चिंता न करें" पर एक श्रेणी के रूप में भी अच्छा होगा, यह जाने का तरीका नहीं है: वस्तुओं को गलती से संशोधित करना अविश्वसनीय रूप से आसान है। निश्चित रूप से कामकाज करना, जो एक अच्छा समाधान है। –

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