2009-12-09 6 views
7

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

पहली समस्या का सामना करना पड़ा है कि मुझे नहीं पता कि ओबीजेसी और सी के बीच एक रेखा को कहां खींचना है, उदाहरण के लिए गणित संचालन से निपटने के दौरान, क्या मुझे गणित का उपयोग करना चाहिए या कोई और "ऑब्जेक्ट- रास्ता "जैसा कि आप स्मॉलटाक में कर सकते हैं (एक संख्या उठाया गया: 3)? सी में सभी पृष्ठभूमि में कोई व्यक्ति ओबीजेसी सीखता है?

एक और चीज जो मुझे नहीं मिल सका एक संग्रह प्रोटोकॉल था (मैंने ऐप्पल द्वारा दिए गए फाउंडेशन फ्रेमवर्क दस्तावेज को देखा है)। क्योंकि मैं एक एक्सप्रेसन ट्री क्लास को कार्यान्वित करना चाहता हूं और मैं जानना चाहता हूं कि क्या सभी विधियां लागू होनी चाहिए (जैसे कि स्मॉलटाक या जावा में) या मुझे हर संग्रह को हाथ से जांचना होगा और देखें कि क्या कोई नया तरीका है कि मेरा नया संग्रह होना चाहिए की है।

मुझे नहीं पता कि मैं बहुत बेवकूफ हूं या मैं उन सुविधाओं की खोज कर रहा हूं जो भाषा/ढांचे के पास नहीं हैं। मैं ओबीजेसी में ओबीजेसी शैली के साथ प्रोग्राम करना चाहता हूं जो सी, जावा या स्मॉलटॉक में नहीं सोच रहा है।

क्षमा करें यदि प्रश्न बहुत लंबा था।

+0

ओबीजेसी सी का विस्तार है, अंत में आपको जो चाहिए उसे खोजते रहें, आप इसे समझ लेंगे। यदि आपके पास विशिष्ट प्रश्न हैं तो उन्हें पोस्ट करें। सॉफ़्टवेयर डेवलपर के रूप में आप अधिकतर समय एपीआई की खोज और अध्ययन करने और चीजों को कैसे करना है, बस सीधे कोडिंग करना चाहते हैं। – stefanB

उत्तर

3

पहली समस्या मैं का सामना किया है मैं कहाँ ObjC और सी

के बीच एक रेखा मेरा नियम सी उपयोग करने के लिए जहाँ भी यह आप के लिए समझ में आता है है आकर्षित करने के लिए पता नहीं है कि है। उद्देश्य-सी का लाभ आपको चुनने का लाभ देता है कि प्रक्रियात्मक होने पर और ऑब्जेक्ट उन्मुख होने पर। जो कोड आप लिख रहे हैं उसके साथ सबसे अच्छा फिट बैठता है।

एक और चीज जो मुझे नहीं मिल सका एक संग्रह प्रोटोकॉल था [...] मैं एक एक्सप्रेसन ट्री क्लास को कार्यान्वित करना चाहता हूं और मैं जानना चाहता हूं कि क्या सभी विधियां लागू होनी चाहिए (जैसे जावा में) मुझे हर संग्रह को हाथ से जांचना होगा और देखें कि मेरे संग्रह में कोई तरीका है या नहीं।

जावा के विपरीत, उद्देश्य-सी में java.util.Collection इंटरफ़ेस जैसे संग्रहों के लिए मास्टर प्रोटोकॉल नहीं है। इसके अलावा, जावा में विशिष्ट कंटेनर कार्यान्वयन का प्रसार नहीं है। हालांकि, यह आपको एक संग्रह को इस तरह से लागू करने की आजादी देता है जो आपके कोड के लिए समझ में आता है।

पेड़ जैसी संरचना बनाने के लिए, आप यह देखने के लिए NSTreeNode पर एक नज़र डाल सकते हैं कि यह लाभ उठाने के लिए उपयोगी हो सकता है या नहीं। (यह आपकी आवश्यकता से अधिक हो सकता है या चाहते हैं, लेकिन शायद एक शॉट के लायक हो सकता है।)

