Question

Question de base CS ici: des modèles de conception énumérés dans Gamma, etc, qui (le cas échéant) couvrent monkeypatching? De plus, pour quelle classe de problèmes est monkeypatching appropriée par rapport subclassing? bogues rapiéçage dans les classes de bibliothèque de base est un, y at-il d'autres? J'entends beaucoup de Drang Sturm und à propos monkeypatching sur stackoverflow, la plupart d'entre vous semblent avoir de fortes inquiétudes à ce sujet, mais en tant que programmeur je aime vraiment la capacité d'encapsuler les bits génériques de fonctionnalité et de les inclure dans mes modèles d'objets dans les rails.

Prenez-thoughtbot paperclip, par exemple, pourquoi voudrais-je jamais vouloir sous-classe vs l'approche qui existe aujourd'hui monkey-patch?

Merci, -Eric

Était-ce utile?

La solution

Je ne pense pas monkeypatching est un modèle de conception -. Extension de classe de base d'une caractéristique de langue qu'ils semblent ignorer

En ce qui concerne le reste, jetez un oeil à l'opinion de Jeff Atwood sur cet article sur son blog .

Dans son (et mon) oppinion le plus gros problème avec monkeypatching est qu'il peut faire le débogage très difficile, si elle modifie les méthodes existantes - « ici et là de petits extraits » nous, les humains ne peut pas garder une trace de tous les ainsi que machines font. Affermira séparations claires Sous-classes.

Alors mes règles personnelles pour monkeypatching sont:

  • Si vous pouvez le faire sans monkeypatching et cela fonctionnera bien, ne pas utiliser monkeypatching.
  • Vous pouvez ajouter de nouvelles méthodes pour les classes, mais vous ne pouvez pas modifier ceux qui existent déjà.
  • Est-ce que d'une manière très visible et évidente -. À savoir un fichier appelé string_extensions.rb dans votre / lib, pas sur un /myvendor/submodule/se.rb caché
  • doit être locale; les classes qui n'utilisent pas une bibliothèque devraient pas être affectés.

Maintenant, à votre exemple. Paperclip

  • A ma connaissance, il ajoute des méthodes à vos classes ActiveRecord, mais ne modifie pas les existants
  • Vous devez ajouter une directive has_attachment aux classes qui utilisent paperclip, sinon ils ne sont pas affectés.

Ainsi, les changements sont localisés et évidente (je pense en fait qu'il parvient à améliorer mise au point: il est plus facile pour nous les humains à lire has_attachment au lieu de class MyModel < Paperclip::ActiveRecordWithAttachment).

Subclassing est aussi une mauvaise idée sur ce cas parce que vous ne seriez pas en mesure d'utiliser en plus paperclip un autre plug-in que les sous-classes - utilisé. Rails est unique héritée

Et dans le cas de Paperclip, il est clairement une relation de has_a avec son attachement, pas is_a un. On pourrait dire que ce ne serait pas une bonne utilisation du sous-classement.

Enfin, je voudrais souligner que Paperclip exige subclassing dans certaines occasions (vous devez utiliser subclassing afin de créer un processeur paperclip).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top