2011-06-09 8 views
9

होने से कैसे बचें मैं थोड़ी देर के लिए एक्शनस्क्रिप्ट 3 के साथ प्रोग्रामिंग कर रहा हूं और मैंने देखा है कि मेरे कोड की प्राकृतिक प्रगति एक विशाल दस्तावेज़ वर्ग के रूप में दर्जनों सदस्य चर के साथ प्रतीत होती है, कॉलबैक, और मंच पर वस्तुओं को संभालती है। संक्षेप में: यह एक गड़बड़ है!गन्दा AS3 कोड

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

तो, मैं सोच रहा हूं ... इस कोड-जंगली जंगली को साफ करने में मदद करने के कुछ अच्छे तरीके क्या हैं? या यह सामान्य है? मैं एक सी ++ पृष्ठभूमि से आया हूं, और मुझे ऑब्जेक्ट उन्मुख सामग्री लिखना पसंद है, लेकिन मुझे उस तरह की संरचना को फ्लैश पर ले जाने का कोई तरीका नहीं दिख रहा है। किसी अंतर्दृष्टि की वास्तव में सराहना की जाएगी।

धन्यवाद

उत्तर

9

आप अपने एएस 3 प्रोजेक्ट में अपने कई सी ++ कौशल लागू कर सकते हैं।

बहुत सारे चाल हैं। खुशी है कि आप मुख्य टाइमलाइन पर कोड डाल लाया। टाइमलाइन पर कोड डालने के बजाय (यह एएस 2 प्रोग्रामों में बहुत आम है और एएस 3 के साथ आप इसे पूरी तरह से टाल सकते हैं) मैं प्रत्येक ऑब्जेक्ट को एक अलग वर्ग के रूप में सोचने की सलाह दूंगा। आपके मूवीक्लिप कि आप माउसक्लिक कोड को लागू कर रहे हैं, उदाहरण के लिए, अपनी कक्षा के साथ बनाई गई वस्तु हो सकती है। कहें मूवीक्लिप एक गेंद का ग्राफिक है। आप एक 'गेंद' वर्ग है कि (inherits) मूवीक्लिप वर्ग फैली बनाने जाना चाहिए, और यह के भीतर माउस क्लिक घटना संभाल:

package 
{ 
    import flash.display.MovieClip; 
    import flash.events.MouseEvent; 

    public class myObjects.Ball extends MovieClip 
    { 
     public function Ball() 
     { 
      this.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); 
     } 

     private function mouseDownHandler(event:MouseEvent):void 
     { 
      // Code 
     } 
    } 
} 

फिर, लाइब्रेरी फलक में गेंद की अपनी मूवीक्लिप मिल जाए, सही इसे क्लिक करें, गुण , उन्नत मोड पर स्विच करें, एएस के लिए निर्यात बंद करें। अब, ध्यान दें कि आपकी मूवीक्लिप पहले से ही मूवीक्लिप क्लास को बेस बेस के रूप में कैसे संदर्भित करती है? आपकी बॉल क्लास मूवीक्लिप क्लास को विस्तारित करने के बाद आपको इसकी आवश्यकता नहीं होगी .. इसलिए क्लास फ़ील्ड में 'myObjects.Ball' लिखें और बेस क्लास फ़ील्ड को साफ़ करें। यदि आप अपने नामांकित गेंद वर्ग के लिए पथ लिखते हैं तो फ्लैश आईडीई पता लगा सकता है तो आपको एक हरा चेकमार्क देखना चाहिए।

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

मैंने समझाई गई कक्षा को विस्तारित करना 'विरासत' के एएस 3 का संस्करण है (बॉल क्लास मूवीक्लिप क्लास को प्राप्त करता है)। आप अन्य ओओ-अवधारणाओं का भी उपयोग कर सकते हैं जैसे polymorphism और encapsulation।जहां भी संभव हो, आपको कक्षाओं को अलग करने के लिए अपने कोड को समाहित करना चाहिए। कहें कि क्या आपके प्रोजेक्ट में मूवीक्लिप्स के कुछ अलग-अलग प्रकार हैं, और आप चाहते हैं कि बॉल क्लास सॉकर बॉल, पूल बॉल और बेसबॉल के लिए मूल वर्ग हो। उनमें से प्रत्येक बच्चे कक्षाएं कक्षा वर्ग का विस्तार कर सकती हैं। बड़ी परियोजनाओं के लिए उपयोगी एक और चीज है जो मेरे सभी एप्लिकेशन की घटनाओं को संभालने के लिए एक स्थिर वर्ग बनाना है। चूंकि मैं इसे public static class के रूप में परिभाषित करता हूं, इसलिए मैं इसे अपने प्रत्येक वर्ग में आयात कर सकता हूं और इसके चर केवल एप्लिकेशन की अवधि के लिए बनाए जाते हैं। यह बेहद उपयोगी हो सकता है।

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

