Best Practices / Gründe für String-Konstanten in JavaScript [geschlossen]

8

In statischen Sprachen wie Java / C # verwende ich normalerweise Konstanten für Zeichenfolgen oder Zahlen, anstatt sie nur in den Code einzufügen. Ich neige jedoch dazu, diese Praxis in JavaScript zu vermeiden. In jüngerer Zeit, als einige andere Programmierer um mich herum diesen Ansatz in JS gewählt haben, habe ich beschlossen, dass ich wahrscheinlich entweder meine oder ihre Argumentation festigen sollte.

In JavaScript gibt es keine tatsächliche "const" -Deklarationssyntax. Wir geben uns normalerweise nur mit einer informellen Richtlinie zufrieden, bei der die Eigenschaften in Großbuchstaben nicht geändert werden. Aber ich bin normalerweise der Meinung, sie ganz zu vermeiden, da die meisten ihrer Vorteile in JavaScript verloren gehen. In Java führt eine falsch geschriebene Zeichenfolge dazu, dass das Programm fehlschlägt, wenn Sie versuchen, es auszuführen. An diesem Punkt korrigieren Sie es und fahren fort. Ein statischer Prüfer, bei dem beide Instanzen auf dieselbe Konstante verweisen, beseitigt dieses Problem, da es zur Kompilierungszeit gefunden werden kann. Aber JavaScript wird dieses Problem einfach überall haben, da Sie IMMER zur Laufzeit die Richtigkeit Ihrer Rechtschreibung feststellen werden :

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

Der beste Schutz dagegen ist normalerweise "streng verwenden". Für Entwickler, die es bevorzugen, ist es in Ordnung, wenn sie das verwenden, um Probleme mit nicht deklarierten Variablen schneller zu finden. Meine Meinung war jedoch, dass die Bereitstellung von Zeichenfolgenkonstanten für REST-APIs usw. Sie nicht vor irgendetwas schützt. Ein anderes Beispiel:

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"
});

... Sie wollten das oben genannte schreiben, machten dann aber Tippfehler. Hoppla.

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

Die auf Konstanten basierende liefert immer noch undefiniert , während "firsName" nicht besser ist. Zu diesem Zweck neige ich dazu, dies nur als Vorteil statischer Sprachen zu betrachten und mich nicht darum zu kümmern, ein System zu haben, um es zu beheben (abgesehen davon, dass ich möglicherweise anfange, "use strict" zum Debuggen zu verwenden). Können mir einige andere Leute sagen, was ihre bevorzugte Praxis für die Konstanz von Zeichenfolgen / Ganzzahlen ist?

BEARBEITEN: Zur Verdeutlichung ist es normalerweise meine Präferenz, Zeichenfolgen wie "Vorname" ohne konstante Deklaration der obersten Ebene direkt inline zu setzen - die Strafen für Rechtschreibfehler sind in beiden Fällen gleich. Zeichenfolgen, die möglicherweise lang werden, wie z. B. eine REST-URL, werden in der Regel oben in der Datei definiert.

Katana314
quelle
FIRST_NAME? Das sieht so aus, als ob es von etwas Serverseitigem kommt und an das Javascript übergeben wird. Und wenn Sie sagen, dass Sie aus Java / C # stammen, haben Sie das Gefühl, dass Sie falsch verstehen, wofür diese Variablen bestimmt sind: Trennen Sie die Daten vom Code, damit die .jsDatei vom Browser zwischengespeichert werden kann ...
Izkata
@Izkata Ich bin mir nicht sicher, ob ich den Kommentar zum Caching bekomme. Dies ist kein vom Server generiertes JS (obwohl eine Möglichkeit für diese Konstanten darin besteht, dass sie vom Server stammen - dies würde die Dinge stärker zentralisieren, aber ich denke, dies wäre eine übermäßige Komplikation und zu viele zusätzliche Anforderungen.)
Katana314
Es würden keine zusätzlichen Anforderungen generiert, die Daten würden in der Vorlage festgelegt und im Javascript verwendet. Es war insbesondere die Verwendung von FIRST_NAME, die mich gefragt hat - ändert sich das nicht pro Benutzer?
Izkata
Ja, dieser Teil war nur Faulheit beim Schreiben des Beispiels; Diese Instanz sendet nur das Wort "Vorname" an den Server, was nicht viel Sinn macht, aber im Allgemeinen wäre die Idee, dies als Schlüssel für einen Eingabewert zu verwenden.
Katana314

