web-dev-qa-db-fra.com

MonkeyPatching est-il considéré comme une bonne pratique de programmation?

J'ai été sous l'impression que - MonkeyPatching est plus dans la catégorie pirailleuse rapide et sale, plutôt que la bonne pratique de programmation. Pendant que j'avais l'air de temps en temps pour réparer des problèmes mineurs avec les bibliothèques tierces, je l'ai considéré comme temporaire et je soumettais un correctif approprié au projet tiers.

Cependant, j'ai vu cette technique utilisée comme "la voie normale" dans les projets traditionnels, par exemple à Gevent gevent.monkey module .

Le skeyPatching est-il devenu une pratique de programmation normale et acceptable?

Voir aussi: ( "MonkeyPatching for Humans" de Jeff Atwood

15
vartec

Non, mais parfois, monkeyyypatch est un moindre mal (que d'avoir un code brisé :)). Mes règles générales pour les monkeyptatches in Ruby sont:

  • avoir une très bonne raison du patch de singe (hotfix critique temporaire est une bonne raison. Belle formatage de la méthode de To_s n'est pas, à moins que vous ne travaillez sur ActiveSupport)

  • rendez-les aussi transparents que possible: mettez-les dans un endroit spécifique dans le codeBase et des fichiers séparés, écrivez la documentation décrivant la raison du sokéyporch (voici un exemple ).

  • facile à supprimer - La documentation doit inclure des informations sur le retrait et sur quoi surveiller. Beaucoup de monkeyPatches sont temporaires, ils doivent donc être faciles à enlever.

19
Lukas Stejskal

Oui, le monkeyPatching est très utile!

D'une manière ou d'une autre, les noms semblent être très influents sur la perception des gens. Appelez-le "MonkeyPatch" et ça sonne mal, appelez-le "Hot correction" ou "Fix sur la mouche" et ça sonne bien.

Indépendamment de cela, je pense que la capacité de modifier les méthodes/attributs/fonctions à l'exécution est une chose très utile. Même les gens javascript l'utilisent toute la journée sans peut-être le savoir.

Par exemple:

button.onclick = function(e) { ...}

Cette ligne simple illustre le fait que vous modifiez le comportement du bouton. Il a été conçu de cette façon. De même, vous pourriez modifier toutes les autres fonctions, mais il serait idiot de le faire.

Maintenant, pour la question de livrer des correctifs de cette façon ... eh bien ... pourquoi pas. Il vous suffit de télécharger un petit patch au lieu d'une grande libération. Heck, vous pouvez même corriger un serveur sans l'arrêter, génial! Et puis, un jour, vous pouvez également rechercher la dernière version d'une plus grande mise à jour. Assez juste. Alors oui, je vote pour "Patchs d'exécution" comme une bonne chose.

Fait intéressant assez, certaines langues comme Erlang se développaient même autour de ce concept. La capacité de mettre à jour un serveur à la volée.

Bien sûr, à la fin, et comme avec tout le reste, c'est la question de la façon dont vous l'utilisez. Vous pouvez faire de merveilleux OO Stuff and Shitty One, c'est pareil.

ÉDITER:

Permettez-moi d'ajouter une certaine distinction de cas, que vous corrigiez votre propre bibliothèque ou un tiers un.

... Fondamentalement, ce que vous faites avec un tel patch corrige un bogue de votre propre ou un . Bibliothèque. Dans les deux cas, c'est utile. Pour votre choix, cela vous permet de livrer un correctif à la volée. Pour un tiers, vous attendez (plusieurs mois?) Jusqu'à ce qu'ils le réparent seuls, ou vous le faites maintenant par vous-même. (Vous pouvez toujours les soumettre le patch, de sorte qu'ils le fixeront de leur côté). Lorsqu'ils libèrent leur prochaine version LIB avec le problème corrigé, vous pouvez toujours, si vous voulez Mettez à jour la bibliothèque et retirez le patch de votre côté.

Maintenant, bien sûr, si vous utilisez un patch pour modifier le comportement d'une lib et aliéner son objectif/une méthode de travail, alors c'est une recette de désastre. Même un singe verrait ça ... Eh bien, j'espère. ;)

11
dagnelies

Je crois que toutes les patchs sont intrinsèquement risquées en raison de leur nature d'exécution et de leur incapacité à prendre le temps de conception.

Ils accueillent des exceptions d'exécution et nécessitent des débuggeurs et des montres complexes juste à suivre.

Ils sont utilisés lorsque les gens scellent des cours, et donc l'héritage est impossible. Cependant, il existe de meilleurs moyens d'étendre des objets sans les endommager.

Mes deux centimes

8
Mickey Perlstein

Patching en général devrait être un dernier recours, le singe éteignant encore plus. La question est principalement celle de la maintenabilité.

Il y a longtemps, mon noyau Linux avait 3 correctifs distincts, nécessaires pour mon pilote de carte vidéo et deux applications propriétaires que j'avais. Deux d'entre eux avaient des changements contradictoires, ce qui signifiait que j'avais besoin d'un 4ème patch pour résoudre les différences entre eux. Maintenant, chaque fois qu'un problème de sécurité était fixé dans le noyau en amont, je devais attendre que les fournisseurs de ces 3 correctifs libèrent une mise à jour de la nouvelle version du noyau, qui a pris de un à six mois, soit je devais maintenir manuellement l'amont. patchs de sécurité jusqu'à ce que les autres vendeurs de correctifs ont rattrapé.

Après quelques années, les vendeurs ont réussi à être inclus dans la source du noyau en amont et j'ai pu arrêter la loi d'équilibre, mais vous pouvez voir quel gâchis c'était dans la moyenne. N'infligeez pas cela sur vos programmeurs à moins que vous ne l'iez.

4
Karl Bielefeldt

Non, ce n'est pas une technique standard pour le développement de logiciels. Il reste une solution de contournement pour résoudre un problème aigu et dispose d'inconvénients clairs. Violation du principe de substitution de Liskov vient à l'esprit. Le patch de singe rend cela sérieusement plus difficile de raisonner sur les programmes. Pour vos propres programmes, vous devriez placer le code où il appartient. Pour les tiers libs, vous vivrez toujours dans le danger que votre patch ne fonctionnera pas avec la prochaine version de la lib.

Bien sûr, la correction de singe est utile si vous savez ce que vous faites et que vous n'avez pas le temps de mettre en œuvre une solution [~ # ~ # ~] . Mais vous devriez Jamais Considérez cette technique standard et construire une patch de singe sur le patch de singe.

BTW, avez-vous déjà écrit un test unitaire pour un patch de singe?

3
scarfridge