Domanda

Nucleo CS domanda qui: i design pattern elencati Gamma, ecc, che (se presente) coprono monkeypatching? Inoltre, per quale classe di problemi è monkeypatching appropriata vs sottoclassi? Patching bug in classi della libreria Core è uno, ce ne sono altri? Ho sentito un sacco di Sturm und Drang circa monkeypatching su StackOverflow, la maggior parte di voi sembrano avere dubbi forti su di esso, ma come programmatore mi piace molto la capacità di incapsulare bit generici di funzionalità e includerli nei miei modelli di oggetti di rotaie.

Prendere thoughtbot-graffetta, per esempio, perché dovrei mai voglia di sottoclasse che contro l'approccio monkeypatch che esiste oggi?

Grazie, -Eric

È stato utile?

Soluzione

Non credo monkeypatching è un modello di progettazione -. Nucleo classe di estensione una caratteristica del linguaggio che sembrano ignorare

Per quanto riguarda il resto, dare un'occhiata alla vista di Jeff Atwood su questo articolo sul suo blog .

Nella sua (e la mia) oppinion il problema più grande con monkeypatching è che può fare il debug molto difficile, se modifica metodi esistenti - noi umani non può tenere traccia di tutti i "piccoli frammenti qua e là", così come macchine fanno. Le sottoclassi stablish separazioni più chiare.

Quindi, le mie regole personali per monkeypatching sono:

  • Se si può fare senza monkeypatching e funzionerà bene, non utilizzare monkeypatching.
  • È possibile aggiungere nuovi metodi alle classi, ma non è possibile modificare quelli esistenti.
  • fanno in un modo molto visibile e ovvio -. Vale a dire una string_extensions.rb file chiamato nel vostro / lib, non su un /myvendor/submodule/se.rb nascosto
  • Dovrebbe essere locali; classi che non utilizzano una biblioteca non dovrebbe essere modificata.

Ora, per il tuo esempio:. Paperclip

  • A mia conoscenza, si aggiunge metodi alle classi ActiveRecord, ma non modifica quelli esistenti
  • È necessario aggiungere una direttiva has_attachment alle classi che utilizzano graffetta, altrimenti non sono interessati.

Quindi, i cambiamenti sono localizzati ed evidente (Io in realtà penso che riesce a migliorare di debug: è più facile per noi esseri umani a leggere has_attachment invece di class MyModel < Paperclip::ActiveRecordWithAttachment).

Subclassing è anche una cattiva idea su questo caso perché non sarebbe in grado di utilizzare graffetta in aggiunta a un altro plugin che ha utilizzato le sottoclassi -. Rotaie è single-ereditato

E nel caso di Paperclip, è chiaramente un rapporto has_a con il suo allegato, non un is_a uno. Si potrebbe sostenere che non sarebbe stato un uso corretto di subclassing.

Infine, vorrei far notare che Paperclip richiede la creazione di sottoclassi in alcune occasioni (è necessario utilizzare sottoclassi al fine di creare un processore graffetta).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top