Sind Einzelzeichenkonstanten besser als Literale?


127

Ich bin kürzlich auf eine Klasse gestoßen, die so ziemlich jedes einzelne Zeichen als Konstante liefert. alles von COMMAbis BRACKET_OPEN. Ich frage mich, ob dies notwendig war. Ich habe einen "Artikel" gelesen, der nahelegt, dass es hilfreich sein kann, Literale mit einzelnen Zeichen in Konstanten zu ziehen. Ich bin also skeptisch.

Die Hauptattraktivität der Verwendung von Konstanten besteht darin, die Wartung zu minimieren, wenn eine Änderung erforderlich ist. Aber wann verwenden wir ein anderes Symbol als ',', um ein Komma darzustellen?

Der einzige Grund, warum ich Konstanten anstelle von Literalen verwende, besteht darin, den Code besser lesbar zu machen. Aber ist city + CharacterClass.COMMA + state(zum Beispiel) wirklich besser lesbar als city + ',' + state?

Für mich überwiegen die Nachteile die Vorteile, vor allem, dass Sie eine weitere Klasse und einen weiteren Import einführen. Und ich glaube an weniger Code, wo dies möglich ist. Ich frage mich also, wie der allgemeine Konsens hier ist.


12
Sehr
ähnlich

33
Hmm ... es könnte für verschiedene Gebiete nützlich sein, vielleicht? Beispielsweise verwenden einige Sprachen Anführungszeichen (Winkelanführungszeichen «und ») anstelle des englischen Standards "(oder besser aussehendes und ). Abgesehen davon klingt es nur wie eine Reihe von magischen Charakteren. Unter der Annahme , zwei Instanzen CharacterClassgenannt englishCharsund frenchCharsist es möglich , die englishChars.LEFT_QUOTEsein könnte , während frenchChars.LEFT_QUOTEsein könnte «.
Justin Time

4
Es gibt viele verschiedene Varianten von Kommas: en.wikipedia.org/wiki/Comma#Comma_variants - vielleicht ist dies keine so dumme Idee, besonders wenn Ihr Quellcode als utf-8 kodiert werden kann.
Aaron Hall

21
In Ihrem Fall ist es so, als würde man eine Variable "Nummer" nennen. Ihre Konstante hätte DELIMITER heißen sollen. Oder es sollte CITY_STATE = "{0}, {1}" sein
the_lotus

13
Der Artikel, den Sie verlinkt haben, ist sehr schrecklich. Konstanten sollten niemals in einen solchen Eimer geworfen werden. Ordnen Sie sie den Klassen zu, in denen sie Kontext haben: Im Wesentlichen stellt die Klasse mit der Konstante den Kontext bereit, in dem die Konstante verwendet wird. Zum Beispiel Java's File.separator. Die Klasse gibt Ihnen den Typ des Trennzeichens an. Eine Klasse mit dem Namen Constsoder Constantsohne Kontext zu haben, erschwert die korrekte Verwendung von Konstanten.

Antworten:


183

Tautologie :

Wenn Sie den allerersten Satz der Frage lesen, ist es sehr klar, dass es bei dieser Frage nicht um angemessene Verwendungen wie das Eliminieren magischer Zahlen geht , sondern bestenfalls um schrecklich sinnlose, dumme Konsistenz. Welches ist, was diese Antwort adressiert

Der gesunde Menschenverstand sagt Ihnen, dass Sie Ihrem System nur Wartung und Komplexität hinzufügen const char UPPER_CASE_A = 'A';oder const char A = 'A'nicht. const char STATUS_CODE.ARRIVED = 'A'ist ein anderer Fall.

Konstanten sollen Dinge darstellen, die zur Laufzeit unveränderlich sind, aber möglicherweise in Zukunft zur Kompilierungszeit geändert werden müssen. Wann wäre const char A =etwas anderes als richtig gleich A?

Wenn Sie public static final char COLON = ':'in Java-Code sehen, suchen Sie denjenigen, der das geschrieben hat, und brechen Sie seine Tastaturen. Sollte sich die Darstellung für COLONimmer ändern :, haben Sie einen Wartungsalptraum.

Verschleierung:

Was passiert, wenn jemand es ändert, COLON = '-'weil es dort, wo er es -verwendet, überall einen braucht ? Werden Sie Komponententests schreiben, die grundsätzlich assertThat(':' == COLON)für jede einzelne constReferenz gelten, um sicherzustellen, dass sie nicht geändert werden? Nur damit jemand den Test repariert , wenn er ihn ändert?

Wenn jemand tatsächlich argumentiert, dass dies public static final String EMPTY_STRING = "";nützlich und nützlich ist, haben Sie nur sein Wissen qualifiziert und ignorieren es sicher bei allen anderen.

Jedes druckbare Zeichen, das mit einer benannten Version verfügbar ist, zeigt nur, dass jeder, der es getan hat, nicht dazu qualifiziert ist, Code unbeaufsichtigt zu schreiben.

Zusammenhalt:

Es verringert auch künstlich den Zusammenhalt, weil es die Dinge von den Dingen entfernt, die sie benutzen und mit ihnen in Beziehung stehen.

In der Computerprogrammierung bezieht sich Kohäsion auf den Grad, zu dem die Elemente eines Moduls zusammengehören. Kohäsion misst also die Stärke der Beziehung zwischen Teilen der Funktionalität innerhalb eines bestimmten Moduls. Beispielsweise ist in stark zusammenhängenden Systemen die Funktionalität stark miteinander verbunden.

Kupplung:

Es werden auch viele nicht verwandte Klassen zusammengekoppelt, da sie alle auf Dateien verweisen, die nicht wirklich mit dem zusammenhängen, was sie tun.

Enge Kopplung liegt vor, wenn eine Gruppe von Klassen stark voneinander abhängig ist. Dieses Szenario tritt auf, wenn eine Klasse zu viele Aufgaben übernimmt oder wenn ein Anliegen auf mehrere Klassen verteilt ist, anstatt eine eigene Klasse zu haben.

Wenn Sie einen gebrauchten besseren Namen wie DELIMITER = ','würden Sie immer noch das gleiche Problem haben, weil der Name generisch ist und trägt keine semantische. Wenn Sie den Wert neu zuweisen, können Sie lediglich nach dem Literal suchen und es ersetzen, um eine Auswirkungsanalyse durchzuführen ','. Denn was wird von etwas Code benutzt und braucht der ,und ein anderer Code braucht es aber ;jetzt? Muss noch jede Verwendung manuell überprüfen und ändern.

