2012-06-14 5 views
8

Perché le librerie di clojure riutilizzano nomi di funzioni comuni che ti obbligano allo spazio dei nomi qualificandoli? Ad esempio clojure.zip usa next, replace e remove che già esistono nel core clojure e "replace" esiste già in clojure.string.perché le librerie di clojure non tentano di utilizzare nomi univoci per nomi di funzioni comuni

Ora lo sviluppatore probabilmente userà qualche abbreviazione per lo spazio dei nomi clojure.zip così in un codice sviluppatore il clojure.zip/next sarà namespace qualificato come z/next nel codice di un'altra persona come w/next, etc Questo ti costringerà a guardare indietro per vedere ciò che l'abbreviazione dello spazio dei nomi è in realtà perché lo sviluppatore avrebbe potuto creare la sua libreria che utilizza anche la funzione "successiva"

Perché non zip-next, zip-replace, e zip-rimuovi, str-replace? O qualcosa di simile

Quindi ci sarà una "qualifica di spazio dei nomi" coerente nel codice delle persone e sarà chiaro a cosa si riferiscono queste funzioni.

Non è che ci siano centinaia di scontri tra le varie librerie. Di solito ne vedo solo due o tre. È così difficile rendere esplicitamente questi nomi unici nella libreria?

risposta

20

In generale utilizzando use per includere librerie è meno popolare rispetto all'utilizzo require nella normale ricerca di codice clojure, in modo da utilizzare più nomi univoci che è meno utile quando lo spazio dei nomi trasmette già lo stesso significato programmatori in modo Clojure tendono a preferire brevità all'unicità.

invece di:

(use 'liba 'libb) 

(liba-foo 1 2 3) 
(libb-foo 1 2 2) 

gente potrebbe quindi scrivere:

(require ['liba :as 'a] [libb :as 'b]) 

(a/liba-foo 1 2 3) 
(b/libb-foo 1 2 3) 

che rende il liba- sembrare sciocco, da qui:

(a/foo 1 2 3) 
(b/foo 1 2 3) 
+1

Mi piace il fatto che è possibile utilizzare un alias più breve per uno spazio dei nomi. Ti dà molta più energia, che è un tema comune in Clojure. Sebbene possa essere un problema se alcuni programmatori utilizzano alias inappropriati o alias anche più lunghi dello spazio dei nomi originale. – adamjmarkham

+1

Non capisco davvero il tuo commento CL; ci sono molti nomi molto brevi in ​​CL e quelli lunghi non sembrano avere a che fare con il namespacing. –

+0

Devo ammettere che il commento proviene dalla mia frustrazione personale con un paio di librerie. Scusate CL gente, giocherò bene :-( –

9

Se avete intenzione di richiedere che i nomi siano globalmente unici, perché avere spazi dei nomi? Se definisco la libreria di gelato e prefisso ogni nome di funzione con gelato, nessuno può mai entrare in conflitto.

Ma questo è terribilmente scomodo per entrambe le parti: dobbiamo continuare a digitare questo stupido prefisso più e più volte. Se invece di icecream-scoop, ho appena chiamato la mia funzione scoop all'interno del gelato del namespace, hai una scelta su come fare riferimento ad esso: puoi chiamarlo scoop se è chiaro dal contesto e non si scontra con il tuo namespace, o gelato/scoop, o dessert/scoop, qualsiasi cosa tu abbia bisogno per farlo leggere bene.

+0

Questi nomi di funzioni come Sostituisci, Rimuovi, Inverso sono così comuni che non è possibile dire cosa significano se non sono qualificati per lo spazio dei nomi. Quindi DEVI nominare lo spazio qualificarli. Non puoi semplicemente usare "sostituisci" nel tuo codice, ora capirai cosa significa, ma gli altri non lo faranno e dovranno fermarsi per capire a quale spazio dei nomi appartiene. Ma ora le persone hanno la possibilità di scegliere lo spazio dei nomi per qualificarle con qualsiasi abrev, in modo che diventi confuso. Se sono nomi di spazio qualificati come (ad esempio) str-replace, allora sarebbe chiaro nel codice di tutti. –

+0

E non sto dicendo di aggiungere un prefisso a TUTTE le funzioni di una libreria. Solo per quelle funzioni che hanno nomi comuni che potrebbero scontrarsi con funzioni in altri spazi dei nomi. Questi sono così comuni che sono garantiti in conflitto –

+0

Quindi la mia libreria 'icecream' ha funzioni scoop, gusto, sapore e rimozione del gelato? È terribile per coerenza: l'utente deve ricordare quali funzioni hanno un prefisso nel nome e quali no. Non voglio chiamare 'join' e' str-replace'; 'str/join' e' str/replace' sono più facili da scrivere e più facili da leggere. – amalloy