क्या ऑब्जेक्टिव-सी का तरीका ओवरहेड 'कई छोटे तरीकों' के डिजाइन के दृष्टिकोण को बेवजह बनाता है?


15

मैं आम तौर पर क्लीन कोड में बॉब मार्टिन के रूप में दूसरों के द्वारा अनुशंसित छोटे तरीकों का उपयोग करता हूं । मैंने ऑब्जेक्टिव-सी के इन्टर्नल के बारे में भी काफी पढ़ा है कि कम से कम कुछ इस बारे में सोचा जाए कि इसका मैसेज डिस्पैच कैसे होता है ( इस पर bbums सीरीज़ विशेष रूप से सूचनाप्रद है)।

समय-समय पर अनुकूलन की परवाह किए बिना, मैं जानना चाहता हूं कि क्या उद्देश्य-ग के साथ ऑब्जेक्टिव-सी जो काम करता है, वह सब व्यावहारिक रूप में, 'कई छोटे तरीकों' के लिए महत्वपूर्ण है, जो ऑब्जेक्टिव-सी परियोजनाओं के लिए अनुपयुक्त है।

अनुभवजन्य निष्कर्ष विशेष रूप से स्वागत करते हैं (हो सकता है कि मैं कुछ समय बाद खुद एक परीक्षण स्थापित करूंगा)। बड़े उद्देश्य-सी परियोजनाओं को लिखने वाले किसी भी व्यक्ति का अनुभव भी बहुत अच्छा होगा।

स्पष्टीकरण

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

(इसके लायक क्या है, मैं वर्तमान में ऑब्जेक्टिव-सी लिख रहा हूं, और मैं छोटे तरीकों का उपयोग कर रहा हूं)

आगे निवेदन

मैं उन दोनों उत्तरों से सहमत हूं जो दिए गए हैं। एक और बात जो मैं चाहूंगा, वह यह है कि कोई मुझे (उम्मीद से पर्याप्त) ओपन-सोर्स (या अन्यथा दिखाई देने वाला) ऑब्जेक्टिव-सी कोडबेस के बारे में बताए, जो अच्छे छोटे तरीकों (और छोटी कक्षाओं) का उपयोग करता है। मैंने अभी तक ऑब्जेक्टिव-सी में कुछ भी नहीं देखा है (उदाहरण के लिए) फिटनेस स्रोत के साथ तुलना करने के लिए ।


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

1
यदि आप उस ओवरहेड से बचना चाहते हैं, तो C फ़ंक्शन का उपयोग करें।
राइटफोल्ड

तकनीकी रूप से संभव है, लेकिन कार्यों के साथ बहुत कुछ खो गया है। मैं केवल कोड के लक्षित, प्रदर्शन-संवेदनशील भागों के लिए कार्यों के तरीकों को बदलूंगा। मैं यहाँ के बारे में पूछ रहा हूँ कि क्या ओवरहेड एक पसंदीदा कोडिंग / डिज़ाइन शैली पर पुनर्विचार करने के लिए पर्याप्त समस्याग्रस्त है।
क्राइस

कुछ अच्छे उत्तरों के लिए SO पर Objective-C में संदेश प्रेषण की लागत देखें ।
कालेब

आप Xcode में केवल अपना कोड क्यों नहीं बनाते हैं? मैं समझता हूं कि आप अमूर्त में पूछ रहे हैं और विशिष्ट कोड के बारे में नहीं, लेकिन चूंकि आपने स्पष्ट रूप से बहुत सारे छोटे तरीकों के साथ कुछ कोड प्राप्त किया है, तो इसे क्यों न चलाएं और अपने लिए देखें?
कालेब

जवाबों:


4

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

लेकिन, हमेशा की तरह, आपका माइलेज अलग हो सकता है ...


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

@ क्रिस: "मैंने बहुत उद्देश्य-सी कोड नहीं देखा है जो वास्तव में छोटे तरीकों का पालन करता है" -> बस जिज्ञासु: आपने किस निकाय से ऐसा निष्कर्ष निकाला है? मैं इस पर विश्वास करता हूं, लेकिन मेरा यह भी मानना ​​है कि यह सूक्ष्म अनुकूलन जागरूकता के कारण नहीं है, बल्कि अधिक प्रोग्रामर अच्छे डिजाइन और स्थिरता के सिद्धांतों पर ध्यान केंद्रित नहीं कर रहे हैं। इसे दूसरे तरीके से रखते हुए, उनके जावा, C #, रूबी या जो भी कोड समान प्रथाओं का पालन करना चाहिए ...
जोर्डो

हां, यह काफी संभव है। मेरे पास कोई विशिष्ट कोडबेस नहीं था; बस मैंने साल भर में क्या देखा है या इसलिए मैंने ऑब्जेक्टिव-सी के साथ काम किया है। कोड का सबसे बड़ा सेट जो मैंने देखा है वह ओमनी समूह का ओपन-सोर्स सामान था, और IIRC जिसमें बहुत सारे बड़े तरीके थे। Apple का नमूना कोड भी अक्सर होता है। लेकिन निश्चित रूप से (ए) नमूना कोड सिर्फ इतना है, और (बी) मेरे नमूने को यूआई कोड की ओर भारित किया जा सकता है, विशेष रूप से नियंत्रक देखें, और इन्हें गहरी परतों से अलग कोडित किया जा सकता है।
संकट

2

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

बेशक, ऐसे कई लोग हैं जो ठीक से ऑप्टिमाइज़ करना नहीं जानते हैं, और उनमें से कुछ मेथड ओवरहेड के बारे में जान सकते हैं और ग्लोबल प्रीमेच्योर ऑप्टिमाइज़ेशन की गतिविधियों में संलग्न हो सकते हैं, लेकिन मैं यह नहीं मानता कि समूह काफी महत्वपूर्ण प्रभाव डालता है। ऑब्जेक्टिव-सी इकोसिस्टम पर।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.