व्यक्तिगत रूप से, मुझे लगता है कि आप एएस 3 में ऐप्स विकसित करने का प्रयास करते हैं जैसे कि आप सी ++ में विकसित हो रहे हैं, उतना ही मजेदार हो जाता है और आपका कोड जितना अधिक पुन: प्रयोज्य हो जाता है। इसे जारी रखें .. जल्द ही कोड की गड़बड़ी के बजाय आपको एक्शनस्क्रिप्ट फाइलों की गड़बड़ी होगी .. डबल-धार वाली तलवार का बिट लेकिन व्हाट्सव्स।

+0

+1 उत्तर। मुझे लगता है कि मुख्य बात ध्यान में रखनी है (ओपी पर विचार करना सी ++ से आता है) यह है कि टाइमलाइन कोड बहुत अप्रत्याशित हो सकता है, और हर कीमत पर (दुर्लभ अपवाद के साथ) होना चाहिए। एएस 3 में ऑब्जेक्ट उन्मुख सुविधाओं के साथ, यह भी अनावश्यक है। – Bosworth99

+0

दाएं। मुझे लगता है कि बात यह है कि, जब मैं पहली बार एएस में शामिल हो रहा था, मैंने कुछ बुरी आदतों का निर्माण किया ... और वे मुझे फंस गए क्योंकि वे मुझे परिणाम दे रहे थे। लेकिन हाँ, यह सही तरीके से काम करने का समय है। –

+0

बिल्कुल। फ्लैश आईडीई में टाइमलाइन कोडिंग यहूदी है और उचित वर्ग फ़ाइलों के साथ प्रतिस्थापित किया जाना चाहिए। भी, ऐसा करने में आपको मूवीक्लिप ऑब्जेक्ट्स के बजाय स्लिम स्प्राइट ऑब्जेक्ट्स का उपयोग करना चाहिए। – TheDarkIn1978

1

एक MVC ढांचे का प्रयोग करें। कुछ उन्हें सीमित करते हैं, लेकिन हर बार जब मैं एक "सरल" परियोजना के लिए उपयोग नहीं करता हूं, तो दायरा बढ़ता है और मैंने किए गए बुरे निर्णय पर डरावनी चीख में चिल्लाया।

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

एक अच्छा ढांचा आपको अन्य परियोजनाओं में चीजों का पुन: उपयोग करने की अनुमति देता है।

इसमें एक अच्छी ढांचे में पहले से ही मनुष्यों के घंटों पर डूब गया है और अधिकतर लोगों को एक ही प्रयास के बिना एक साथ रखा जा सकता है।

मैं PureMVC का उपयोग करता हूं, लेकिन किसी भी लोकप्रिय व्यक्ति को काम करना चाहिए।

2

ठीक है, आप जो कुछ भी कर सकते हैं वह प्रत्येक एप्लिकेशन राज्य को मूवीक्लिप में लपेटता है। फिर आप इस मूवीक्लिप को कक्षा सौंपने में सक्षम होंगे, और आप तारों (घटनाओं & सामान) कर रहे हैं।

व्यक्तिगत रूप से, मैं समयरेखा को एक साथ जोड़ दूंगा। यहां बताया गया है कि मैं कैसे काम करता हूं:

मैं फ़्लैश बिल्डर में एक शुद्ध एक्शनस्क्रिप्ट प्रोजेक्ट बनाता हूं। मैं lib फ़ोल्डर में कोई बाहरी पुस्तकालय जोड़ता हूं। मैं अपनी संपत्ति के लिए फ्लैश प्रो में fla बना देता हूं। यह फ्लै एक एससीसी निर्यात करता है, जो कि मेरे फ्लैश बिल्डर प्रोजेक्ट से जुड़ा हुआ है।