In der Wildnis:

Ich habe kürzlich eine 1,000,000+ LOCAnwendung überarbeitet , die 18 Jahre alt war. Es hatte Dinge wie public static final COMMA = SPACE + "," + SPACE;. Das ist auf keinen Fall besser, als nur dort einzufügen, " , "wo es gebraucht wird.

Wenn Sie die Lesbarkeit diskutieren möchten, müssen Sie lernen, Ihre IDE so zu konfigurieren, dass whitespaceZeichen dort angezeigt werden , wo Sie sie sehen können, oder was auch immer. Dies ist nur ein äußerst fauler Grund, Entropie in ein System einzuführen.

Es wurde auch ,mehrmals mit mehreren Rechtschreibfehlern des Wortes COMMAin mehreren Paketen und Klassen definiert. Mit Verweisen auf alle Variationen, die im Code miteinander vermischt sind. Es war geradezu ein Albtraum, etwas zu reparieren , ohne etwas völlig anderes zu zerbrechen.

Gleiche mit dem Alphabet, gab es mehr UPPER_CASE_A, A, UPPER_A, A_UPPERdass die meisten der Zeit gleich waren , A aber in einigen Fällen waren nicht . Für fast jeden Charakter, aber nicht für alle Charaktere.

Und aus der Editierhistorie ging hervor, dass in den letzten 18 Jahren kein einziger dieser Artikel bearbeitet oder geändert wurde. Der Grund dafür ist, dass viel zu viele Dinge zerstört wurden, die nicht nachvollziehbar waren. Sie haben also eine neue Variable Namen, die auf dasselbe verweisen und niemals aus demselben Grund geändert werden können.

In keiner vernünftigen Realität kann man behaupten, dass diese Praxis nichts anderes tut, als mit maximaler Entropie zu beginnen.

Ich habe all dieses Durcheinander überarbeitet und all die Tautologien hervorgehoben, und die neuen College-Angestellten waren viel produktiver, weil sie nicht durch mehrere Indirektionsebenen jagen mussten, auf die diese constReferenzen tatsächlich hinwiesen, weil sie in dem, was sie nannten, nicht zuverlässig waren vs was sie enthielten.


112
Vielleicht sollten Sie ein Gegenbeispiel hinzufügen: const char DELIMITER = ':'Wäre tatsächlich nützlich.
Bergi

115
Ich würde mehrere Argumente vorbringen, EMPTY_STRINGdie von Vorteil sind. (1) Ich kann alle Verwendungen von EMPTY_STRINGin einer Datei viel einfacher finden, als ich alle Verwendungen von finden kann "". (2) Wenn ich sehe, EMPTY_STRINGweiß ich mit ziemlicher Sicherheit, dass der Entwickler beabsichtigt hat, dass diese Zeichenfolge leer ist, und dass es sich nicht um eine fehlerhafte Bearbeitung oder einen Platzhalter für eine Zeichenfolge handelt, die später bereitgestellt wird. Nun behaupten Sie, dass ich dieses Argument vorbringe, um mein Wissen zu qualifizieren und mich für immer sicher zu ignorieren. Wie qualifizieren Sie mein Wissen? Und hast du vor, meinen Rat für immer zu ignorieren? Ich habe kein Problem so oder so.
Eric Lippert

39
@immibis: Wir können aufhören, über diese Dinge nachzudenken, die im Zusammenhang mit der Bewältigung von Veränderungen nützlich sind. Das sind Konstanten. Sie ändern sich nicht. Betrachten Sie sie als nützlich im Kontext von Menschen, die die Semantik des Codes suchen und verstehen . Zu wissen, dass etwas ein Schlüssel-Wert-Paar-Trennzeichen ist, ist viel nützlicher, als zu wissen, dass es ein Doppelpunkt ist. Das ist eine Tatsache über die semantische Domäne des Programms, nicht seine Syntax .
Eric Lippert

15
@EricLippert: Ich sehe ein bisschen den Punkt von anderen hier, die darauf hinweisen, dass die einzige Garantie, die ein constbietet, ist, dass es sich zur Laufzeit (nach der Kompilierung) nicht ändert, obwohl ich Ihnen zustimme, dass die semantische Bedeutung von constist weitaus wichtiger als die Verwendung als Werkzeug für das Änderungsmanagement. const EARLIEST_OS_SUPPORTEDTrotzdem kann ich mir sicherlich eine vorstellen, die nicht nur semantisch konsistent ist, sondern sich auch im Laufe der Zeit ändern wird, wenn sich das Programm weiterentwickelt und alte Kruft entfernt wird.
Robert Harvey

16
@ DanielJour: Also das ist dann ein drittes Argument für EMPTY_STRING; dass eine gut gestaltete IDE Werkzeuge auftaucht, mit denen ich diese Entität eher symbolisch als syntaktisch behandeln kann. Verallgemeinern Sie dies auf ein viertes Argument: Die Bibliothek der Codeanalyse-Tools, die sich unter der IDE befindet, ermöglicht möglicherweise eine erweiterte programmatische Analyse der Codekorrektheit auf symbolischer Ebene . Ein Entwickler, der Werkzeuge nutzen möchte, die fortgeschrittener sind als die, die vor 40 Jahren buchstäblich geschrieben wurden, muss nur geringfügige Änderungen an seinen Gewohnheiten vornehmen, um die Vorteile fortschrittlicher Werkzeuge zu nutzen.
Eric Lippert

145

Die Hauptattraktivität der Verwendung von Konstanten besteht darin, die Wartung zu minimieren, wenn eine Änderung erforderlich ist.

ABSOLUT NICHT. Dies ist überhaupt nicht der Grund, Konstanten zu verwenden, da sich Konstanten per Definition nicht ändern . Wenn sich eine Konstante jemals ändert, dann war es keine Konstante, oder?

Die Attraktivität der Verwendung von Konstanten hat überhaupt nichts mit Änderungsmanagement zu tun und alles damit, Programme für das Schreiben, Verstehen und Warten durch Menschen zugänglich zu machen . Wenn ich überall in meinem Programm wissen möchte, wo ein Doppelpunkt als URL-Trennzeichen verwendet wird, kann ich das sehr leicht wissen, wenn ich die Disziplin habe, einen konstanten URL-Trennzeichen zu definieren, und kann das überhaupt nicht leicht wissen, wenn ich danach greifen muss :und jede einzelne Stelle im Code :abrufen, an der eine Basisklasse oder ein ?:Operator oder was auch immer angegeben wird.

