¿Cuándo debería preferir patrones de herencia sobre mixins en lenguajes dinámicos?
Por mixins, me refiero a una verdadera mezcla, como al insertar funciones y miembros de datos en un objeto en tiempo de ejecución.
¿Cuándo usaría, por ejemplo, la herencia de prototipos en lugar de mixins? Para ilustrar más claramente lo que quiero decir con mixin, algunos pseudocódigo:
asCircle(obj) {
obj.radius = 0
obj.area = function() {
return this.radius * this.radius * 3.14
}
myObject = {}
asCircle(myObject)
myObject.area() // -> 0
javascript
inheritance
mixins
Magnus Wolffelt
fuente
fuente
Respuestas:
La herencia prototípica es simple. Tiene una sola ventaja sobre los mixins.
Es que es un enlace en vivo. si cambia el prototipo, todo lo que hereda se cambia.
Ejemplo usando pd
Básicamente, si desea que los cambios en el círculo de "interfaz" se reflejen en tiempo de ejecución a todos los objetos que "usan" su funcionalidad, entonces herede de ella.
Si no desea que se reflejen los cambios, mézclelos.
Tenga en cuenta que los mixins también tienen más propósito que eso. Las mixinas son su mecanismo para la "herencia" múltiple.
Si desea que un objeto implemente múltiples "interfaces", entonces tendrá que mezclar algunas. La que use para la herencia prototípica es la que desea que reflejen los cambios en el tiempo de ejecución, las otras se mezclarán.
fuente
Mi sentido del caballo me dice esto:
Notas Relacionadas:
fuente
Use la prueba "Is-a".
La herencia se limita al caso cuando puede decir "Subclase ES UNA Superclase". Son el mismo tipo de cosas. "El queso es un producto lácteo".
Los mixins son para todo lo demás. "El queso se puede usar en un sándwich". El queso no es un sándwich, pero participa en el emparedado.
PD. Esto no tiene nada que ver con lenguajes dinámicos. Cualquier lenguaje de herencia múltiple con compilación estática (es decir, C ++) tiene el mismo punto de decisión.
fuente
Bueno, el mejor ejemplo que puedo darte es un Actor para un juego que tiene herencia para algunas cosas básicas pero usa mixins / plugins para la funcionalidad compartida. La funcionalidad compartida podría ser (directamente desde el código fuente):
fuente