Ich bin kürzlich auf eine Klasse gestoßen, die so ziemlich jedes einzelne Zeichen als Konstante liefert. alles von COMMA
bis 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.
quelle
«
und»
) anstelle des englischen Standards"
(oder besser aussehendes“
und”
). Abgesehen davon klingt es nur wie eine Reihe von magischen Charakteren. Unter der Annahme , zwei InstanzenCharacterClass
genanntenglishChars
undfrenchChars
ist es möglich , dieenglishChars.LEFT_QUOTE
sein könnte“
, währendfrenchChars.LEFT_QUOTE
sein könnte«
.File.separator
. Die Klasse gibt Ihnen den Typ des Trennzeichens an. Eine Klasse mit dem NamenConsts
oderConstants
ohne Kontext zu haben, erschwert die korrekte Verwendung von Konstanten.Antworten:
Tautologie :
Der gesunde Menschenverstand sagt Ihnen, dass Sie Ihrem System nur Wartung und Komplexität hinzufügen
const char UPPER_CASE_A = 'A';
oderconst 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 gleichA
?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ürCOLON
immer ä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ätzlichassertThat(':' == COLON)
für jede einzelneconst
Referenz 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.
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.
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+ LOC
Anwendung überarbeitet , die 18 Jahre alt war. Es hatte Dinge wiepublic 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
whitespace
Zeichen 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 WortesCOMMA
in 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_UPPER
dass 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
const
Referenzen tatsächlich hinwiesen, weil sie in dem, was sie nannten, nicht zuverlässig waren vs was sie enthielten.quelle
const char DELIMITER = ':'
Wäre tatsächlich nützlich.EMPTY_STRING
die von Vorteil sind. (1) Ich kann alle Verwendungen vonEMPTY_STRING
in einer Datei viel einfacher finden, als ich alle Verwendungen von finden kann""
. (2) Wenn ich sehe,EMPTY_STRING
weiß 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.const
bietet, ist, dass es sich zur Laufzeit (nach der Kompilierung) nicht ändert, obwohl ich Ihnen zustimme, dass die semantische Bedeutung vonconst
ist weitaus wichtiger als die Verwendung als Werkzeug für das Änderungsmanagement.const EARLIEST_OS_SUPPORTED
Trotzdem 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.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.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
Comma
es nicht, es sei denn, die Geschäftsdomäne Ihres Programms ist Typografie, Parsen in englischer Sprache oder dergleichen. Nennen Sie esListSeparator
oder so etwas, um die Semantik der Sache zu verdeutlichen.quelle
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.const volatile T*
Zeigers auf eine vorgegebene Adresse. Während das Programm es nicht ändern kann, kann es die Hardware.const VERSION='3.1.2'
oderconst KEYSIZE=1024
oder was auch immer.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.
quelle
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:Später können Sie Ihren Code ändern, um ihn zu disambiguieren, indem Sie ihn neu definieren als:
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.
quelle
-
als Bindestrich ist ziemlich irreführend ... in den meisten Schriftarten ist dies viel zu kurz. (Es ist noch kürzer als ein Bindestrich.)string
s und nicht mit s begonnenwchar_t
und 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.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
= schlechtcity + CITY_STATE_DELIMITER + state
= gutVerwenden 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.quelle
Die Idee, dass eine konstante COMMA besser
','
oder","
eher einfach zu entlarven ist. Klar, es gibt Fälle, in denen es Sinn macht, zum Beispielfinal 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.
quelle
QUOTE
beweist das Beispiel, dass es auch eine schlechte Idee ist, da Sie sie dem zuordnen, was allgemein als dasDOUBLE QUOTE
undQUOTE
impliziert,SINGLE_QUOTE
was korrekter als bezeichnet wirdAPOSTROPHE
.QUOTE
Beispiel aus einem weiteren Grund nicht - es erschwert das Lesen von Strings, die damit erstellt wurden."Hello, my name is " + QUOTE + "My Name" + QUOTE
Dies 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."My name is" + QUOTE + "My Name" + QUOTE
ich 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?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.
quelle
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 alsCOLON=':'
(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
DELIMITER
oderCOLON
fragen 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.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.
quelle
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
COMMA
verwendet wurden, weil eine bestimmte Software direkt mit einem Parser verbunden war, derCOMMA
als Tag in einem abstrakten Syntaxbaum verwendet wurde. Ich habe auch gesehen, dass es einer formalen Spezifikation entsprach. In formalen Spezifikationen sehen Sie manchmalCOMMA
eher Symbole als Symbole','
, die so klar wie möglich sein sollen.In beiden Fällen
COMMA
hilft 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.quelle
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.
quelle
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:
PI = 3.14159
. Hier hat die Konstante die Aufgabe, als Mnemon zu fungieren, da der symbolische NamePI
viel kürzer und lesbarer ist als der Wert, den er darstellt.A
sind offensichtlich und klar erkennbar. Aber können Sie leicht unterscheidenА
undA
unterscheiden? 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 KonstantenCYRILLIC_CAPITAL_A
undLATIN_CAPITAL_A
in 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.
quelle
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
Das ist ein relativ schwerer Fehler
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.
quelle
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 sagenassert(Const.PERIOD == '.')
?COMMA
tatsächlich eingestellt= SPACE + "," + SPACE
. Ja, irgendein Idiot hatte eineSPACE
Konstante. 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.Hier gibt es viele Konflikte. Lassen Sie mich sehen, ob ich sie auseinander ziehen kann.
Konstanten bieten:
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.
quelle
Als philosophischer Kontrapunkt zur Mehrheitsmeinung muss ich feststellen, dass es einige von uns gibt, die den ungekünstelten französischen Bauernprogrammierer des 19
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.
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
als alles andere, aber wenn Sie Konstanten hinzufügen würden, wäre es
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.quelle
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.
quelle