Ich bin mit den anderen Antworten, die besagen, dass dies eine sinnlose Zeitverschwendung ist, überhaupt nicht einverstanden. Benannte Konstanten verleihen einem Programm eine Bedeutung , und diese Semantik kann sowohl von Menschen als auch von Maschinen verwendet werden, um ein Programm besser zu verstehen und effektiver zu verwalten.

Der Trick besteht hier nicht darin, Konstanten zu meiden, sondern sie eher mit ihren semantischen Eigenschaften als mit ihren syntaktischen Eigenschaften zu benennen . Wofür wird die Konstante verwendet? Nennen Sie Commaes nicht, es sei denn, die Geschäftsdomäne Ihres Programms ist Typografie, Parsen in englischer Sprache oder dergleichen. Nennen Sie es ListSeparatoroder so etwas, um die Semantik der Sache zu verdeutlichen.


42
Auch wenn ich dem Geist des Gesagten zustimme, stimmen Ihre zweiten / dritten Sätze nicht wirklich. Eine Konstante kann zwischen den Versionen einer Datei wechseln. Tatsächlich haben die meisten Programme, die ich schreibe, eine Konstante mit dem Namen "so" MY_VER, die die aktuelle Versionsnummer des Programms enthält und die dann im Rest des Programms anstelle einer magischen Zeichenfolge wie "5.03.427.0038" verwendet werden kann. Der zusätzliche Vorteil besteht darin, dass semantische Informationen bereitgestellt werden.
Monty Harder

50
Um fair zu sein, der Punkt einer Konstante ist, dass sie sich während der Laufzeit nach der Initialisierung nicht ändert, nicht dass sie sich zwischen den Kompilierungen nicht ändert. Aus der Sicht eines Compilers kann der Compiler davon ausgehen, dass das Programm es nicht ändern kann. ob der Programmierer es ändern darf, wenn er es neu kompiliert, ändert nichts an seiner Konstanz. Es kann auch Fälle geben, in denen Software einen Nur-Lese-Wert von der Hardware erhält, beispielsweise durch Dereferenzieren eines const volatile T*Zeigers auf eine vorgegebene Adresse. Während das Programm es nicht ändern kann, kann es die Hardware.
Justin Time

6
@MontyHarder: Guter Punkt. Meine Meinung wird durch die Tatsache geprägt, dass ich normalerweise Sprachen verwende, die zwischen Konstanten, die für immer unverändert bleiben müssen, und Variablen, die einmal zugewiesen werden können, die sich von Version zu Version, von Ausführung zu Ausführung oder was auch immer ändern können, unterscheiden. Eine Konstante und eine Variable sind verschiedene Dinge; man bleibt gleich und man ändert sich im Laufe der Zeit.
Eric Lippert

7
@SteveCox: Ich stimme zu; Die Art und Weise, wie C / C ++ "const" charakterisiert, ist seltsam und von begrenztem Nutzen. Die Eigenschaft, die ich von Konstanten haben möchte, ist, dass sich ihre Werte nicht ändern, und dass ich nicht daran gehindert bin, sie in einigen Funktionen zu ändern, in anderen jedoch nicht.
Eric Lippert

15
"Dies ist überhaupt nicht der Grund, Konstanten zu verwenden, da sich Konstanten nicht per Definition ändern. Wenn sich eine Konstante jemals ändert, war es dann keine Konstante, oder?" Das Ändern von Konstanten zur Kompilierungszeit (offensichtlich nicht zur Laufzeit) ist völlig normal. Deshalb haben Sie sie zu einem klar gekennzeichneten "Ding" gemacht. Natürlich sind die Konstanten der OP Junk, aber denken Sie an etwas wie const VERSION='3.1.2'oder const KEYSIZE=1024oder was auch immer.
AnoE

61

Nein, das ist doof.

Was nicht unbedingt dumm ist, ist, solche Dinge aus Gründen der Lokalisierung in benannte Bezeichnungen zu ziehen. Zum Beispiel kann die Tausende Trennzeichen ist ein Komma in Amerika (1.000.000), aber nicht ein Komma in anderen Orten. Wenn Sie dies in ein benanntes Etikett (mit einem geeigneten Namen ohne Komma) ziehen, kann der Programmierer diese Details ignorieren / abstrahieren.

Aber eine Konstante zu machen, weil "magische Saiten schlecht sind", ist nur Frachtkult.


8
Die Lokalisierung ist normalerweise komplizierter als nur Zeichenfolgenkonstanten. Einige Sprachen möchten beispielsweise ein Trennzeichen zwischen allen Listenelementen, während andere das Trennzeichen vor dem letzten Element ausschließen. Normalerweise braucht man also keine lokalisierten Konstanten, sondern lokalisierte Regeln .
Vlad

19
Tatsächlich ist das Tausendertrennzeichen in anderen Regionen (China / Japan) nicht unbedingt ein Tausendertrennzeichen. Es wird nicht einmal nach einer konstanten Anzahl von Ziffern gesetzt (Indien). Oh, und es kann verschiedene Trennzeichen geben, je nachdem, ob es sich um ein 1000-Trennzeichen oder ein 1000000-Trennzeichen handelt (Mexiko). Dies ist jedoch weniger problematisch, als in einigen Gebietsschemas (Farsi) die ASCII-Ziffern 0-9 nicht zu verwenden. ux.stackexchange.com/questions/23667/…
Peter

1
@Vlad-Lokalisierung ist viel komplexer, das Tausendertrennzeichen ist jedoch ein bekanntes Beispiel, das die Leute kennen.

Das hängt von der Lokalisierungsstrategie ab. Ändern Sie alle Konstanten in Ihrem Programm, um es zu übersetzen? Oder sollten Sie lieber die Werte aus einer Datei (oder einem anderen Datenspeicher) lesen, um sie effektiv zu Laufzeitvariablen zu machen?
Paŭlo Ebermann

Das wäre als Konstante also überhaupt nicht sinnvoll. Das Programm müsste für Locales neu kompiliert werden, was eine schreckliche Übung ist. Dies sollten Variablen sein, die aus Definitionsdateien geladen und bei Bedarf nachgeschlagen werden. Nicht, dass ich mit dem Punkt nicht einverstanden wäre (ich habe die Antwort positiv bewertet), aber ich würde in dieser Angelegenheit eine härtere Position einnehmen.

29

