Best practice / ragioni per le costanti String in JavaScript [chiuso]

5

In linguaggi statici come Java / C #, di solito uso le costanti per stringhe o numeri, piuttosto che inserirli nel codice da solo. Tuttavia, tendo ad evitare questa pratica in JavaScript. Più di recente, poiché alcuni altri programmatori intorno a me hanno adottato questo approccio in JS, ho deciso che probabilmente avrei dovuto consolidare il mio o il loro ragionamento.

Non esiste una sintassi di dichiarazione "const" effettiva in JavaScript. Di solito ci accontentiamo di una politica informale di non modificare le proprietà maiuscole. Ma la mia opinione è di solito di evitarli del tutto, perché la maggior parte dei loro benefici si perde in JavaScript. In Java, una stringa errata causerà il fallimento del programma quando si tenta di eseguirlo, a quel punto lo si corregge e si passa. Avere un controllore statico in cui entrambe le istanze puntano alla stessa costante elimina quel problema, in quanto può essere trovato in fase di compilazione. Ma JavaScript avrà semplicemente quel problema dappertutto, dato che scoprirai SEMPRE la correttezza dell'ortografia in fase di esecuzione :

Library = { doThing: function() }
setTimeout(function()
  Liberry.doThing()
  // No such object: Liberry
}, 0);

La migliore salvaguardia contro questo, di solito, è "usare rigorosamente". Per gli sviluppatori che lo preferiscono, sto bene con loro che lo usano per trovare più rapidamente problemi con le variabili non dichiarate. Ma la mia opinione è stata che fornire costanti di stringa per le API REST, ecc., In realtà non ti salvaguardi da nulla. Un altro esempio:

CompanyAPI.constants.ENROLL_URL = "/rest/enroll";
CompanyAPI.constants.FIRST_NAME = "firstName";

ajax({url: CompanyAPI.constants.ENROLL_URL,
data: CompanyAPI.constants.FIRST_NAME
});
// vs.
ajax({url: "/rest/enroll",
data: "firstName"
});

... Volevi scrivere quanto sopra, ma poi hai fatto errori di battitura. Ops.

ajax({url: CompanyAPI.constants.ENROL_URL,
  data: CompanyAPI.constants.FIRS_NAME
});
// vs.
ajax({url: "/rest/enrol",
  data: "firsName"
});

Quello basato su costante fornirà ancora undefined , mentre "firsName" non è migliore. A tal fine, tendo a vedere questo come un vantaggio dei linguaggi statici, e non preoccuparsi di avere un sistema per risolverlo (oltre a magari iniziare a usare "use strict" per il debug). Alcune persone potrebbero dirmi quale sia la loro pratica preferita per la costante stringa / intero?

EDIT: Per chiarire, la mia preferenza è di solito mettere stringhe come "firstName" direttamente in linea senza una dichiarazione costante di alto livello - le sanzioni per l'errore di ortografia sono uguali in entrambi i casi. Le stringhe che potrebbero durare a lungo, come un URL REST, tenderò a definire nella parte superiore del file.

    
posta Katana314 21.07.2014 - 20:01
fonte

2 risposte

4

Le costanti servono una funzione di controllo degli errori in lingue tipizzate staticamente, ma servono anche un secondo scopo. Centralizzano le informazioni in un unico posto. Questo non va perso quando ci spostiamo su JavaScript.

Immagina che il tuo esempio assomigli più a questo,

config.js:

CompanyAPI.constants.ENROLL_URL = "/rest/enroll";
CompanyAPI.constants.FIRST_NAME = "firstName";

enroll.js:

ajax({url: CompanyAPI.constants.ENROLL_URL,
    data: CompanyAPI.constants.FIRST_NAME
});

speciale-enroll.js:

ajax({url: CompanyAPI.constants.ENROLL_URL,
    data: CompanyAPI.constants.FIRST_NAME
});

della necessità di iscrivere-da-questo-altri-place.js:

ajax({url: CompanyAPI.constants.ENROLL_URL,
    data: CompanyAPI.constants.FIRST_NAME
});

goto-enroll.js:

redirect({url: CompanyAPI.constants.ENROLL_URL,
    data: CompanyAPI.constants.FIRST_NAME
});

Si noti come, ora, queste costanti vengono visualizzate nei file dappertutto. Se non stavo usando le costanti, dovrei trovare tutte le istanze di quella particolare stringa e sostituirle manualmente. Certo, c'è una duplicazione qui, ma si noti che l'ultimo è in realtà diverso. Ciò significa che, anche se rimuovessimo la duplicazione, non saremmo in grado di astrarlo. Ora, poiché utilizziamo le costanti e CompanyAPI.constants.FIRST_NAME deve essere modificato, possiamo cambiarlo in uno e solo uno posto, e cambia automaticamente ovunque.

Se sto usando una stringa in un solo posto, e non è una configurazione (cioè, un indice di stringa dell'array non è una configurazione), quindi lo metto in linea. Se trovo che lo sto usando in pochi punti vicini, cercherò di ridefinirlo in un solo modo. Se non posso refactoring, probabilmente lo sposterei in una costante di "classe".

    
risposta data 21.07.2014 - 21:39
fonte
3

Proprio come imparare un'altra lingua, non bisogna paragonarla alla sua lingua madre. Alcune lingue hanno spesso concetti che non si trovano in altri. Semplicemente impariamo ad accettarli.

Le costanti in Java, C # e C ++ non esistono nel codice binario. Queste costanti sono state inventate per aiutare programmatori e compilatori. Poiché questa risposta ( link ) dice "Niente è mai costante"

Pertanto, la risposta alle tue domande è nella convenzione sulla denominazione e nella revisione del codice. Tu e il tuo team dovrete definire come denominare le costanti, concordare che le costanti non saranno modificate e utilizzare la revisione del codice come metodo per applicare la regola. Alla fine della giornata, non importa in che modo decidi di andare, non sarà infallibile.

Il mio modo preferito di gestire le costanti è

var NAMESPACE.CONSTANT = 1;
    
risposta data 21.07.2014 - 20:46
fonte

Leggi altre domande sui tag