एआरसी के तहत गुण: हमेशा या सार्वजनिक-केवल?


9

रॉबर्ट मैकनेली द्वारा "द कोड कमांड: बेस्ट प्रैक्टिस फॉर ऑब्जेक्टिव-सी कोडिंग" नाम से एक लेख को दो साल पहले पढ़ने के बाद , मैंने अपने ऑब्जेक्टिव-सी कक्षाओं के प्रत्येक डेटा सदस्य के लिए गुणों का उपयोग करने का अभ्यास अपनाया। मई 2012 के अनुसार तीसरी आज्ञा)। McNally ऐसा करने के इन कारणों को सूचीबद्ध करता है (मेरा जोर):

  1. गुण पहुँच प्रतिबंध लागू करते हैं (जैसे कि आसानी से)
  2. गुण स्मृति प्रबंधन नीति लागू करते हैं (मजबूत, कमजोर)
  3. गुण कस्टम सेटर और गेटर्स को पारदर्शी रूप से लागू करने का अवसर प्रदान करते हैं।
  4. कस्टम सेटर या गेटर्स वाली संपत्तियों का उपयोग थ्रेड-सुरक्षा रणनीति लागू करने के लिए किया जा सकता है।
  5. उदाहरण चर तक पहुंचने का एक ही तरीका होने से कोड पठनीयता बढ़ जाती है।

मैंने अपनी अधिकांश संपत्तियाँ निजी श्रेणियों में डाल दी हैं, इसलिए नंबर 1 और 4 आमतौर पर मेरे द्वारा चलाए जाने वाले मुद्दे नहीं हैं। तर्क 3 और 5 अधिक 'नरम' हैं, और सही उपकरण और अन्य निरंतरताओं के साथ वे गैर-मुद्दे बन सकते हैं। तो आखिरकार, मेरे लिए इन तर्कों का सबसे प्रभावशाली नंबर 2 था, स्मृति प्रबंधन। मैं तब से ऐसा कर रहा हूं।

@property (nonatomic, strong) id object; // Properties became my friends.

मेरी पिछली कुछ परियोजनाओं के लिए मैंने एआरसी का उपयोग करने के लिए स्विच किया है, जिसने मुझे संदेह किया है कि क्या बहुत अधिक कुछ के लिए गुण बनाना अभी भी एक अच्छा विचार है या शायद थोड़ा अतिशयोक्तिपूर्ण है। एआरसी मेरे लिए ऑब्जेक्टिव-सी ऑब्जेक्ट्स को मैनेज करने वाली मेमोरी का ख्याल रखता है, जो कि ज्यादातर strongसदस्यों के लिए ठीक काम करता है अगर आप सिर्फ आइवर घोषित करते हैं। एआरसी से पहले और बाद में सी-प्रकार आपको मैन्युअल रूप से प्रबंधित करना था, और weakगुण ज्यादातर सार्वजनिक हैं।

बेशक, मैं अभी भी उन चीजों के लिए गुणों का उपयोग करता हूं, जिन्हें कक्षा के बाहर से पहुंच की आवश्यकता होती है, लेकिन वे ज्यादातर केवल मुट्ठी भर संपत्तियों के होते हैं, जबकि अधिकांश डेटा सदस्यों को कार्यान्वयन हेडर के तहत ivars के रूप में सूचीबद्ध किया जाता है।

@implementation GTWeekViewController
{
    UILongPressGestureRecognizer *_pressRecognizer;
    GTPagingGestureRecognizer *_pagingRecognizer;
    UITapGestureRecognizer *_tapRecognizer;
}

एक प्रयोग के रूप में मैं इसे थोड़ा और सख्ती से कर रहा हूं, और हर चीज के गुणों से दूर जाने के कुछ अच्छे सकारात्मक दुष्प्रभाव हैं।

  1. डेटा सदस्य कोड आवश्यकताएँ ( @property/ @synthesize) केवल ivar घोषणा के लिए सिकुड़ जाती हैं।
  2. मेरे अधिकांश self.somethingसंदर्भ सिर्फ साफ हो गए _something
  3. यह आसानी से पहचाना जा सकता है कि कौन से डेटा सदस्य निजी हैं (ivars) और जो सार्वजनिक हैं (गुण)।
  4. अंत में, ऐसा लगता है कि इस तरह से एप्पल का उद्देश्य था, लेकिन यह व्यक्तिपरक अटकलें थीं।

सवाल पर : मैं धीरे-धीरे अंधेरे पक्ष की ओर फिसल रहा हूं , कार्यान्वयन-आइवर के पक्ष में कम और कम गुणों का उपयोग कर रहा हूं । क्या आप मुझे इस बात के लिए थोड़ा तर्क प्रदान कर सकते हैं कि मुझे हर चीज के लिए गुणों का उपयोग करने से क्यों चिपके रहना चाहिए, या अपने विचारों की वर्तमान ट्रेन की पुष्टि करना चाहिए कि मुझे अधिक ivars और कम गुणों का उपयोग केवल जहां आवश्यकता हो? दोनों पक्षों के लिए सबसे प्रेरक जवाब मेरा निशान प्राप्त करेगा।

EDIT: McNally ने ट्विटर पर कहा, "मुझे लगता है कि गुणों के साथ चिपके रहने का मेरा मुख्य कारण है: सब कुछ करने का एक तरीका, वह सब कुछ करता है (KVC / KVO सहित)।"