Es gibt einige Zeichen, die mehrdeutig sein können oder für verschiedene Zwecke verwendet werden. Beispielsweise verwenden wir '-'einen Bindestrich, ein Minuszeichen oder sogar einen Bindestrich. Sie können separate Namen eingeben als:

static const wchar_t HYPHEN = '-';
static const wchar_t MINUS = '-';
static const wchar_t EM_DASH = '-';

Später können Sie Ihren Code ändern, um ihn zu disambiguieren, indem Sie ihn neu definieren als:

static const wchar_t HYPHEN = '-';
static const wchar_t MINUS = '\u2122';
static const wchar_t EM_DASH = '\u2014';

Das könnte ein Grund sein , warum würden Sie betrachten definieren Konstanten für bestimmte einzelne Zeichen. Die Anzahl der auf diese Weise mehrdeutigen Zeichen ist jedoch gering. Es scheint, als würdest du es höchstens für diese tun. Ich würde auch argumentieren, dass Sie warten könnten, bis Sie tatsächlich die mehrdeutigen Zeichen unterscheiden müssen, bevor Sie den Code auf diese Weise faktorisieren.

Da typografische Konventionen je nach Sprache und Region variieren können, ist es wahrscheinlich besser, solche mehrdeutigen Interpunktionen aus einer Übersetzungstabelle zu laden.


Für mich ist dies der einzig gültige Grund, warum man Zeichenkonstanten erstellen könnte
FP

2
Die Verwendung -als Bindestrich ist ziemlich irreführend ... in den meisten Schriftarten ist dies viel zu kurz. (Es ist noch kürzer als ein Bindestrich.)
Paŭlo Ebermann

OK, nicht das beste Beispiel. Ich habe mit strings und nicht mit s begonnen wchar_tund die Standardmanuskriptkonvention von "--"für den Bindestrich verwendet. Im ursprünglichen Beispiel wurden jedoch einzelne Zeichen verwendet, sodass ich der Frage treu blieb. Es gibt Leute, die -Bindestriche eingeben, insbesondere, wenn sie mit einer Schriftart mit festem Schriftabstand arbeiten.
Adrian McCarthy

1
@ PaŭloEbermann Nein, traditionell ist ein Bindestrich die Breite des 'm'-Zeichens einer Schrift und ein Bindestrich die Breite eines' n'-Zeichens.
Dizzley

@ Dizzley ja und Bindestrichbreite <n-Breite <m-Breite.
Paŭlo Ebermann

22

Eine Konstante muss Bedeutung hinzufügen.

Die Definition von COMMA als Komma fügt keine Bedeutung hinzu, da wir wissen, dass ein Komma ein Komma ist. Stattdessen zerstören wir die Bedeutung, weil COMMA jetzt möglicherweise kein Komma mehr ist.

Wenn Sie ein Komma für einen Zweck verwenden und eine benannte Konstante verwenden möchten, benennen Sie sie nach dem Zweck. Beispiel:

  • city + CharacterClass.COMMA + state = schlecht
  • city + CITY_STATE_DELIMITER + state = gut

Verwenden Sie Funktionen zum Formatieren

Ich persönlich bevorzuge FormatCityState(city, state)und kümmere mich nicht darum, wie der Körper dieser Funktion aussieht, solange er kurz ist und die Testfälle besteht.


1
Ah, aber ein Komma ist nicht immer dasselbe Komma. Ich könnte COMMA = '\ u0559' oder '\ u060C' usw. definieren (siehe Unicode) oder es später sogar in eine Variable umwandeln und aus einer Konfigurationsdatei lesen. Auf diese Weise hat es immer noch die gleiche Bedeutung , aber nur einen anderen Wert. Wie wär es damit.
Herr Lister

2
@ MrLister: YAGNI. Wenn Sie dieses Bedürfnis haben: großartig! Sie haben eine gute Lösung. Aber wenn Sie das nicht tun - überladen Sie Ihren Code nicht, weil Sie es vielleicht eines Tages könnten. Wenn Sie meiner Erfahrung nach versuchen, Abstraktionen ohne Funktion in Ihre Codebasis einzuführen, sind die Leute auch nicht besonders gut darin, konsistent zu sein. Selbst wenn Sie COMMA mit der Absicht definiert haben, einen anderen Codepunkt zu verwenden, werden Sie in einem Programm von ausreichender Größe und Alter, so dass die Wahl überhaupt von Bedeutung ist, wahrscheinlich feststellen, dass die Konstante nicht überall verwendet wurde, wo sie verwendet werden sollte wurde (und umgekehrt möglicherweise auch unangemessen verwendet).
Eamon Nerbonne

17

Die Idee, dass eine konstante COMMA besser ','oder ","eher einfach zu entlarven ist. Klar, es gibt Fälle, in denen es Sinn macht, zum Beispiel final String QUOTE = "\"";die Lesbarkeit ohne Schrägstriche stark einzusparen, aber Sprachsteuerzeichen wie \ 'und "ich haben sie nicht als sehr nützlich empfunden .

Verwenden final String COMMA = ","ist nicht nur schlechte Form, es ist gefährlich! Wenn jemand will , von dem Separator ändern , ","um ";"sie gehen könnten die Konstanten Datei ändern , COMMA = ";"weil es schneller für sie , dies zu tun und es funktioniert einfach. Mit der Ausnahme, wissen Sie, dass alle anderen Dinge, die COMMA jetzt verwendeten, auch Semikolons sind, einschließlich der Dinge, die an externe Verbraucher gesendet werden. Es besteht also alle Ihre Tests (da der gesamte Code für das Zuordnen und Aufheben von Zuordnungen ebenfalls COMMA verwendet hat), aber externe Tests schlagen fehl.

Was nützlich ist, ist, ihnen nützliche Namen zu geben. Und ja, manchmal haben mehrere Konstanten den gleichen Inhalt, aber unterschiedliche Namen. Zum Beispiel final String LIST_SEPARATOR = ",".

Ihre Frage lautet also "Sind einzelne Zeichenkonstanten besser als Literale?" Und die Antwort lautet eindeutig "Nein". Aber noch besser als beide ist ein eng begrenzter Variablenname, der explizit angibt, wozu er dient. Sicher, Sie werden ein paar zusätzliche Bytes für diese zusätzlichen Referenzen ausgeben (vorausgesetzt, sie werden nicht für Sie kompiliert, was wahrscheinlich der Fall sein wird), aber für die langfristige Wartung, bei der die meisten Kosten für eine Anwendung anfallen, für sie lohnt sich die zeit zu machen.


