2012-02-25 11 views
7

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

मेरी समझ के लिए यह नाम और मूल्यों का संग्रह है, जैसे .NET's NameValueCollection: anObject.Address = "An address Value" सेट करने के बजाय आप anObject.Properties["Address"] = "An address value" लिखेंगे। ग्रेट। तो क्या? क्योंकि यह मेरे लिए बहुत आसान प्रतीत होता है मुझे यकीन है कि यह नहीं हो सकता है।

या ऐसा इसलिए है क्योंकि .NET का प्रतिबिंब है और इसलिए कुंजी-मूल्य-कोडिंग जैसी किसी चीज़ की आवश्यकता नहीं है? मैं "anObject" के प्रकार को पकड़ सकता हूं और इसके सभी गुणों को लूप करने के लिए प्रतिबिंब का उपयोग कर सकता हूं और "पता" नामक व्यक्ति की तलाश कर सकता हूं और फिर मान सेट करने के लिए प्रतिबिंब का उपयोग कर सकता हूं। क्या यह शायद केवीसी का समानता है?

मुझे उम्मीद है कि वहां कोई ऐसा व्यक्ति है जो ओबीजेसी और सी #/नेट में समर्थक है जो मुझे समझा सकता है कि लाभ क्या हैं और यह .NET में कैसे अनुवाद करेगा। कृपया मुझे ऐप्पल के दस्तावेज को इंगित न करें। मुझे वह सब पता है। मैं यह पता लगाने की कोशिश कर रहा हूं कि मेरे कोडिंग-लाइफ में अब तक केवीसी को नहीं जानते हैं? या क्या मैं शायद .NET में ऐसा कुछ उपयोग कर रहा हूं, यह पता नहीं है कि अगर मैं ओबीजेसी का उपयोग कर रहा हूं तो यह केवीसी में अनुवाद करेगा?

+1

यदि कोई व्यक्ति जो सी #/एनईटी पर अनजान है, उसे एक टिप्पणी की अनुमति है - केवीसी का वास्तव में उपयोगी पहलू यह है कि यह केवीओ (कुंजी-मूल्य निरीक्षण) मौजूद है। – Monolo

उत्तर

11

कोई ऐसा जो अब शायद 3 साल के लिए दोनों हर दिन का उपयोग करता है से:

आप पता लगा, वहाँ कि शब्दकोशों और सी # में NameValueCollections साथ नहीं किया जा सकता आश्चर्यजनक जटिल कुछ भी नहीं KVC में है।

बड़ा अंतर यह है कि केवीसी भाषा में बनाया गया है।Obj-C IS एक नाम ValueCollection में एक ऑब्जेक्ट। इसका उपयोग करने के लिए आपको विकसित करने के तरीके (कक्षाओं और गुणों से शब्दकोशों में) को बदलने की ज़रूरत नहीं है। आप अपनी ऑब्जेक्ट को अपनी इच्छित संपत्तियों के साथ बना सकते हैं, और उसके बाद बाद में एक मूल्य को कॉल करें: @ "name", और सबकुछ अभी भी काम करता है।

अब आप कह सकते हैं: "हाँ शांत है, लेकिन मैं इसे प्रतिबिंब के साथ कर सकता हूं!"। निश्चित रूप से आप कर सकते हैं, लेकिन पहले की तरह, आपको फिर से विकसित करने के तरीके को बदलना होगा, इस तथ्य की गिनती नहीं कि प्रतिबिंब सामान्य रूप से बहुत धीमा है।

केवीसी की एक और अच्छी सुविधा यह आपको केवीओ का उपयोग करने की अनुमति देती है, जो मूल रूप से आपको उन ऑब्जेक्ट्स में कोड की एक पंक्ति लिखने के बिना किसी ऑब्जेक्ट में बदलावों के बारे में सूचनाएं प्राप्त करने के लिए पंजीकरण करने की अनुमति देती है। इसलिए, आपके आवेदन में किसी ऑब्जेक्ट में, आप "addObserver: forKeyPath:" को कॉल कर सकते हैं, और यदि आपके एप्लिकेशन में कोई और व्यक्ति उस संपत्ति को बदलता है तो कॉलबैक प्राप्त करें। यह आईओएस ऐप जैसे लाइव ऐप्स के लिए वास्तव में उपयोगी है।

फिर से, आप सी # में केवीओ को कार्यान्वित कर सकते हैं (उदाहरण के लिए एमवीवीएम फ्रेमवर्क उदाहरण के लिए), लेकिन इसके लिए आपको अतिरिक्त कोड लिखना होगा। Obj-C में, यह भाषा में बनाया गया है।

+1

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

+0

