2009-03-01 15 views
10

मैं एएस 3 में कुछ स्वच्छ कोडिंग प्रथाओं को लागू करने के लिए हाल ही में कोशिश कर रहा हूं। इनमें से एक एक वस्तु से Arrays के संदर्भों को दूर नहीं किया गया है। मुद्दा यह है कि मैं एक कक्षा से अतिरिक्त और हटाने को नियंत्रित करता हूं और ऐरे के अन्य सभी उपयोगकर्ताओं को केवल संस्करण पढ़ता है।अपरिवर्तनीय संग्रह क्रियालेख 3

पल कि केवल संस्करण पढ़ पर एक ArrayIterator वर्ग मैंने लिखा है, जो एक ठेठ इटरेटर इंटरफेस (hasNext, getNext) को लागू करता है। यह प्रॉक्सी भी बढ़ाता है, इसलिए इसे प्रत्येक लूप के लिए में उपयोग किया जा सकता है जैसे कि ऐरे कर सकते हैं।

तो मेरा सवाल यह है कि यह कई भाषाओं की मौलिक विशेषता नहीं है? संग्रह के केवल विचार पढ़ने के लिए संदर्भों को पारित करने की क्षमता?

इसके अलावा अब है कि वहाँ AS3 में संग्रह के लिए प्रकार सुरक्षा सुधार हुआ है वेक्टर वर्ग के रूप में, जब मैं एक VectorIterator मैं अचल स्थिति के लिए टाइपिंग के गुम हो एक एक वेक्टर लपेट में,

। क्या एएस 3 में दो इच्छाओं, अपरिवर्तनीयता और टाइपिंग को लागू करने का कोई तरीका है?

उत्तर

4

ऐसा लगता है कि Iterator पैटर्न का उपयोग वर्तमान में एएस 3 में एक सिस्टम के आसपास संग्रह पास करने का सबसे अच्छा तरीका है, जबकि गारंटी है कि इसे संशोधित नहीं किया जाएगा।

IIterator इंटरफ़ेस का उपयोग मैं जावा Iterator पर आधारित है, लेकिन मैं निकालें() विधि के रूप में इस जावा समुदाय में कई द्वारा एक डिजाइन गलती माना जाता है की वजह से यह अनुमति देने के लिए लागू नहीं है,, सरणी तत्वों को हटाने के लिए उपयोगकर्ता।

public interface IIterator 
{ 
    function get hasNext():Boolean 
    function next():* 
} 

यह तो ऐसे ArrayIterator, VectorIterator आदि

सुविधा के लिए के रूप में वर्गों द्वारा कार्यान्वित किया जाता है मैं अपने ठोस इटरेटर वर्गों पर प्रॉक्सी का विस्तार, और के लिए सहायता प्रदान: नीचे मेरी IIterator अंतर्गत प्रयोग किया है प्रत्येकअगलीनाम इंडेक्स() और अगली वैल्यू() विधियों को ओवरराइड करके AS3 में loops के लिए। इसका मतलब है कि आम तौर पर इस्तेमाल किए गए कोड को मेरे IIterator का उपयोग करते समय बदलने की आवश्यकता नहीं होती है।

var array:Array = ["one", "two", "three"] 

for each (var eachNumber:String in array) 
{ 
    trace(eachNumber) 
} 

var iterator:IIterator = new ArrayIterator(array) 

for each (var eachNumber:String in iterator) 
{ 
    trace(eachNumber) 
} 

केवल समस्या उपयोगकर्ता IIterator इंटरफेस को देखो और पता है कि वे संग्रह से अधिक पुनरावृति करने के लिए एक के लिए-प्रत्येक पाश का उपयोग कर सकते करने के लिए के लिए कोई रास्ता नहीं है ...। उन्हें यह देखने के लिए ArrayIterator के कार्यान्वयन को देखना होगा।

+0

पुनरावर्तक के पीछे तर्कसंगतता क्या है? यह एक आलोचना नहीं है, मैं सिर्फ उत्सुक हूँ। साथ ही, ऑब्जेक्ट गतिशील होने के बिना, परिचित ब्रैकेट सिंटैक्स (myArray [i] = "foo") के साथ एक्सेस-बाय-इंडेक्स प्रकार की कार्यक्षमता प्रदान करने के लिए इसे विस्तारित करना संभव है? –

+0

मुझे लगता है कि मैंने प्रॉक्सी दस्तावेज को पहली बार पर्याप्त रूप से पर्याप्त नहीं पढ़ा। इसके आसपास दूसरी बार ऐसा लगता है कि यह वही है जो प्रॉक्सी वर्ग का उपयोग करने के लिए किया जाता है। –

+0