Wie wäre es mit der bedingten Definition von DISP_APOSTROPHE als ASCII-0x27- oder Unicode-Anführungszeichen (was eine typografisch passendere Darstellung eines Apostrophs ist), abhängig von der Zielplattform?
Supercat

3
Tatsächlich QUOTEbeweist das Beispiel, dass es auch eine schlechte Idee ist, da Sie sie dem zuordnen, was allgemein als das DOUBLE QUOTEund QUOTEimpliziert, SINGLE_QUOTEwas korrekter als bezeichnet wird APOSTROPHE.

3
@JarrodRoberson Ich glaube nicht, dass Zitat ein einfaches Anführungszeichen bedeutet - aber das ist ein weiterer guter Grund, um Mehrdeutigkeiten zu beseitigen, wo immer Sie können!
Corsika

2
Ich mag das QUOTEBeispiel aus einem weiteren Grund nicht - es erschwert das Lesen von Strings, die damit erstellt wurden. "Hello, my name is " + QUOTE + "My Name" + QUOTEDies ist ein triviales Beispiel und sieht trotzdem schlecht aus. Oh, klar, statt Verkettung können Sie auch Ersetztoken verwenden, was "Hello, my name is %sMy Name%s".format(QUOTE, QUOTE)möglicherweise noch schlimmer ist. Aber, hey, versuchen wir es mit indexierten Token "Hello, my name is {0}My Name{0}".format(QUOTE), nicht viel besser. Jede nicht-triviale Zeichenfolge, die mit Anführungszeichen generiert wird, wäre noch schlimmer.
VLAZ

2
@corsiKa - Ich werde mit den entgangenen tatsächlichen Anführungszeichen leben. Wenn ich es verpasse, einem zu entkommen, würde sich die von mir verwendete IDE sofort beschweren. Code wird höchstwahrscheinlich auch nicht kompiliert. Es ist ziemlich leicht zu erkennen. Wie einfach es ist, einen Fehler zu machen, wenn "My name is" + QUOTE + "My Name" + QUOTEich diesen Fehler dreimal mache, indem ich den obigen Kommentar schreibe. Kannst du es erkennen? Wenn es Ihnen ein bisschen dauert, dann ist es der fehlende Platz nach ist . Formatieren Sie die Zeichenfolge? In diesem Fall ist eine Zeichenfolge mit mehreren zu ersetzenden Token noch schlechter zu verarbeiten. Wie soll ich es verwenden, damit es besser lesbar ist?
VLAZ

3

Ich habe Lexer und Parser geschrieben und Integer-Konstanten verwendet, um Terminals darzustellen. Einzelzeichen-Terminals hatten der Einfachheit halber zufällig den ASCII-Code als numerischen Wert, aber der Code könnte auch etwas ganz anderes sein. Ich hätte also ein T_COMMA, dem der ASCII-Code für ',' als konstanter Wert zugewiesen wurde. Es gab jedoch auch Konstanten für Nichtterminale, denen Ganzzahlen über der ASCII-Menge zugewiesen wurden. Als ich mir Parser-Generatoren wie Yacc oder Bison oder Parser anschaute, die mit diesen Tools geschrieben wurden, hatte ich den Eindruck, dass das im Grunde so war, wie es jeder getan hat.

Ich halte es also, wie alle anderen auch, für sinnlos, Konstanten zu definieren, um die Konstanten anstelle der Literale im gesamten Code zu verwenden, aber ich denke, es gibt Randfälle (etwa Parser), mit denen Sie möglicherweise auf Code stoßen Konstanten, wie Sie sie beschreiben. Beachten Sie, dass im Parser-Fall die Konstanten nicht nur Zeichenliterale darstellen. Sie repräsentieren Entitäten, die zufällig Zeichenliterale sind.

Ich kann mir noch ein paar Einzelfälle vorstellen, in denen es sinnvoll sein könnte, Konstanten anstelle der entsprechenden Literale zu verwenden. Beispielsweise könnten Sie NEWLINE als das Literal '\ n' auf einer Unix-Box definieren, aber '\ r \ n' oder '\ n \ r', wenn Sie auf einer Windows- oder Mac-Box arbeiten. Gleiches gilt für das Parsen von Dateien, die Tabellendaten darstellen. Sie können FIELDSEPARATOR- und RECORDSEPARATOR-Konstanten definieren. In diesen Fällen definieren Sie tatsächlich eine Konstante, um ein Zeichen darzustellen, das eine bestimmte Funktion erfüllt. Dennoch, wenn Sie ein Anfänger im Programmieren wären, würden Sie Ihre Feldtrennungskonstante COMMA nennen, ohne zu realisieren, dass Sie sie FIELDSEPARATOR nennen sollten, und zu dem Zeitpunkt, an dem Sie realisiert haben, würde der Code in der Produktion sein und Sie würden sich auf der nächsten befinden Projekt,

Schließlich Sie die Praxis beschreiben könnte Sinn in wenigen Fällen, wo Sie Code schreiben , Daten in einem bestimmten Zeichencodierung codiert zu handhaben , sagt iso-8859-1, aber erwartet , dass die Codierung später zu ändern. In einem solchen Fall wäre es natürlich viel sinnvoller, Bibliotheken zu lokalisieren oder zu kodieren und zu dekodieren, aber wenn Sie aus irgendeinem Grund eine solche Bibliothek nicht verwenden könnten, um Kodierungsprobleme für Sie zu behandeln, würden Sie nur Konstanten verwenden Es könnte ein Weg sein, in einer einzigen Datei neu zu definieren, anstatt hartcodierte Literale, die über den gesamten Quellcode verteilt sind.

In Bezug auf den Artikel, den Sie verlinkt haben: Ich glaube nicht, dass er versucht, Zeichenliterale durch Konstanten zu ersetzen. Ich denke, es wird versucht, eine Methode zu veranschaulichen, mit der Schnittstellen verwendet werden, um Konstanten in andere Teile Ihrer Codebasis zu ziehen. Die Beispielkonstanten, die verwendet werden, um dies zu veranschaulichen, sind sehr schlecht gewählt, aber ich denke, dass sie in keiner Weise von Bedeutung sind.


2
Ich denke, es wird versucht, eine Methode zu veranschaulichen, mit der Schnittstellen verwendet werden, um Konstanten in andere Teile Ihrer Codebasis zu ziehen. Dies ist ein noch schlimmeres Anti-Muster, das eine enge Kopplung und eine geringe Kohäsion aufweist. Es gibt auch keinen triftigen Grund, dies zu tun.

