2013-04-01 10 views

risposta

17

Oltre a richiedere i metadati ^:dynamic, binding crea anche collegamenti visibili solo nel thread corrente, mentre i binding effettuati da with-redefs sono visibili in tutti i thread. Quindi, with-redefs è uno strumento molto smussato e ha il potenziale di influenzare altri codici in esecuzione nella stessa macchina virtuale. Non ho mai visto with-redefs usato al di fuori del codice di test, né dovrebbe essere (almeno secondo me).

vorrei riassumere la differenza tra i due, come in tal modo:

  • vincolante con ^: dinamica consente di introdurre un po 'di comportamento dinamico in modo controllato. È un buon modo per definire i punti di estensione in un'API che consente ai chiamanti di risalire la catena di chiamate a modificare il comportamento del codice senza dover passare esplicitamente i parametri attraverso lo stack di chiamate (alcuni dei quali potrebbero non essere nemmeno il loro codice).
  • con-redefs è un free-for-all. È utile nel test, ad es. per deridere interi sottosistemi quando la funzione sotto test ha molte dipendenze.

Dichiarazione di una var come ^:dynamic, insieme con la convenzione di usare cuffie antirumore per citarne Vars dinamici (ad esempio *my-dynamic-var*), ha il valore aggiunto che si tratta di un modo di auto-documentazione di pubblicità per i chiamanti che quella parte del codice può essere modificato dinamicamente.

In sintesi: preferiscono ^: dinamica e vincolante durante la scrittura di API e il codice di produzione. Utilizzare con-redefs in fase di test e come ultima risorsa per modificare dinamicamente il comportamento di vars al di fuori del proprio controllo che non è stato dichiarato ^:dynamic (e quindi, utilizzare con cautela).

+0

Buona risposta. Ho visto quella convenzione di denominazione dei paraorecchie e non ho capito cosa significasse. Dovrei usare questa convenzione di denominazione anche su funzioni dinamiche o semplicemente su valori primitivi? –

+0

Non ho mai visto i paraorecchie su un 'defn' per una funzione in un'API pubblica. Per una funzione vincolata dinamicamente, farei qualcosa in questo modo: https://gist.github.com/alexhall/5286484 – Alex

+0

Questo ha senso. Anche se guardo attraverso il progetto clj-http, non lo fa. Mette la dinamica sul defn. –

Problemi correlati