आप RobotLegs को भी आजमा सकते हैं। यह एक छोटा एमवीसी ढांचा है जो आपको अपने आवेदन को तारने में मदद करता है।

2

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

मैं अपनी आवश्यकताओं के अनुसार, मेरा lib फ़ोल्डर भी व्यवस्थित करता हूं। उदाहरण:

lib 
    -> gui 
    ->Controls.as (Controls class) 
    -> etc.. 
    -> elements 
    -> Ball.as (Ball class for controling bal element) 
    -> Hammer.as (Class for controling hammer) 
    -> etc.. 
    -> animation 
    ->Tween.as (custom tween class) 
    ->etc.. 
    -> data 
    -> XmlParser.as (class for getting data from xml) 
    -> etc.. 

इस संरचना का आकलन सिर्फ एक उदाहरण है और आपको किसी भी तरह से व्यवस्थित किया जा सकता है।

कि बगल में मैं प्रदर्शन हिस्सा है और कभी कभी भी अलग डेटा हिस्से से तर्क हिस्सा अलग करने की कोशिश।

हर परियोजना के साथ

मैं अपने बाहरी पुस्तकालय, जिसमें मैं वर्तमान परियोजना के लिए बनाया पुन: प्रयोज्य कक्षाओं डाल निर्माण और मुझे पता है या मैं वे/भविष्य की परियोजनाओं में इस्तेमाल किया जा सकता होगा लगता है।

1

चूंकि आप ओओपी पृष्ठभूमि से आपको यह समस्या नहीं होनी चाहिए। हालांकि यह कुछ महान किताबों के माध्यम से त्वरित पढ़ने के साथ आसानी से तय किया जाता है।

आवश्यक ActionScript 3,0 http://www.amazon.com/Essential-ActionScript-3-0-Colin-Moock/dp/0596526946

ActionScript 3.0 डिजाइन पैटर्न। http://www.amazon.com/ActionScript-3-0-Design-Patterns-Programming/dp/0596528469

आपकी ओओपी पृष्ठभूमि के साथ ये सही हैं।

यदि आपका एक बड़ी फ़ाइल स्पष्ट करने के लिए लगता है कि हो रही बातें वर्गों में टूट से शुरू होने वाली है।

आप मज़बूती से AS3 में OOP कोड करने के लिए सक्षम किया जा रहा बिना MVC या किसी अन्य डिजाइन पैटर्न के साथ अपना समय बर्बाद कर दिया जाएगा।

1

बाहर चेक Robot Legs - यह तुलना में मैं सामान्य रूप से एक महान MVC रूपरेखा है कि वास्तव में मदद की मुझे क्लीनर बारे कोड है (और कम!)।

मैं भी तीन कारणों से रॉबर्ट पेनर के Signals पुस्तकालय सुझाव है: 1) यह आप नहीं रह गया है कम कोड 2) वर्गों लिखने) EventDispatcher 3 बढ़ाने की जरूरत मैं freakin इसे प्यार देता है!

मैं एक MVC ढांचे पर्याप्त का उपयोग कर नहीं बता सकता कि - फ़ाइल/फ़ोल्डर संरचना यह आपके कोड को व्यवस्थित करने के प्रदान करता है अकेले इसके लायक है।

+1

कक्षाओं को घटनाओं को प्रेषित करने के लिए ईवेंट डिस्पैचर का विस्तार करने की आवश्यकता नहीं है। आप IEventDispatcher को लागू करने वाले वर्ग के द्वारा संरचना से एक ही परिणाम प्राप्त कर सकते हैं और इसके इवेंट डिस्पैचर ऑब्जेक्ट को इसके सदस्य चर के रूप में एक के रूप में प्राप्त कर सकते हैं, जिससे यह ईवेंट को रूट करता है। लक्ष्यीकरण को सही तरीके से काम करने के लिए, जब आप सदस्य इवेंट डिस्पैचर को तत्काल प्रारंभ करते हैं तो आप कन्स्ट्रक्टर के नए इवेंट डिस्पैचर (यह) में पैरामीटर के रूप में "यह" पास करते हैं; – scriptocalypse

+0

@scriptocalypse यह एक दिलचस्प रणनीति है, लेकिन सिंगल्स अभी भी मेरी पसंदीदा विधि है :) –

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