Pregunta

Yo estaba leyendo en Ruby, y aprendió acerca de su mixins patrón, pero no podía pensar en muchas útil mixin funcionalidad (porque yo no estoy acostumbrado a pensar que la forma más probable).Así que me preguntaba qué sería de los buenos ejemplos de útiles Mixin funcionalidad?

Gracias

Editar:Un poco de historia.Vengo de C++, y otros Objetos de idiomas, pero mi duda aquí es que Ruby dice que no heredar los mixins, pero sigo viendo los mixins como la herencia Múltiple, así que me temo que estoy tratando de clasificarlas demasiado pronto en mi zona de confort, y no realmente asimilar lo mixin es.

¿Fue útil?

Solución

Bueno el ejemplo habitual Creo que es Persistencia

module Persistence
    def load sFileName
            puts "load code to read #{sFileName} contents into my_data"
    end
        def save sFileName
        puts "Uber code to persist #{@my_data} to #{sFileName}"
    end

end

class BrandNewClass
    include Persistence
    attr :my_data

        def data=(someData)
        @my_data = someData
    end
end

b = BrandNewClass.new
b.data = "My pwd"
b.save "MyFile.secret"
b.load "MyFile.secret"

Imagine que el módulo está escrito por un ninja de Ruby, que persiste el estado de su clase en un archivo.
Supongamos ahora que escribo una nueva clase de marca, puedo volver a utilizar la funcionalidad de persistencia mezclándolo en diciendo include ModuleILike. Incluso puede incluir módulos en tiempo de ejecución. Consigo cargar y guardar métodos de forma gratuita con sólo mezclarlo. Estos métodos son como los que escribió usted mismo para su clase. Código / Comportamiento / Funcionalidad-reutilizar sin herencia!

Así que lo que está haciendo es que incluye métodos para la tabla de métodos para la clase (no literalmente, pero correctas cerrar).

Otros consejos

Se utilizan generalmente para agregar algún tipo de funcionalidad estándar a una clase, sin tener que redefinir todo. Probablemente puede pensar en ellos un poco como interfaces en Java, pero en lugar de definir una lista de métodos que deben ponerse en práctica, muchos de ellos realmente va a sea en práctica mediante la inclusión del módulo.

Hay algunos ejemplos en la biblioteca estándar:

Singleton - Un módulo que puede ser mezclado en cualquier clase que lo convierten en un producto único. El método initialize se hace privada, y un método de instancia añadió, lo que asegura que hay solo una instancia de esa clase en su aplicación.

Comparable - Si se incluye este módulo en una clase, definiendo el método <=>, que compara la instancia actual con otro objeto y dice que es mayor, es suficiente para proporcionar <, <=, ==,> =, >, y entre? métodos.

Enumerable - Mezclando en este módulo, y que define un cada método, se obtiene el apoyo de todos los otros métodos relacionados, tales como cobro revertido, inyectar, seleccionar y rechazar. Si también se tiene el método <=>, entonces también apoyará especie, min y max.

DataMapper es también un ejemplo interesante de lo que puede hacerse con una simple declaración incluirá, teniendo una clase estándar, y la adición de la capacidad de persistir a un almacén de datos.

En ruby, la razón por la que los Mixins no son de varios de la herencia es que la combinación de mixin métodos es una cosa.Esto no sería un gran problema, excepto que Ruby módulos y las clases están abiertas a la modificación.Esto significa que si usted mixin un módulo a su clase, a continuación, agregue un método para el módulo, el método de no estar disponible para su clase;donde si usted lo hizo en el orden opuesto, lo haría.

Es como pedir un helado de cono.Si usted consigue las chispitas de chocolate y toffee de bits como su mixins, a pie y con su cono, ¿qué tipo de helado de cono que tiene no va a cambiar, si alguien agrega chispas multicolores para el chocolate con chispitas de reciclaje de vuelta en la tienda de helados.La clase, el cono de helado, no se modifica cuando el mixin módulo, el reciclaje de polvos es.La siguiente persona en el uso que mixin módulo veremos los cambios.

Cuando include un módulo en ruby, llama Module#append_features en dicho módulo, que agregar una copia de la del módulo de métodos para la includer una vez.

La herencia múltiple, como yo lo entiendo, es más parecido a la delegación.Si la clase no sabe cómo hacer algo, se le pide a sus padres.En un abrir-el ambiente de la clase, de la clase que los padres pueden haber sido modificados después de la clase fue creado.

Es como un RL relación padre-hijo.Su madre podría haber aprendido a hacer malabares después de que usted naciera, pero si alguien te pide hacer malabares y le preguntas a cualquiera:mostrar cómo (copia cuando la necesite) o hacerlo por usted (puro delegación), entonces ella va a ser capaz en ese punto, a pesar de que fueron creados antes de que su habilidad para hacer malabares fue.

Es posible que usted podría modificar un rubí módulo de "incluir" a actuar más como la herencia múltiple mediante la modificación de Module#append_features mantener una lista de includers y, a continuación, actualizar el uso de la method_added de devolución de llamada, pero esto sería un gran cambio de estándar de Ruby, y podría causar problemas importantes cuando se trabaja con otros código.Usted puede ser mejor crear un Module#inherit el método que se llama include y manejados delegación así.

Como un ejemplo del mundo real, Enumerable es impresionante.Si se define #each e incluyen Enumerable en su clase, que le da acceso a toda una serie de iteradores, sin necesidad de que el código de cada una de ellas.

Se utiliza ampliamente como uno podría usar herencia múltiple en C ++ o interfaces de aplicación en Java / C #. No estoy seguro de dónde se encuentra su experiencia, pero si se han hecho las cosas antes, mixins son la forma en que lo haría en Ruby. Es una forma sistematizada de la inyección de funcionalidad en clases.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top