3

Neben all den guten Antworten hier möchte ich als Denkanstoß hinzufügen, dass es bei guter Programmierung darum geht, geeignete Abstraktionen bereitzustellen, auf denen Sie selbst und möglicherweise auch andere aufbauen können, ohne den gleichen Code immer wieder wiederholen zu müssen.

Gute Abstraktionen machen den Code einerseits benutzerfreundlich und andererseits wartungsfreundlich.

Ich stimme vollkommen zu, dass das An DELIMITER=':'und für sich eine schlechte Abstraktion ist und nur noch besser als COLON=':'(da letztere völlig verarmt ist).

Eine gute Abstraktion mit Zeichenfolgen und Trennzeichen bietet die Möglichkeit, einen oder mehrere einzelne Inhaltselemente in die Zeichenfolge zu packen und sie auch aus der gepackten Zeichenfolge zu entpacken, bevor Sie den Begrenzer angeben. Eine solche Abstraktion würde als Konzept gebündelt, in den meisten Sprachen als Klasse; B. so, dass seine Verwendung praktisch selbstdokumentierend wäre, indem Sie nach allen Stellen suchen können, an denen diese Klasse verwendet wird, und sich sicher sein können, welche Absicht der Programmierer hinsichtlich des Formats der gepackten Zeichenfolgen in jedem Fall hat, in dem eine Abstraktion verwendet wird.

Sobald eine solche Abstraktion bereitgestellt wird, wäre sie einfach zu verwenden, ohne jemals nach dem Wert des DELIMITERoder COLONfragen zu müssen, und das Ändern der Implementierungsdetails wäre im Allgemeinen auf die Implementierung beschränkt. Kurz gesagt, diese Konstanten sollten eigentlich Implementierungsdetails sein, die in einer geeigneten Abstraktion verborgen sind.

Die Hauptattraktivität der Verwendung von Konstanten besteht darin, die Wartung zu minimieren, wenn eine Änderung erforderlich ist.

Gute Abstraktionen, bei denen es sich in der Regel um Kompositionen mehrerer verwandter Funktionen handelt, können die Wartung besser minimieren. Erstens trennen sie den Anbieter klar von den Verbrauchern. Zweitens verbergen sie die Implementierungsdetails und bieten stattdessen direkt nützliche Funktionen. Drittens dokumentieren sie auf hohem Niveau, wann und wo sie eingesetzt werden.


2

Das einzige Mal, dass ich gesehen habe, dass solche Konstanten effektiv verwendet werden, ist, eine vorhandene API oder ein vorhandenes Dokument abzugleichen. Ich habe Symbole gesehen, die zum Beispiel COMMAverwendet wurden, weil eine bestimmte Software direkt mit einem Parser verbunden war, der COMMAals Tag in einem abstrakten Syntaxbaum verwendet wurde. Ich habe auch gesehen, dass es einer formalen Spezifikation entsprach. In formalen Spezifikationen sehen Sie manchmal COMMAeher Symbole als Symbole ',', die so klar wie möglich sein sollen.

In beiden Fällen COMMAhilft die Verwendung eines benannten Symbols , einem ansonsten nicht zusammenhängenden Produkt Zusammenhalt zu verleihen. Dieser Wert kann häufig die Kosten für übermäßig ausführliche Notizen überwiegen.


2

Beobachten Sie, dass Sie versuchen, eine Liste zu erstellen .

Refactor es als: String makeList(String[] items)

Mit anderen Worten, ziehen Sie die Logik anstelle der Daten heraus .
Sprachen mögen sich in der Darstellung von Listen unterscheiden, aber Kommas sind immer Kommas (das ist eine Tautologie). Wenn sich also die Sprache ändert, hilft es Ihnen nicht, das Komma zu ändern - aber das wird es.


0

Wenn dies eine Klasse war, die als Teil einer Anwendung von Ihrem Mitentwickler geschrieben wurde, ist dies mit ziemlicher Sicherheit eine schlechte Idee. Wie andere bereits ausgeführt haben, ist es sinnvoll, Konstanten zu definieren, z. B. SEPARATOR = ','wo Sie den Wert ändern können, und die Konstante ist immer noch sinnvoll, aber noch viel weniger Konstanten, deren Name nur ihren Wert beschreibt.

Es gibt jedoch mindestens zwei Fälle, in denen es sinnvoll ist, Konstanten zu deklarieren, deren Name genau ihren Inhalt beschreibt, und in denen Sie den Wert nicht ändern können, ohne den Namen der Konstanten entsprechend zu ändern:

  • Mathematische oder physikalische Konstanten, z PI = 3.14159. Hier hat die Konstante die Aufgabe, als Mnemon zu fungieren, da der symbolische Name PIviel kürzer und lesbarer ist als der Wert, den er darstellt.
  • Ausführliche Symbollisten in einem Parser oder Tasten auf einer Tastatur. Es kann sogar sinnvoll sein, eine Liste von Konstanten mit den meisten oder allen Unicode-Zeichen zu haben . Einige Zeichen wie Asind offensichtlich und klar erkennbar. Aber können Sie leicht unterscheiden Аund Aunterscheiden? Der erste ist der kyrillische Buchstabe A, während der letztere der lateinische Buchstabe A ist . Es handelt sich um verschiedene Buchstaben, die durch verschiedene Unicode-Codepunkte dargestellt werden, obwohl sie grafisch fast identisch sind. Ich hätte lieber Konstanten CYRILLIC_CAPITAL_AundLATIN_CAPITAL_Ain meinem Code als zwei fast identisch aussehende Zeichen. Dies ist natürlich sinnlos, wenn Sie wissen, dass Sie nur mit ASCII-Zeichen arbeiten, die kein Kyrillisch enthalten. Ebenso: Ich verwende täglich lateinisches Alphabet. Wenn ich also ein Programm schreibe, das ein chinesisches Zeichen benötigt, würde ich wahrscheinlich lieber eine Konstante verwenden, als ein Zeichen einzufügen, das ich nicht verstehe. Für jemanden, der täglich chinesische Schriftzeichen verwendet, ist ein chinesisches Schriftzeichen möglicherweise offensichtlich, ein lateinisches Schriftzeichen ist jedoch möglicherweise einfacher als benannte Konstante darzustellen. Wie Sie sehen, kommt es also auf den Kontext an. Dennoch kann eine Bibliothek symbolische Konstanten für alle Zeichen enthalten, da die Autoren nicht im Voraus wissen können, wie die Bibliothek verwendet wird und welche Zeichen Konstanten benötigen, um die Lesbarkeit in einer bestimmten Anwendung zu verbessern.