जहां तक ​​अपना खुद का संग्रह रोलिंग है, मैंने CHDataStructures.framework बनाने के दौरान बहुत कुछ सीखा है, और आपका उपयोग करने के लिए आपका स्वागत है जो भी आप उस कोड से पसंद करते हैं, या केवल कोको जैसी संरचनाओं को बनाने के लिए मेरे प्रयासों को देखें, जो फाउंडेशन संग्रहों के पूरक के लिए डिज़ाइन किए गए हैं और समान रूप से संचालित होते हैं। सौभाग्य!

+0

हालांकि सभी जवाब वास्तव में अच्छे थे, मुझे एक चुनना है। तो यही वह जवाब है जिसे मैं उठा रहा हूं। धन्यवाद – GuidoMB

11

बिल्कुल <math.h> का उपयोग करें। 30 चरणों में चलने वाले कार्यों के लिए ओवरहेड भेजने वाले संदेश का भुगतान करने का कोई तरीका नहीं है। यहां तक ​​कि फ़ंक्शन कॉल ओवरहेड भी उस बिंदु पर काफी खड़ा लगता है।

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

3

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

इसके अलावा, अपनी शैली का उपयोग करके ढांचे के साथ बातचीत करने का प्रयास करें ताकि आप अपस्ट्रीम नहीं चला रहे हों।

6

सामान्य रूप से, आप संख्यात्मक गणनाओं के लिए सी विशेषताओं का उपयोग करेंगे। आप आमतौर पर अन्य चीजों के लिए वस्तुओं का उपयोग करेंगे। इसका कारण यह है कि वस्तुएं एक साधारण स्केलर से भारी होती हैं - इसका कोई फायदा नहीं होता है। आप [[NSNumber numberWithInteger:1] numberByAddingNumber:[NSNumber numberWithInteger:2]] क्यों लिखेंगे जब आप केवल 1+2 लिख सकते हैं? यह न केवल पढ़ने के लिए दर्दनाक है, यह बहुत धीमा है और यह आपको कुछ भी नहीं प्राप्त करता है।

दूसरी तरफ, कोको में स्ट्रिंग्स, सरणी, नेटवर्किंग और कई अन्य क्षेत्रों के लिए समृद्ध वस्तु पुस्तकालय हैं, और उनका उपयोग करना एक बड़ी जीत है।

यह जानकर कि वहां क्या है - और इस प्रकार कुछ करने का सबसे आसान तरीका है - सीखने का मामला है। अगर आपको लगता है कि कुछ होना चाहिए और आप इसे नहीं ढूंढ पा रहे हैं, तो आप यहां या ऐप्पल की कोको-देव मेलिंग सूची पर पूछ सकते हैं।

संग्रह प्रोटोकॉल के लिए - वास्तव में कोई नहीं है। इसके सबसे नज़दीकी चीज NSFastEnumeration प्रोटोकॉल है, जो ठीक एक विधि को परिभाषित करती है: countByEnumeratingWithState:objects:count:। यह आपको संग्रह में ऑब्जेक्ट्स को गिनाने के लिए for (id someObject in someCollection) वाक्यविन्यास का उपयोग करने देता है। अन्यथा, सभी संग्रह अपने स्वयं के स्वतंत्र इंटरफेस को परिभाषित करते हैं।

0

जैसा कि उल्लेख किया गया है, अमूर्त संग्रह वर्गों के लिए कोई वास्तविक प्रोटोकॉल नहीं है (NSFastEnumeration प्रोटोकॉल से अलग जो लागू होने पर for(id item in collection) वाक्यविन्यास प्रदान करता है), लेकिन अनुसरण करने के लिए सम्मेलन हैं।

कोको के लिए कोडिंग दिशानिर्देशों के लिए ऐप्पल का परिचय इस में से कुछ को कवर करता है, और वास्तव में नामकरण संग्रह विधियों पर एक अनुभाग है जो सामान्य मामलों को कवर करता है (हालांकि ध्यान दें कि NSArray जैसे सामान्य कंटेनर वर्ग "ऑब्जेक्ट" शब्द का विरोध करते हैं उदाहरणों में सूचीबद्ध "तत्व" के लिए - यानी addObject:, removeObject:, और इसी तरह)।

यहां सूचीबद्ध पैटर्न (दूसरों के बीच) के बाद वास्तव में महत्वपूर्ण है जब आप अपनी कक्षाओं को केवीसी-अनुरूप होना चाहते हैं, जो अन्य उपयोगकर्ताओं को आपके ऑब्जेक्ट के गुणों में परिवर्तनों को देखने की अनुमति देता है।

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