Pregunta

De acuerdo a Wikipedia, una parche mono es:

  

una manera de ampliar o modificar el tiempo de ejecución   código de lenguajes dinámicos [...]   sin alterar la fuente original   código.

La siguiente declaración de la misma entrada me confundió:

  

En Ruby, el parche término mono era   mal entendida para significar cualquier dinámica   modificación de una clase y es a menudo   usado como sinónimo de dinámicamente   la modificación de cualquier clase en tiempo de ejecución.

Me gustaría saber el significado exacto de mono parches en Ruby. ¿Está haciendo algo como lo siguiente, o es algo más?

class String
  def foo
    "foo"
  end
end
¿Fue útil?

Solución

La respuesta corta es que no hay una "exacta", es decir, porque es una novela plazo, y diferentes personas lo utilizan de manera diferente. Que gran parte al menos se puede discernir del artículo de Wikipedia. Hay algunos que insisten en que sólo se aplica al código de "tiempo de ejecución" (clases incorporadas, supongo), mientras que algunos se utilizan para referirse a la modificación de tiempo de ejecución de cualquier clase.

En lo personal, prefiero la definición más inclusiva. Después de todo, si tuviéramos que utilizar el término para la modificación de sólo clases incorporadas, ¿cómo nos referimos a la modificación de tiempo de ejecución de todas las otras clases? Lo importante para mí es que hay una diferencia entre el código fuente y la clase de funcionamiento real.

  

En Ruby, el parche término mono era   mal entendida para significar cualquier dinámica   modificación de una clase y es a menudo   usado como sinónimo de dinámicamente   la modificación de cualquier clase en tiempo de ejecución.

La declaración anterior afirma que el uso de Ruby es incorrecto - pero los términos evolucionar, y eso no es siempre una mala cosa

.

Otros consejos

La mejor explicación que escuché por Mono parches / Pato-perforación es por Patrick Ewing en RailsConf 2007

  

... si camina como un pato y habla como un pato, es un pato, ¿verdad? Entonces   si este pato no le está dando el ruido que desea, usted tiene que   acaba de perforar ese pato hasta que devuelva lo que espera.

parches mono es cuando reemplace métodos de una clase en tiempo de ejecución ( no la adición de nuevos métodos como han descrito otros).

Además de ser una forma muy poco evidente y difícil de depurar a cambiar el código, no escala; a medida que más y más módulos comienzan métodos de parches mono, la probabilidad de que los cambios pisando mutuamente a crecer.

Usted está correcto; que es cuando se modifica o ampliar una clase existente en vez de una subclase.

Este es el mono de parches:

class Float
  def self.times(&block)
    self.to_i.times { |i| yield(i) }
    remainder = self - self.to_i
    yield(remainder) if remainder > 0.0
  end
end

Ahora me imagino que esto podría ser útil a veces, pero imagino que si usted vio rutina.

def my_method(my_special_number)
  sum = 0
  my_special_number.times { |num| sum << some_val ** num }
  sum
end

Y sólo se rompe ocasionalmente cuando se llama. Para los que pagan la atención que ya sabe por qué, pero imagine que usted no sabía sobre el tipo de flotador que tiene una clase de método .times y que asumió automáticamente que my_special_number es un entero. Cada vez que el parámetro es un número entero, número entero o flotante, que funcionaría bien (enteros enteros se devuelven excepto cuando hay un resto de coma flotante). Pero pasar un número con cualquier cosa en la zona decimal en y va a romper con seguridad!

Imagínense la frecuencia con que esto podría ocurrir con sus gemas, Rieles plugins, e incluso por sus propios compañeros de trabajo en sus proyectos. Si hay uno o dos métodos poco de allí como este y que podría tomar algún tiempo para encontrar y corregir.


Si usted se pregunta por qué se rompe, tenga en cuenta que sum es un entero y un resto de coma flotante podría pasar de nuevo; Además, la señal exponencial sólo funciona cuando los tipos son los mismos. Así que se podría pensar que es fija, ya que convirtió molesta a los números de los flotadores ... sólo para encontrar que la suma no puede tomar el resultado de coma flotante.

En Python monkeypatching se conoce mucho como un signo de vergüenza: "Tenía que monkeypatch esta clase porque ..." (me encontré por primera vez cuando se trata de Zope, que menciona el artículo). Se decía que era necesario apoderarse de una clase de aguas arriba y fijarlo en tiempo de ejecución en lugar de grupos de presión para que los comportamientos no deseados fijos en la clase real o fijándolos en una subclase. En mi experiencia la gente de Ruby no hablan de monkeypatching tanto, porque no se considera especialmente malo o incluso digno de mención (de ahí "perforación de pato"). Obviamente hay que tener cuidado con el cambio de los valores de retorno de un método que se utilizará en otras dependencias, pero la adición de métodos para una clase de la forma en que active_support y facetas hacen es perfectamente seguro.

Actualización de 10 años más tarde : Me gustaría modificar la última frase para decir "es relativamente seguro". La extensión de una clase de biblioteca central con nuevos métodos puede dar lugar a problemas si alguien más tiene la misma idea y añade el mismo método con una aplicación diferente o método de firma, o si la gente confunda métodos extendidos para la funcionalidad de núcleo del lenguaje. Ambos casos ocurren a menudo en Ruby (especialmente con respecto a los métodos active_support).

Por lo general, se entiende acerca de los cambios ad-hoc, usando clases abiertas de Ruby, con frecuencia con el código de baja calidad.

Buena seguimiento sobre el tema:

http://www.infoq.com/articles/ruby-open -Clases-monkeypatching

Explicación del concepto sin código:

discusión del concepto exacto es muuuuy académica y matizada de lo que debe ser. Vamos a mantenerlo simple con el siguiente ejemplo:

El funcionamiento normal de un carro

¿Cómo se suele iniciar un coche? Es muy sencillo: que apague el motor, el coche empieza, y listo usted está apagado a las razas

Mono parches a Car

Pero lo que si alguien más ha hecho el coche y lo que si desea cambiar la forma en que opera?

No es necesario ir a la fábrica de fabricación de automóviles para hacer esos cambios: puede simplemente “mono-parche” que, por conseguir bajo el capó y subrepticiamente y escondidas volver a cablear las cosas y añadiendo unas incideniaries aquí y allá. Hay que saber realmente lo que está haciendo cuando se hace esto de lo contrario los resultados pueden ser bastante explosivo - y tal vez eso es exactamente lo que quiere?

  

Fabrizzio, ¿a dónde vas?

Boom!

 lunes, martes, miércoles-nes días, jueves, viernes, sábado al día la imagen es libre y de código abierto de unsplash - https://unsplash.com/photos/dyrehVIidQk

  

"Mantener el código fuente cercana, pero sus parches mono más cerca."

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