जवाबों:


5

क्या आप मुझे इस बात के लिए थोड़ा तर्क प्रदान कर सकते हैं कि मुझे हर चीज के लिए गुणों का उपयोग करने से क्यों चिपके रहना चाहिए, या अपने विचारों की वर्तमान ट्रेन की पुष्टि करना चाहिए कि मुझे अधिक ivars और कम गुणों का उपयोग केवल जहां आवश्यकता हो?

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

  1. एक @property घोषणा काफी एक ivar घोषणा के समान है। @Synthesize निर्देश से बचना एक बड़ी जीत की तरह नहीं है - हम बहुत सारे कोड के बारे में बात नहीं कर रहे हैं।

  2. foo.somethingवाक्य रचना यकीनन एक बहुत से बेहतर है _something। प्रॉपर्टी ऐक्सेस सिंटैक्स स्पष्ट रूप से किसी संरचना के सदस्यों तक पहुँचने के लिए C के डॉट सिंटैक्स की तरह दिखने और काम करने के लिए डिज़ाइन किया गया है। इस बारे में स्पष्ट होना कि आप किस वस्तु तक पहुँच रहे हैं (चाहे वह हो selfया कुछ और) सहायक हो। (कुछ लोग - मुझे नहीं! - self->somethingइस कारण से आइवर एक्सेस की वकालत करते हैं।) आइवर के लिए अग्रणी अंडरस्कोर सम्मेलन ठीक है, लेकिन इसका उपयोग सभी उद्देश्य-सी कोड द्वारा लगातार नहीं किया जाता है।

  3. गुण एक ही वर्ग के अन्य वस्तुओं में संग्रहीत डेटा तक पहुँचने के लिए एक बेहतर विकल्प लगते हैं (जिसे "निजी" एक्सेस के तहत अनुमति दी जाती है) और उपवर्गों द्वारा एक्सेस के लिए (जैसे C ++ की "संरक्षित")। इसलिए 'गुण == जनता' का विचार कुछ धुंधला है।

  4. मेरी भावना यह है कि गुणों का उद्देश्य स्मृति प्रबंधन को आसान बनाना और कुछ अन्य लाभ प्रदान करना था। जैसा कि आप कहते हैं, स्मृति प्रबंधन लाभ कम होने के साथ, गुण कम सम्मोहक लगते हैं।

आपके द्वारा चुना गया रास्ता - आंतरिक डेटा के लिए प्रत्यक्ष ivar पहुंच पर वापस जाना - एक बहुत ही उचित विकल्प की तरह लगता है और आपके पाठ्यक्रम को बदलने का कोई स्पष्ट कारण नहीं है। लेकिन संपत्तियों से चिपकना भी काफी उचित है - कमियां महत्वपूर्ण नहीं हैं, और केवीओ अनुपालन और अधिक सुसंगत सदस्य अभिगम शैली जैसे कुछ अच्छे लाभ हैं।

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


1
हाय @ कालेब, समय निकालने और एक ठोस पोस्ट लिखने के लिए धन्यवाद। मैंने KVO पहलू के बारे में नहीं सोचा था। मैं वास्तव में बहुत उत्सुक हूं जहां Apple यह सब ले रहा है। ARC चरणों की एक श्रृंखला के रूप में महसूस करता है। मैं यह देखने के लिए प्रतीक्षा करूंगा कि क्या किसी और व्यक्ति को इस विषय पर तौलने की परवाह है, अन्यथा चिह्नित प्रश्न की जांच करें।
१२'१२ बजे १२:०२

1
@epologee मदद करने के लिए खुशी है। आइवर के लिए प्लस कॉलम में जोड़ने के लिए एक और चीज यह है कि आप उन्हें डीबगर में आसानी से देख सकते हैं। यह संपत्तियों के लिए भी सही है, यदि आपने स्पष्ट रूप से संपत्ति का उपयोग करने वाले हाथी को घोषित किया है। सिंथेसाइज्ड आइवर डिबगर में दिखाई नहीं देते हैं। (किसी दिन मुझे उस परिवर्तन को देखकर आश्चर्य नहीं होगा।)
कालेब

-1

मैं भी इस सवाल पर विचार कर रहा हूं। मेरी विनम्र राय में, केवल एक्सेसर्स के लिए गुणों का उपयोग करना कोड को बहुत अधिक पठनीय बनाता है। आप तुरंत देख सकते हैं कि सार्वजनिक रूप से एक्सेस किए जाने के लिए कौन से चर हैं। और व्यक्तिगत रूप से, हमेशा एक चर के सामने @property (...) टाइप करने में समय लगता है।


हाय एलेक्स, मुझे लगता है कि आप एसई पर अधिक हाल के सवालों के जवाब देने से बेहतर हैं। मैं समय लेने वाले तर्क से बहुत सहमत नहीं हूं। मैं ऐसा कोड नहीं लिखता जिससे मुझे लिखने में समय की बचत होती है, मुझे ऐसा कोड लिखना पसंद है जो मेरे भविष्य के स्वयं या किसी और को इसे समझने के लिए बचाता है। उस ने कहा, -1 वोट मेरा नहीं था। वोट को स्पष्ट करने के लिए उस व्यक्ति के लिए अच्छा होगा।
epologee
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.