Solche Fälle werden jedoch normalerweise von Systemklassen oder Spezialbibliotheken behandelt, und ihr Auftreten in Code, der von Anwendungsentwicklern geschrieben wurde, sollte sehr selten sein, es sei denn, Sie arbeiten an einem ganz speziellen Projekt.


-1

Vielleicht.

Einzelzeichenkonstanten sind relativ schwer zu unterscheiden. Daher kann es ziemlich einfach sein, die Tatsache zu übersehen, dass Sie einen Punkt anstelle eines Kommas hinzufügen

city + '.' + state

Das ist ein relativ schwerer Fehler

city + Const.PERIOD + state

Abhängig von Ihrer Internationalisierungs- und Globalisierungsumgebung kann der Unterschied zwischen einem ASCII-Apostroph und dem offenen und geschlossenen Apostroph von Windows-1252 (oder dem doppelten ASCII-Anführungszeichen und dem offenen und geschlossenen doppelten Anführungszeichen von Windows-1252) erheblich sein und ist bekanntermaßen schwierig zu visualisieren am Code.

Wenn die versehentliche Eingabe eines Punkts anstelle eines Kommas ein wesentliches Funktionsproblem darstellt, wird vermutlich ein automatisierter Test durchgeführt, der den Tippfehler findet. Wenn Ihre Software CSV-Dateien generiert, würde ich davon ausgehen, dass Ihre Testsuite ziemlich schnell feststellen würde, dass Sie einen Zeitraum zwischen der Stadt und dem Bundesstaat hatten. Wenn Ihre Software für Clients mit einer Vielzahl von Internationalisierungskonfigurationen ausgeführt werden soll, wird Ihre Testsuite vermutlich in jeder Umgebung ausgeführt und wird abgerufen, wenn Sie ein offenes Microsoft-Angebot haben, wenn Sie einen Apostroph haben wollten.

Ich könnte mir ein Projekt vorstellen, in dem es sinnvoller ist, sich für ausführlicheren Code zu entscheiden, der diese Probleme beseitigt, insbesondere wenn Sie älteren Code haben, der keine umfassende Testsuite enthält, obwohl ich wahrscheinlich nicht auf diese Weise codieren würde ein grünes feld entwicklungsprojekt. Und das Hinzufügen einer Konstanten für jedes Interpunktionszeichen und nicht nur für diejenigen, die in Ihrer speziellen Anwendung möglicherweise problematisch sind, ist wahrscheinlich ein schwerer Overkill.


2
Was passiert, wenn sich ein Idiot ändert Const.PERIOD, um gleich zu sein ~? Es gibt keine Rechtfertigung für eine Tautologie benannter Zeichen, sie erhöht lediglich die Wartung und Komplexität, die in modernen Programmierumgebungen nicht erforderlich ist. Wirst du eine Reihe von Unit-Tests schreiben, die im Grunde sagen assert(Const.PERIOD == '.')?

3
@JarrodRoberson - Das wäre scheiße. Aber Sie wären genauso in Schwierigkeiten, wenn jemand eine Unicode-Konstante hinzufügt, die fast genau wie ein Komma aussieht und nicht wie ein tatsächliches Komma. Wie ich schon sagte, so etwas würde ich in einem Greenfield-Entwicklungsprojekt nicht machen. Wenn Sie jedoch über eine ältere Codebasis mit einer fleckigen Testsuite verfügen, bei der Sie ein paarmal über Komma / Punkt oder Apostroph / Microsoft-Abscheulichkeits-Apostrophe gestolpert sind, kann es sinnvoll sein, einige Konstanten zu erstellen und die Benutzer zu ihrer Verwendung zu verpflichten Der Code ist besser, ohne ein Jahr lang Tests schreiben zu müssen.
Justin Cave

3
Ihr altes Beispiel ist schlecht. Ich habe gerade eine über 1.000.000 LOC-Code-Basis überarbeitet, die 18 Jahre alt ist. Es wurde jedes druckbare Zeichen so mehrfach mit unterschiedlichen Namen definiert. Und oft wurden die genannten Dinge COMMAtatsächlich eingestellt = SPACE + "," + SPACE. Ja, irgendein Idiot hatte eine SPACEKonstante. Ich habe sie ALLE überarbeitet, und der Code war um ein Vielfaches besser lesbar, und College-Angestellte waren viel besser in der Lage, Dinge aufzuspüren und zu reparieren, ohne 6 Indirektionsebenen zu haben, um herauszufinden, auf was genau etwas eingestellt war.

-1

Sind Einzelzeichenkonstanten besser als Literale?

Hier gibt es viele Konflikte. Lassen Sie mich sehen, ob ich sie auseinander ziehen kann.

Konstanten bieten:

  • Semantik
  • Veränderung während der Entwicklung
  • Indirektion

Wenn Sie einen einzelnen Zeichennamen verwenden, wirkt sich dies nur auf die Semantik aus. Ein Name sollte als Kommentar nützlich und im Kontext klar sein. Es sollte eine Bedeutung ausdrücken, nicht den Wert. Wenn es das alles mit einem einzigen Zeichen gut kann. Wenn nicht, bitte nicht.

Sowohl ein Literal als auch eine Konstante können sich während der Entwicklung ändern. Dies ist es, was die Frage nach der magischen Zahl aufwirft. Zeichenfolgen können auch magische Zahlen sein.

Wenn eine semantische Bedeutung existiert und da beide konstant sind, kommt es auf die Indirektion an, ob die Konstante mehr Wert hat als ein Literal.

Indirektion kann jedes Problem lösen, außer zu viel Indirektion.

Indirektion kann das Problem der magischen Zahl lösen, da Sie an einer Stelle über einen Wert für eine Idee entscheiden können. Semantisch gesehen muss der Name klar machen, was diese Idee ist, damit sich das lohnt. Der Name sollte sich auf die Idee und nicht auf den Wert beziehen.

Indirektion kann übertrieben werden. Einige bevorzugen es, Literale zu suchen und zu ersetzen, um ihre Änderungen vorzunehmen. Das ist in Ordnung, solange 42 eindeutig der Sinn des Lebens ist und nicht mit 42, der Ordnungszahl von Molybdän, vermischt wird.