@AndreyTarantsov हाँ, पूरी तरह से कीपैथ चीज़ (चयनकर्ताओं के साथ) पर सहमत हैं। यह उन चीजों में से एक है जो सी # में करने योग्य हैं, लेकिन वे इसे करने के लिए बहुत अधिक कोड लेते हैं, और इसलिए कोई भी ऐसा नहीं करता है। –

4

आप इस

anObject.Address = "An address Value" 

की तरह एक संपत्ति तक पहुंचते हैं तो कोड बहुत "स्थिर" हो जाएगा। यह हमेशा का उपयोग करेंगे Address

आप इस

void SetProperty (string propertyName, string value) 
{ 
    anObject.Properties[propertyName] = value; 
} 

आप ऐसा होगा यदि आप संकलन समय जो संपत्ति पहुँचा जा होगा पर पता नहीं है की तरह एक और अधिक गतिशील कोड बना सकते हैं।

सी # में आप आमतौर पर कुंजी/मूल्य जोड़े संग्रहीत करने के लिए Dictionary<TKey,TValue> का उपयोग करेंगे। उद्देश्य-सी में केवीसी के माध्यम से गुणों को स्वचालित रूप से एक्सेस करना सी # में समर्थित नहीं है। आप या तो के रूप में

public Dictionary<string,string> Properties { get; private set; } 

संपत्ति घोषित करने और वर्ग निर्माता में यह दृष्टांत

Properties = new Dictionary<string,string>(); 

तो साथ आप इसे इस

anObject.Properties[propertyName] = value; 

की तरह यहां पहुंच सकता है या आप Reflection का उपयोग करना होगा होगा संपत्ति का उपयोग करने के लिए

Type type = anObject.GetType(); 
// Or Type type = typeof(TypeOfAnObject); 
PropertyInfo prop = type.GetProperty(propertyName); 
prop.SetValue(anObject, propertyValue, null); 

हालांकि, यह बहुत ही कुशल नहीं है।

+0

सरणी शैली का उपयोग सी # में एक सूचकांक के समान है। – pickypg

7

मैं MonoMac, MonoTouch के लिए सहकर्मी परियोजना के संदर्भ में इस बारे में भी ब्लॉग लेकिन मैक अनुप्रयोगों के निर्माण के लिए इस्तेमाल किया:

http://tirania.org/monomac/archive/2010/Dec-07.html

मुख्य मान कोडिंग प्रथाओं कि करने के लिए ऐप्स को अनुमति का एक सेट है स्ट्रिंग का उपयोग कर ऑब्जेक्ट गुणों का उपयोग करें। यह सिल्वरलाइट में बाध्यकारी अभिव्यक्तियों के समान है। दोनों स्थितियों में उद्देश्य टूलिंग की अनुमति देना है जो आपके प्रोग्राम से गुणों तक पहुंचने के लिए सीधे आपके मूल कोड तक पहुंच नहीं है।

विशेष रूप से, यह उपयोगी है क्योंकि कुछ एपीआई इसका लाभ उठा सकते हैं। उदाहरण के लिए CoreAnimation ऑब्जेक्ट को "पथ" दिए गए गुणों को एनिमेट कर सकता है। उदाहरण के लिए, आप कर सकते हैं:

var animateX = CAKeyFrameAnimation.FromKeyPath ("position.x"); 
pos.Values = new NSNumber [] { 0, 10, 60 }; 
layer.AddAnimation (animateX, "move"); 

"position.x" इस मामले में संदर्भ देता है परत की स्थिति, और उस स्थिति के भीतर यह एक्स घटक है।

उपरोक्त ब्लॉग पोस्ट इस प्रोटोकॉल में भाग लेने के लिए वास्तव में अपनी खुद की वस्तुओं का खुलासा कैसे कर सकता है (कुंजी-वैल्यू-कोडिंग सिस्टम में उन्हें दृश्यमान बनाने के लिए अपनी खुद की संपत्तियों को पंजीकृत करना) के बारे में अधिक जानकारी देता है।

केनेथ, MonoMac डेवलपर्स की एक और एक बड़े पैमाने पर यहां इस बारे में भी ब्लॉग:

http://cocoa-mono.org/archives/153/kvc-kvo-and-cocoa-bindings-oh-my-part-1/

विशेष रूप से वह प्रतिबिंब के साथ समानता के साथ संबंधित है और वह आप अपने सी # चालू करने के लिए [निर्यात] उपयोग करने के लिए कैसे पता चलता है केवीसी अनुपालन कोड में भी कोड।

+1

लिंक के लिए +1 जो केवीसी की प्रतिबिंब की तुलना करता है! – Krumelur

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