Qu'est-ce que Monkey Patching' Signifie exactement en Ruby?
Selon Wikipedia, un monkey patch est:
un moyen de prolonger ou de modifier le moteur d'exécution
code de dynamique des langues [...]
sans modifier la source d'origine
code.
La déclaration suivante à partir de la même entrée qui me confond:
En Ruby, le terme singe patch a été
mal compris toute dynamique
la modification d'une classe et est souvent
utilisé comme synonyme de façon dynamique
la modification d'une classe à l'exécution.
Je voudrais savoir le sens exact de monkey patching en Ruby. Est-il en train de faire quelque chose comme ce qui suit, ou est-ce autre chose?
class String
def foo
"foo"
end
end
Vous devez vous connecter pour publier un commentaire.
La réponse courte est qu'il n'est pas "exactement" le sens, parce que c'est un roman terme, et différents des gens l'utiliser différemment. Que beaucoup, au moins, peuvent être appréhendées à partir de l'article de Wikipédia. Il y en a qui insistent qu'il ne s'applique qu'à "l'exécution" du code (intégrés dans les classes, je suppose) alors que certains l'utilisent pour désigner le moment de l'exécution de la modification de n'importe quelle classe.
Personnellement, je préfère la définition plus inclusive. Après tout, si nous étions à utiliser le terme de modification de classes intégrées que nous nous référons à l'exécution de la modification de toutes les autres classes? L'important pour moi est qu'il y a une différence entre le code source et le fonctionnement réel de la classe.
La déclaration ci-dessus affirme que le Rubis d'utilisation est incorrecte, mais les conditions d'évoluer, et ce n'est pas toujours une mauvaise chose.
La meilleure explication que j'ai entendu pour Monkey patching/Canard-poinçonnage est par Patrick Ewing en RailsConf 2007
Monkey patching est quand vous remplacer les méthodes d'une classe à l'exécution (pas ajouter de nouvelles méthodes comme d'autres l'ont décrit).
En plus d'être un très évidente et difficile à déboguer façon à modifier le code, il n'a pas d'échelle; comme de plus en plus de modules de démarrage monkey patching méthodes, la probabilité de changements en piétinant les uns les autres à grandir.
Vous avez raison; c'est lorsque vous modifier ou d'étendre une classe existante plutôt que d'en hérite.
C'est monkey patching:
Maintenant, j'imagine que cela peut parfois être utile, mais imaginez si vous l'avez vu routine.
Et des pauses parfois lorsqu'elle est appelée. Pour ceux qui paient l'attention que vous savez déjà pourquoi, mais imaginez que vous ne saviez pas sur le type float avoir un
.times
classe-méthode et vous automatiquement supposer quemy_special_number
est un entier. Chaque fois que le paramètre est un nombre entier, entier ou flottant, elle fonctionne très bien (tout entiers sont passés, sauf quand il y a une virgule flottante reste). Mais passer un certain nombre avec quoi que ce soit dans les décimales de la zone et il va casser, c'est sûr!Imaginez combien de fois ce qui pourrait arriver avec vos gemmes, des Rails de plugins, et même par votre propre co-travailleurs dans vos projets. Si il y a une ou deux petites méthodes là-bas comme cela et il pourrait prendre un certain temps pour trouver et corriger.
Si vous vous demandez pourquoi il se casse, notez que
sum
est un entier et un virgule flottante reste pourrait être transmis; en outre, l'exponentielle signe ne fonctionne que si les types sont les mêmes. Donc, vous pourriez penser qu'il est fixe, parce que vous avez converti la peine numéros de flotte ... seulement pour trouver que la somme ne peut pas prendre le résultat à virgule flottante.En Python monkeypatching est appelé à beaucoup comme un signe de l'embarras: "j'ai dû monkeypatch cette classe parce que..." (que j'ai rencontré en premier lorsque vous traitez avec Zope, qui le mentionne l'article). Il est utilisé pour dire qu'il était nécessaire de tenir une en amont de la classe et le fixer à l'exécution au lieu de lobbying pour avoir le les comportements indésirables fixe dans la classe réelle ou de les fixer dans une sous-classe. Dans mon expérience, Ruby gens ne parlent pas de monkeypatching que beaucoup, parce qu'il n'est pas considéré comme particulièrement mauvais ou de même intéressant de noter (et donc, "le canard de boxe"). Évidemment, vous devez être prudent sur la modification des valeurs de retour d'une méthode qui sera utilisée dans d'autres dépendances, mais d'ajouter des méthodes à une classe de la façon que active_support et facettes n'est parfaitement sûr.
Mise à jour de 10 ans plus tard: je voudrais modifier la dernière phrase pour dire "est relativement sûr". L'extension d'une bibliothèque de base de la classe avec de nouvelles méthodes peut entraîner des problèmes si quelqu'un d'autre obtient la même idée et ajoute la même méthode avec une autre mise en œuvre ou de la signature de la méthode, ou si les gens confondent étendue des méthodes pour le langage de base de la fonctionnalité. Deux cas se produisent souvent en Ruby (en particulier concernant active_support méthodes).
Généralement qu'elle est destinée à propos des modifications ponctuelles, à l'aide de Ruby, l'ouverture des classes, souvent avec une faible qualité de code.
Bon suivi sur le sujet:
http://www.infoq.com/articles/ruby-open-classes-monkeypatching
Explication du concept, sans code:
Discussion du concept exact est waaaay trop académique et nuancée que cela doit l'être. Nous allons garder les choses simples avec l'exemple suivant:
Le Fonctionnement Normal d'une Voiture
Comment avez-vous normalement démarrer une voiture? C'est simple: vous mettez le contact, la voiture démarre, et voila, vous êtes hors de la course!
Monkey Patching une Voiture
Mais si quelqu'un d'autre a pris la voiture et que si vous voulez changer la façon dont il fonctionne?
Vous n'avez pas besoin d'aller à la voiture, usine de fabrication pour faire ces changements: vous pouvez tout simplement “le singe-patch” il, en se plaçant sous le capot et surreptiously et sournoisement recâblage des choses et en ajoutant quelques incideniaries ici et là. Vous devez vraiment savoir ce que vous faites quand vous faites cela, sinon les résultats peuvent être assez explosif – et c'est peut-être exactement ce que vous voulez?
Boom!