हाँ :) प्रॉक्सी काफी आसान है, तो आप E4X एपीआई की एक अपेक्षाकृत पूरा क्लोन बना सकते हैं, लेकिन एक है कि XML की बजाय YAML बनाता है, बात की इस प्रकार की, बस getProperty और setProperty तरीकों –

0

कुछ लोग तर्क देंगे कि आप पुस्तकालयों के रूप में ऐसे पैटर्न को कार्यान्वित कर सकते हैं यह तथ्य भाषा में विशेषताओं को जोड़ने के खिलाफ एक तर्क है (उदाहरण के लिए, सी ++ भाषा डिजाइनर आमतौर पर यह कहते हैं)।

+0

मुझे लगता है कि ब्रायन का क्या मतलब था कि यह मूल पुस्तकालय का हिस्सा होना चाहिए, न कि भाषा ही। (एएस 3 ईसीएमए द्वारा संभाला जाता है।) – bzlm

+0

सी ++ कॉन्स में भाषा का हिस्सा होता है और अक्सर सदस्य चर के अपरिवर्तनीय दृश्य वापस करने के लिए उपयोग किया जाता है। तो ऐसा कुछ ऐसा नहीं था जिसे एक पुस्तकालय के रूप में माना जा सकता था। (यह अब कार्यान्वित हो सकता है, क्योंकि सी ++ ने टेम्पलेट प्राप्त किए हैं, लेकिन इसके मूल रूप में नहीं) –

+1

हां मेरा मतलब एएस 3 के मामले में कोर लाइब्रेरी है। मुझे आश्चर्य है कि संग्रह पर अपरिवर्तनीय विचारों को क्यों महत्वपूर्ण नहीं माना जाता है? यह एक मौलिक रूप से अच्छी डिजाइन प्रैक्टिस की तरह लगता है, यह कहने में सक्षम होने के लिए "मैं गारंटी देता हूं कि यह संग्रह केवल इस वर्ग के भीतर संशोधित किया जाएगा"। –

0

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

+0

मेरे पास अब प्रॉक्सी, इटरेटर संयोजन के माध्यम से अपरिवर्तनीयता है, लेकिन प्रॉक्सी ऑब्जेक्ट्स टाइपलेस फ़ंक्शन के कारण मैं वेक्टर क्लास के टाइपिंग को खो देता हूं। –

+0

हाँ वेक्टर इटरेटर कन्स्ट्रक्टर के लिए एक प्रकार का जोड़ा रन-टाइम प्रकार कास्टिंग मुद्दों को पकड़ने के लिए एक संभावित समाधान होगा। मेरा मुद्दा यह है कि मुझे आश्चर्य है कि पहली बार रिलीज से कई भाषाओं/मूल libs में केवल संग्रह क्यों मौजूद नहीं हैं? वे अच्छे डिजाइन अभ्यास की तरह लगते हैं। –

+0

मैं नहीं कह सकता कि यह क्यों नहीं है। लेकिन, यदि आप अपने कार्यान्वयन को सार्वजनिक करते हैं और जिन समस्याओं का सामना करना पड़ता है, तो महत्व/लोकप्रियता के आधार पर इसे अगले संस्करण के लिए एडोब द्वारा उठाया जा सकता है। एएस अभी भी अपने किशोरों के वर्षों में बहुत अधिक है। – dirkgently

0

मैंने एएस 3 के लिए अपरिवर्तनीय संग्रह कक्षाओं की एक छोटी लाइब्रेरी बनाई है, जिसमें एक टाइप की गई ऑर्डर सूची शामिल है, जो लगता है कि यह आपकी आवश्यकताओं को पूरा करेगा। विवरण के लिए this blog post देखें।

+0

धन्यवाद डेविड, अच्छा लग रहा है ओवरराइड, मैंने प्रॉक्सी के साथ काफी कुछ भी लागू किया है। मैं आपका कोड एक नज़र दूंगा, देखें कि क्या मुझे कुछ अच्छे विचार मिल सकते हैं –

0

कुछ ऐसा करने के लिए मैं ऐसा करता हूं जो सूची बनाए रखता है, उस सूची को केवल slice() के माध्यम से गेटटर में उस सूची की एक प्रति वापस लौटाता है। उदाहरण के तौर पर, मेरे गेम इंजन में Scene है जो सभी Beings की एक सूची बनाए रखता है जो इसमें जोड़ा गया है। उस सूची में तो जैसे एक प्रति के रूप में सामने आ रहा है:

public function get beings():Vector.<Being> 
{ 
    return _beings.slice(); 
} 

(एक पुराने धागा पुनर्जीवित करने के लिए क्षमा करें, मैं इस जबकि भर में वास्तव में क्या ब्रायन के जवाब कवर को लागू करने के तरीकों की तलाश कर आया था और सोचा था कि मैं में मेरी 2 सेंट फेंक इस विषय पर)।

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