Aggiungi il metodo alla classe esistente che non possiedi in javascript

-2

Si chiama ancora patch di scimmia se si aggiungono solo nuovi metodi invece di modificare il comportamento del metodo esistente? Come si chiama?

Esempio:

String.prototype.contains = function(needle) { return false; }

Potrebbe non essere il miglior esempio, ma mostra come puoi ottenere questo.

Quali sono alcuni trabocchetti di questa tecnica e quali sono alcuni tentativi di aggirarli?

    
posta still_dreaming_1 09.08.2016 - 17:59
fonte

1 risposta

0

Si chiama ancora patch per scimmia. Qualsiasi modifica della classe stessa che accade lontano dalla sua dichiarazione ufficiale è la patch della scimmia.

L'IMO di patch delle scimmie presenta due problemi principali:

  1. La definizione del metodo diventa più difficile da cercare. Quando si vuole guardare la definizione di un metodo, di solito vanno alla definizione della classe. Quando il metodo è rattoppato, il codice e i commenti del metodo non saranno lì - o peggio ancora, se il metodo è sostituito, il metodo originale sarà lì, senza alcuna indicazione che sia stato sostituito con qualcos'altro.

  2. Ora dipende dal caricamento nascosto del modulo. Sì, dipendevi sempre dal caricamento del modulo, ma ora la dipendenza diventa più implicita.

    Di solito sai che se stai creando un nuovo Foo devi prima caricare foo.js (o qualunque modulo Foo sia definito in). Oppure, se hai ricevuto un Foo da qualche altra parte, sai che foo.js è stato caricato lì. Anche se in qualche modo hai creato un Foo senza caricare foo.js perché qualcun altro lo ha caricato per te e qualcun altro ha rimosso il comando che carica foo.js , quando il tuo codice si rompe di solito è facile risolverlo - ottieni un errore che Foo è un identificatore sconosciuto, quindi guardi dove è definito e caricalo.

    Le patch delle scimmie non sono così facili. unrelated.js può aggiungere Foo.bar , e potresti usarlo senza caricare unrelated.js te stesso. Poi qualcuno rimuove la sua dipendenza su unrelated.js , o forse hai creato un nuovo script e hai appena caricato foo.js , e improvvisamente i tuoi oggetti Foo non hanno più bar . Stai per sbattere la testa contro il muro più volte prima che ti rendi conto che devi caricare unrelated.js .

La mia soluzione? Se è necessario utilizzare la patch di scimmia, provare a limitarla al codice dell'infrastruttura e dell'infrastruttura e non utilizzarla nella libreria o nel codice dell'applicazione. Ciò riduce notevolmente i rischi, perché:

  • Quadro e infrastrutture sono già autorizzati a ridefinire le regole della lingua. Ruby on Rails è un esempio degno di nota: sei già profondamente consapevole del fatto che non stai più programmando Ruby - stai programmando RoR - quindi le classi con patch della scimmia sono solo un'altra modifica di cui devi essere a conoscenza.

  • I quadri e le infrastrutture di solito gestiscono il proprio caricamento del modulo per garantire che funzionino correttamente, in modo che possano garantire il caricamento di tutto il codice di patch delle scimmie.

  • I quadri e le infrastrutture hanno le loro convenzioni e, se sei a conoscenza di questi, puoi trovare facilmente le definizioni dei metodi con patch scimmia.

P.S .: Alcuni linguaggi statici compilati hanno alcune funzionalità che assomigliano alle patch delle scimmie, come i metodi di estensione in C # o la separazione di struct /% co_de di Rust. Queste strutture non hanno queste insidie, perché i metodi che definisci non diventano parte della classe. Stanno usando solo lo spazio dei nomi della classe e appartengono ancora al modulo / ambito in cui sono definiti.

    
risposta data 09.08.2016 - 18:43
fonte

Leggi altre domande sui tag