2009-11-12 15 views
9

मुझे अपना कोड पतला और सेक्सी (प्रदर्शन और स्मृति पक्ष पर) लिखना पसंद है, मैं मूटूल का उपयोग कर रहा हूं और सोच रहा था कि क्या मैं इसे सही तरीके से उपयोग कर रहा हूं, आप भी मेरी मदद कर सकते हैं जवाब देकर मुझे अपने कोड की जांच कैसे करें, मैं अपने स्वयं की तलाश में हूं।Mootools "विस्तार" प्लस "कार्यान्वयन"

//First we create a class like so: 

var FirstClass = new Class {(
    'someFunc': function() { /* do stuff */ } 
}) 

//Now this class uses first class with "Implements" 

var SecondClass = new Class ({ 
    'Implements': [FirstClass, SomeOtherClass, SomeOtherOtherClass], 
    'iAlsoDoStuff': function() {/*do stuff */} 
}) 

// finally the class that Extends second class 
var ThirdClass = new Class ({ 
    'Extends': SecondClass, 
    'takeOverTheWorld': function() {/*code to win lottery */} 
}) 

मैं कैसे बता सकता हूं कि हर बार सेकेंडक्लास विस्तारित होने पर यह कार्यान्वित कक्षाओं की एक नई प्रति नहीं बनाता है? कारण मैं जो कर रहा हूं वह कर रहा हूं, जो कि हर वर्ग के लिए सेकेंड क्लास को विस्तारित करना है - इसे स्थिर रूप से करना, जबकि दूसरी कक्षा एक वर्ग को और अधिक नहीं बढ़ा सकती है, इस प्रकार मैं कार्यान्वयन का उपयोग कर रहा हूं।

उत्तर

0

विस्तार और कार्यान्वयन Mootools डेवलपर्स द्वारा स्वयं परीक्षण किया जाता है। असल में उनका पूरा परीक्षण सूट anutron/mootools-unittester पर उपलब्ध है। आपको ढांचे की मूल कार्यक्षमता का परीक्षण करने की आवश्यकता नहीं है, यह आपके लिए किया गया है (और बहुत अच्छी तरह से किया गया है)।

मैं, एक अच्छा क्या बढ़ाएँ पर पढ़ सकते हैं और mootools डॉक्स, clientcide वेबसाइट, mootorial पर कर लागू होने आदि

आप जिस तरह से कितने वस्तुओं का निर्माण कर रहे सुझाव देंगे? यदि यह एक बड़ी संख्या नहीं है तो मेमोरी इत्यादि एक बड़ी समस्या नहीं होनी चाहिए, भले ही यह स्मृति को मेमोरी में भारी तरीके से बना रहा हो। क्या यह समयपूर्व अनुकूलन हो सकता है?

+0

मैं functionallity परीक्षण करने के लिए कोशिश नहीं कर रहा हूँ, मैं का उपयोग कर एक रूपरेखा महान है समझने के लिए मैं वास्तव में क्या कर रहा हूँ कोशिश कर रहा हूँ .. मेरे लिए, लेकिन मैं अभी भी पता है कि मेरे काम के निहितार्थ हैं चाहता हूँ। (बीटीडब्ल्यू, मैं कार्यान्वयन पर सवाल नहीं उठा रहा हूं, बस इसे समझने की कोशिश कर रहा हूं) कोई दस्तावेज या उदाहरण नहीं है जो MooTools लाइब्रेरी के साथ इस तरह के अस्थिरता का उपयोग कैसे करें। अगर मुझे समझ में आया कि वास्तव में क्या हो रहा था (फ़ायरबग या अन्यथा देखकर) मैं समय से पहले स्मृति को अनुकूलित करने की कोशिश करने से बहुत खुश हूं। इसके अलावा यह मेरे लिए बाद में बग का कारण बन सकता है। –

11

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

यह म्यूटोरियल से उद्धरण है, इसे देखें। http://mootorial.com/wiki/mootorial/02-class/#implement-vs.-extend

परीक्षण के लिए के रूप में