Antworten:

5

Konstanten erfüllen zwar eine Fehlerprüfungsfunktion in statisch typisierten Sprachen, sie dienen jedoch auch einem zweiten Zweck. Sie zentralisieren Informationen an einem Ort. Dies geht nicht verloren, wenn wir zu JavaScript wechseln.

Stellen Sie sich vor, Ihr Beispiel sieht eher so aus:

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
});

special-registr.js:

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

Notwendigkeit, sich von diesem anderen Ort aus anzumelden.js:

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

goto-registr.js:

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

Beachten Sie, wie diese Konstanten jetzt überall in Dateien angezeigt werden. Wenn ich keine Konstanten verwenden würde, müsste ich alle Instanzen dieser bestimmten Zeichenfolge finden und manuell ersetzen. Zugegeben, hier gibt es Überschneidungen, aber beachten Sie, dass die letzte tatsächlich anders ist. Dies bedeutet, dass wir dies selbst dann nicht abstrahieren könnten, wenn wir die Duplizierung entfernen würden. Da wir jetzt Konstanten verwenden und CompanyAPI.constants.FIRST_NAMEdiese ändern müssen, können wir sie an nur einer Stelle ändern und sie ändern sich automatisch überall.

Wenn ich eine Zeichenfolge nur an einer Stelle verwende und sie nicht konfiguriert ist (dh ein Array-Zeichenfolgenindex ist keine Konfiguration), werde ich sie inline setzen. Wenn ich feststelle, dass ich es an einigen nahe beieinander liegenden Stellen verwende, werde ich versuchen, es in eine Verwendung umzuwandeln. Wenn ich nicht umgestalten kann, würde ich es wahrscheinlich in eine Konstante auf "Klassen" -Ebene verschieben.

cbojar
quelle
1
Das hat auch eine dunkle Seite. Jedes Mal, wenn ein Datenelement für eine Anforderung hinzugefügt / entfernt wird, muss es zu zwei verschiedenen Dateien hinzugefügt / entfernt werden. Wenn sich der Name eines Datenelements ändert, können Sie auch einfach die Konstante ändern. Dann ist der Code jedoch schwerer zu lesen, da es sich um einen Konstantennamen handelt, der auf einen anderen Variablennamen verweist. (Zum Beispiel hat unser Unternehmen nicht nur einmal, sondern zweimal in "Registrierungscodes" umbenannt.) Das Fehlen automatisierter Refactor-Tools von JS bedeutet, dass ein Großteil dieser Zentralisierung verloren geht.
Katana314
4

Genau wie beim Erlernen einer anderen Sprache sollte man diese nicht mit seiner Muttersprache vergleichen. Einige Sprachen haben oft Konzepte, die in anderen nicht zu finden sind. Wir lernen einfach, sie zu akzeptieren.

Konstanten in Java, C # und C ++ existieren im Binärcode nicht. Diese Konstanten wurden erfunden, um Programmierern und Compilern zu helfen. In dieser Antwort ( /programming/130396/are-there-constants-in-javascript ) heißt es: "Nichts ist jemals konstant."

Die Antwort auf Ihre Fragen finden Sie daher in der Namenskonvention und in der Codeüberprüfung. Sie und Ihr Team müssen definieren, wie Konstanten benannt werden sollen, vereinbaren, dass Konstanten nicht geändert werden, und die Codeüberprüfung verwenden, um die Regel durchzusetzen. Letztendlich spielt es keine Rolle, für welchen Weg Sie sich entscheiden, es ist nicht narrensicher.

Meine bevorzugte Art, mit Konstanten umzugehen, ist

var NAMESPACE.CONSTANT = 1;
Roman Mik
quelle