2009-11-12 17 views
9

Me gusta escribir mi código delgado y sexy (en el lado del rendimiento y la memoria), estoy usando Mootools y me preguntaba si lo estaba usando de la manera correcta, también puedes ayudarme diciéndome cómo probar mi código para encontrar las respuestas que estoy buscando.Mootools "Extiende" más "Implementos"

//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 */} 
}) 

¿Cómo puedo saber si cada vez se extiende de segunda clase es imposible hacer una nueva copia de las clases implementadas? La razón por la que estoy haciendo lo que estoy haciendo arriba es extender SecondClass para cada clase que lo necesite, de manera estática, mientras que la segunda clase no puede extender más de una clase, así que estoy usando Implements.

Respuesta

0

Los extensores e implementos están muy bien probados por los propios desarrolladores de Mootools. De hecho, el conjunto de pruebas completo que utilizan está disponible en anutron/mootools-unittester. No es necesario que esté probando la funcionalidad principal del marco, está hecho para usted (y también lo hace muy bien).

me gustaría sugerir que tenga una buena lectura para arriba en qué medida e implementar hacer en la MooTools documentos, página web Clientcide, mootorial, etc.

¿Cuántos objetos está creando por el camino? Si no es un número enorme, la memoria, etc., no debería ser un problema importante, incluso si creara los objetos de una manera pesada en memoria. ¿Podría ser una optimización prematura?

+0

No estoy tratando de probar la funcionabilidad, estoy tratando de entender qué es exactamente lo que estoy haciendo .. Para mí utilizando un marco es grande, pero todavía quiero saber cuáles son las implicaciones de mi trabajo. (por cierto, no estoy cuestionando la implementación, solo intento comprenderla) No hay documentación o ejemplos que expliquen cómo usar este tipo de interferencia con la biblioteca de MooTools de la mejor manera. Si hubiera entendido qué estaba pasando exactamente (mirando firebug o no) me gustaría mucho no tratar de optimizar prematuramente la memoria. También esto podría causar errores más tarde. –

11

La principal diferencia entre Extends e Implements es que Implement cambia el prototipo de la clase, mientras que Extend crea una copia. Esto significa que si implementa un cambio en una clase, todas las instancias de esa clase heredarán ese cambio instantáneamente, mientras que si usa Extend, todas las instancias existentes seguirán siendo las mismas.

esta es una cita del mootorial, compruébalo. http://mootorial.com/wiki/mootorial/02-class/#implement-vs.-extend

como para la prueba - Me gustaría mucho recomendar a construir algunos casos de la muestra con las clases de ninja y ponerlos a http://www.jsfiddle.net - a continuación, pedir un poco de asesoramiento analítico o la lista de mootools electrónico en Google o en el IRC (irc.freenode .net # mootools), SO no parece obtener muchos éxitos del equipo central de mootools. Idealmente, usted quiere hablar con alguien como Aaron Newton, Arian, cpojer o rpflo :)


actualización: incluso blog acerca de esto, pero yo estaba equivocado. Simplemente hay una diferencia en el orden en que se introducen los mutadores como Extends y Implements. Puede implementar y extender, pero primero debe declarar Extiende para que funcione.

leer más aquí: http://fragged.org/mootools-pattern-fun-class-implements-extends-at-the-same-time_1359.html


actualización Resulta que hay algunos casos en que esto sea útil. Aquí está el problema:

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. 

... simplemente no funciona. Necesita la clase humana para implementar ninja en su lugar y la clase badass para simplemente extender humana. Aparte del efecto secundario de que los humanos obtengan un nuevo método de matar (del cual pueden o no pueden saber), significará que los rudos podrán usarlo.matar así como invocar a su padre directo humano.

¿Por qué no reescribir las cosas como usted las quiere y sin complicaciones? Debido a que puede extender una clase nativa como Request.JSONP y luego decidir mezclar una nueva clase de almacenamiento en la extendida. La verdadera historia ... De cualquier manera, es posible que no tenga el lujo de refactorizar ciertas clases disponibles para usted.

Un patrón interesante para superar esto (considere la clase humana su request.jsonp, definida en otro lugar) - si solo desea agregar más métodos y propiedades a la clase que está extendiendo pero no planea reutilizar la clase 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! 

Posiblemente, sólo podía hacer human.implement({ method: function }); sino una clase puede ser mucho más.

Si usted quiere tener una referencia guardado en su clase Ninja para otros usos, lo anterior sería sería el mismo que esto (si va a volver a utilizar su 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! 

Espero que esto ayude a alguien . Aquí hay un ejemplo práctico en el que extiendo Request.JSONP con una clase de almacenamiento adicional como mixin: http://jsfiddle.net/dimitar/YacZe/

+1

En realidad, me uní al grupo google de mootools el otro día, pero por alguna razón no pensé en hacer estas preguntas allí. Eso es lo que haré ahora que :) ¡Gracias! –