سؤال

أحب أن أكتب رمزي ضئيلة ومثيرة (على جانب الأداء والذاكرة)، وأنا أستخدم 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 */}
})

كيف يمكنني معرفة ما إذا كان كل مرة يتم تمديدها، فإنه لا يجعل نسخة جديدة من الفئات المنفذة؟ السبب في أنني أفعل ما أقوم به أعلاه هو تمديد SecondClass لكل فصل يحتاجه - القيام بذلك بشكل ثابت، في حين أن الطبقة الثانية لا يمكن أن تمتد أكثر من فئة واحدة، وبالتالي أنا أستخدم الأدوات.

هل كانت مفيدة؟

المحلول 2

أخيرا حصلت على إجابتي على مجموعة Google Mootools، اعتقدت أنني سأقوم بتحديثه هنا في حال يجد أحدهم الفائدة به.

http://groups.google.com/group/mootools-users/browse_thread/Thread/5AEC78813FA51CC1.

استمتع! الرومانية

نصائح أخرى

الفرق الرئيسي بين Extends والتنفيذ هو أن تطبيقه يغير النموذج الأولي للفئة، في حين تمديد إنشاء نسخة. هذا يعني أنه إذا قمت بتطبيق تغيير في فئة، فسترث جميع مثيلات تلك الفئة هذا التغيير على الفور، في حين أن تستخدم تمديد، فستظل جميع الحالات الموجودة هي نفسها.

هذا اقتباس من Mootorial، تحقق من ذلك. http://mootorial.com/wiki/mootorior 02-class/#implement-vs.-extend.

بالنسبة إلى الاختبار - أود أن أوصي بك كثيرا ببناء بعض حالات العينات مع فصول النينجا ووضعها http://www.jsfiddle.net. - ثم أطلب بعض المشورة التحليلية أو قائمة بريد Mootools على Google أو IRC (IR.Freenode.net # Mootools)، لذلك لا يبدو أن العديد من الزيارات من فريق Mootools Core. من الناحية المثالية، تريد التحدث مع شخص ما مثل آرون نيوتن أو أريان أو CPOJER أو RPFLO :)


تحديث: لقد بلوجا حتى الآن لكنني كنت مخطئا. ببساطة هو الفرق في الترتيب الذي مثل Extends و Implements يتم إحضارها. يمكنك التنفيذ والتمديد ولكن عليك أن تعلن أن تعلن أولا عن العمل.

اقرأ المزيد هنا: http://fragged.org/mootools-pattern-fun-class-implements-extends-at-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.

... ببساطة لا يعمل. تحتاج إلى الفصل الانسان لتنفيذ النينجا بدلا من الفئة صلب، قوي ببساطة تمديد الانسان. وبعد بصرف النظر عن التأثير الجانبي للبشر يحصلون على طريقة قتل جديدة (التي قد لا يعرفونها أو قد لا يعرفونها)، فإنها ستتعني أن بدس ستكون قادرة على استخدام .kill بالإضافة إلى الدعوة على إنسان والده المباشر.

لماذا لا تعيد كتابة الأشياء بالطريقة التي تريدها و / س مضاعفات؟ نظرا لأنك قد تقوم بتوسيع الفئة الأصلية مثل طلب lease.jsonp ثم قرر خلط فئة تخزين جديدة في واحدة موسعة. قصة حقيقية ... في كلتا الحالتين، قد لا يكون لديك ترف إعادة صبط بعض الطبقات المتاحة لك.

نمط مثير للاهتمام للتغلب على هذا (فكر في الفئة البشرية طلبك .jsonp، المعرفة في مكان آخر) - إذا كنت ترغب فقط في إضافة المزيد من الطرق والخصائص إلى الفصل، فستتمدد ولكن لا تخطط لإعادة استخدام فئة MIXIN (NINJA):

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!

آمل أن يساعد هذا شخص ما. إليك مثال عملي حيث أقوم بتوسيع طلب الطلب مع فئة تخزين إضافية كخلاط: http://jsfiddle.net/dimitar/yacze/

تمتد وإجراءات يتم اختبارها جيدا من قبل مطوري Mootools أنفسهم. infact مجموعة الاختبار بأكملها يتوفر Anutron / Mootools-Unittester. وبعد لا تحتاج إلى اختبار الوظائف الأساسية للإطار، من أجلك (وفعلت جيدا جدا).

أقترح وجود قراءة جيدة حول ما تمتد وتنفيذ القيام به على مستندات Mootools و Website Colentcide و Mootorial، إلخ.

كم عدد الكائنات التي تخلقها بالمناسبة؟ إذا لم يكن هناك عدد كبير من العدد، فلا ينبغي أن تكون الذاكرة إلخ. مشكلة كبيرة حتى لو كانت تقوم بإنشاء الكائنات بطريقة ثقيلة للذاكرة. هل يمكن أن يكون هذا التحسين المبكر؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top