Ob Sie mit einem Buchstaben so nützliche Unterscheidungen treffen können, hängt weitgehend vom Kontext ab. Aber ich würde es mir nicht zur Gewohnheit machen.


1
Semantik ist der Schlüssel. Wenn und "A" mehr Semantik hat als nur ein "A" zu sein, dann lohnt es sich, dieselbe Semantik an dieselbe "Referenz" zu binden. Es spielt keine Rolle, ob es eine Konstante ist oder nicht. Ich bin völlig einverstanden.
Oopexpert

-1

Als philosophischer Kontrapunkt zur Mehrheitsmeinung muss ich feststellen, dass es einige von uns gibt, die den ungekünstelten französischen Bauernprogrammierer des 19

erinnerte sich an seine monotone, immerwährende Klarheit, an seine verblüffend vernünftigen Ansichten über alles, an seine kolossale Zufriedenheit mit Binsenweisheiten, nur weil sie wahr waren. "Alles durcheinander bringen!" schrie Turnbull zu sich selbst, "wenn er in der Anstalt ist, kann es niemanden draußen geben."

GK Chesterton, der Ball und das Kreuz

Es ist nichts Falsches daran, die Wahrheit zu schätzen, und es ist nichts Falsches daran, die Wahrheit zu sagen, besonders wenn man mit einem Computer spricht.

Wenn Sie den Computer anlügen, wird es Ihnen helfen

Perry Farrar - Germantown, Maryland (aus Weitere Programmierperlen)


Aber zum größten Teil stimme ich den Leuten zu, die sagen, dass es dumm ist. Ich bin zu jung, um FORTRAN programmieren zu können, aber ich habe gehört, dass Sie 'A' = 'Q'alle möglichen wundervollen Kryptogramme neu definieren und erstellen können. Das machst du nicht.

Über die zuvor angesprochenen i18n-Probleme hinaus (die nicht die Glyphe "COMMA" neu definieren, sondern die Glyphe eines DECIMAL_POINT wirklich neu definieren). Die Konstruktion von französischen oder britischen Anführungszeichen, um dem Menschen eine Bedeutung zu vermitteln, ist eine Sache, und diese sollten wirklich Variablen sein, keine Konstanten. Die Konstante wäre AMERICAN_COMMA := ','und diecomma := AMERICAN_COMMA

Und wenn ich ein Builder-Muster verwenden würde, um eine SQL-Abfrage zu erstellen, würde ich viel lieber sehen

sb.append("insert into ")
 .append(table_name)
 .append(" values ")
 .append(" ( ")
 .append(val_1)
 .append(",")
 .append(val_2)
 .append(" ); ")

als alles andere, aber wenn Sie Konstanten hinzufügen würden, wäre es

INSERT_VALUES_START = " ( "
INSERT_VALUES_END = " ) "
INSERT_VALUES_SEPARATOR = " , "
QUERY_TERMINATOR = ";"

sb.append("insert into ")
 .append(table_name)
 .append(" values ")
 .append(INSERT_VALUES_START)
 .append(val_1)
 .append(INSERT_VALUES_SEPARATOR)
 .append(val_2)
 .append(INSERT_VALUES_END)
 .append(QUERY_TERMINATOR)

Wenn Sie jedoch jemals jemand anderem beim Programmieren (oder Tippen) zugesehen haben, werden Sie möglicherweise einige interessante Macken bemerken. Nicht alle von uns sind hervorragende Schreibkräfte. Viele von uns haben spät mit dem Programmieren angefangen oder sind mit sowjetischen Tastaturen aufgewachsen (bei denen die Tasten auf Sie drücken), und wir mögen es , einzelne Buchstaben auszuschneiden und einzufügen, anstatt zu versuchen, sie auf der Tastatur zu finden und / oder sich auf die automatische Vervollständigung zu verlassen.

Nichts wird eine Zeichenfolge für Sie automatisch vervollständigen. Wenn ich also ein Komma erhalten kann, indem ich 'con', Alt-Leertaste, runter, runter, eingebe und ein Zitat erhalte, indem ich 'con', Alt-Leertaste, runter drücke, runter, eintreten. Ich könnte das einfach tun.


Eine andere Sache, an die man sich bei String-Literalen erinnern sollte, ist die Art und Weise, wie sie kompiliert werden. Zumindest in Delphi (das ist die einzige Sprache, von der ich besessen bin) werden Sie Ihre Literale in den Stapel jeder Funktion stellen. Also, viele Literale = viel Funktionsaufwand; "," in function_A ist nicht derselbe Speicher wie ein "," in function_B ". Um dem entgegenzuwirken, gibt es eine" Ressourcenzeichenfolge ", die seitwärts aufgebaut und verknüpft werden kann - und auf diese Weise erledigen sie Dinge (töten) zwei Vögel mit einem Busch). In Python sind alle Ihre String-Literale Objekte, und es mag tatsächlich schön erscheinen, sie zu verwenden utils.constants.COMMA.join(["some","happy","array","strings"]), aber es ist keine herausragende Idee für die Punkte, die auf dieser Seite immer wieder wiederholt werden.


-4

Aber wann verwenden wir ein anderes Symbol als ',', um ein Komma darzustellen?

Zur Lokalisierung.

In englischsprachigen Ländern ist das Symbol, das die ganzen und gebrochenen Teile einer Dezimalstelle voneinander trennt, ".", Was wir "Dezimalstelle" nennen. In vielen anderen Ländern ist das Symbol "," und wird in der Landessprache normalerweise als "Komma" bezeichnet. Wenn englischsprachige Länder "," verwenden, um Gruppen mit drei Ziffern in großen Zahlen zu trennen (z. B. 1.000.000 für eine Million), verwenden Länder, die ein Komma als Dezimalpunkt verwenden, einen Punkt (1.000.000).

Wenn Sie also eine Globalisierung durchführen, müssen Sie DECIMAL_POINT- und COMMA-Konstanten festlegen.


2
Aber dann sind COMMA und DECIMAL_POINT nicht die richtigen Namen für die Entitäten (was wahrscheinlich der Grund ist, warum Sie herabgestuft wurden).
Kyle Strand

Sie müssten bestimmte lokalisierte Versionen kompilieren. Literalkonstanten sind dafür nicht geeignet; In diesem Anwendungsfall werden Definitionsdateien und Suchvorgänge in diesen Dateien benötigt (dies kann Konstanten, aber Suchkonstanten und keine konstanten Zeichen umfassen).
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.