La técnica de incluir módulos según sea necesario se relaciona con la definición de métodos en el tiempo de ejecución. Trabajo en una aplicación de Rails donde a veces tenemos que exportar datos en varios formatos. 99% de las veces, el objeto formulario no necesita métodos relacionados con la exportación, pero en nuestra tarea Rake exportadora, que hacer algo como:
Form.send(:include, FormExportingMethods)
lo tanto, sólo tiene esos métodos cuando las necesita.
Este tipo de dinamismo es una de las cosas que amo de Ruby. Mientras que en algunos idiomas, tienes que definir tus clases y objetos al principio, Ruby te permite decir "oh, necesito que mi cerdo tenga alas ahora mismo". Simplemente las adjuntaré ".
Observe en mi ejemplo que los objetos de formularios específicos no se están modificando; la clase de forma es. Esto funciona porque, cuando envía un mensaje a un objeto, busca en su cadena de búsqueda de métodos una respuesta en el momento en que pregunta. Entonces puede crear un objeto, luego agregar un método en cualquier lugar de su cadena de herencia, luego llamar al método en el objeto y lo tendrá. Obviamente, tener que revisar toda la cadena de herencia para cada método es costoso, pero es una compensación para este tipo de flexibilidad.
Me gusta tu ejemplo de #ataque. Gracias. –