- मैं करूंगा बहुत ज्यादा आप निंजा वर्गों के साथ कुछ नमूना मामलों का निर्माण और http://www.jsfiddle.net करने पर उन्हें डाल अनुशंसा करते हैं - फिर कुछ विश्लेषणात्मक सलाह या गूगल पर या आईआरसी पर mootools मेल सूची के लिए पूछना (irc.freenode .NET # mootools), इसलिए mootools कोर टीम से कई हिट नहीं लगती हैं। आदर्श रूप में, आप हारून न्यूटन, अरियन, cpojer या rpflo :) जैसे किसी व्यक्ति से बात करना चाहते


अद्यतन: मैं भी इस बारे में भी ब्लॉग लेकिन मैं गलत था। उस क्रम में बस एक अंतर है जिसमें Extends और Implements जैसे म्यूटेटर लाए जाते हैं। आप कार्यान्वित और विस्तार कर सकते हैं लेकिन आपको इसे काम करने के लिए पहले विस्तारित करने की आवश्यकता है।

यहां अधिक पढ़ें: http://fragged.org/mootools-pattern-fun-class-implements-extends-at-the-same-time_1359.html


अद्यतन बाहर कर देता है, कुछ मामलों में, जहां इस उपयोगी है देखते हैं। यहां समस्या है:

var ninja = new Class({ 
    kill: function() { 
     alert("kill!"); 
    } 
}); 

var human = new Class({ 
    initialize: function(){ 
     alert("i r human!"); 
    } 
}); 

var badass = new Class({ 
    Implements: [ninja], 
    Extends: human, 
    initialize: function() { 
     alert("i r badass and.. "); 
     this.parent(); 
     this.kill(); 
    } 
}); 

new badass(); // i r badass, i r human, this.kill is not a function exception. 

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

चीजों को फिर से लिखना क्यों नहीं चाहते हैं और जटिलताओं? क्योंकि आप Request.JSONP जैसे देशी वर्ग का विस्तार कर रहे हैं और फिर अपने विस्तारित एक में एक नई स्टोरेज क्लास को मिश्रित करने का निर्णय लेते हैं। सच्ची कहानी ... किसी भी तरह से, आपके पास उपलब्ध कुछ कक्षाओं को पुनः प्राप्त करने की लक्जरी नहीं हो सकती है।

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

human.implement(new new Class({ 
    kill: function() { 
     alert("kill!"); 
    } 
})); 

var badass = new Class({ 
    Extends: human, 
    initialize: function() { 
     alert("i r badass and.. "); 
     this.parent(); 
     this.kill(); 
    } 
}); 

new badass(); // // i r badass, i r human, kill! 

बेशक, आप बस human.implement({ method: function }); कर सकता है, लेकिन एक वर्ग इतना अधिक हो सकता है।

आप अन्य उपयोगों के लिए अपने निंजा वर्ग के लिए एक बचाया संदर्भ चाहते हैं, ऊपर होगा इस रूप में एक ही होगा (यदि आप अपने mixin का पुन: उपयोग करने की योजना है): इस किसी मदद करता है

var ninja new Class({ 
    kill: function() { 
     alert("kill!"); 
    } 
}); 

human.implement(new ninja); 
// this is what differs from say - instantiation + shared inherited properties. 
// also, a constructor will work. 
// the alternative would just do: 
// human.prototype.kill = function() { alert("kill"); } 

var badass = new Class({ 
    Extends: human, 
    initialize: function() { 
     alert("i r badass and.. "); 
     this.parent(); 
     this.kill(); 
    } 
}); 

new badass(); // // i r badass, i r human, kill! 

आशा । यहां एक व्यावहारिक उदाहरण दिया गया है जहां मैं एक अतिरिक्त स्टोरेज क्लास के साथ एक मिश्रण के रूप में Request.JSONP विस्तार कर रहा हूं: http://jsfiddle.net/dimitar/YacZe/

+1

मैं वास्तव में दूसरे दिन mootools Google समूह में शामिल हो गया लेकिन कुछ कारणों से इस प्रश्न पूछने के बारे में नहीं सोचा था। Thats मैं अब से क्या करूँगा :) धन्यवाद! –

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