Das ist ein sehr vager Titel, aber ich könnte mir keinen besseren Weg vorstellen, ihn auszudrücken. Aber denken Sie nur als Beispiel an die Richtung, in die sich ein Charakter in einem Spiel bewegt. Es fühlt sich einfach falsch an, eine Schnur zu verwenden und dann Dinge wie zu tun if(character.direction == "left")
. Es scheint mir, dass es zu viel Raum für alberne Fehler lässt, wie das versehentliche Verwenden von Left
oder l
oder was auch immer anstelle von left
. Sind meine Vermutungen richtig? Wenn ja, wie lässt sich so etwas am besten erreichen?
19
bash
.Antworten:
Wenn die von Ihnen verwendete Sprache die Verwendung von Aufzählungen unterstützt, würde ich sie verwenden. Hiermit können Sie die Anzahl der verfügbaren Optionen für einen bestimmten Typ begrenzen. zB in Java:
quelle
enum
wie Java beschränkt ist. Viele Sprachen (z. B. VBA) habenenum
, aber es ist möglicherweise nicht die beste Option, da es nicht die gleiche Zukunftssicherheit bietet. Siehe meine Antwort für eine Diskussion darüber, warumenum
allein eine unvollständige, oft spröde und sprachspezifische Lösung ist.Es ist eine schreckliche Praxis, im Code wörtliche Zeichenfolgen (oder magische Zahlen) zu verwenden.
Aufzählungen sind gut oder verwenden zumindest Konstanten (Aufzählungen sind natürlich nur ein Wrapper-Typ für eine oder mehrere verwandte Konstanten).
Dieser einfache Schalter hat so viele Vorteile, dass ich gar nicht wüsste, wo ich anfangen soll, sie zu erklären (zumindest nicht ohne etwas Kaffee). Lesen Sie die magischen Zahlen nach, es ist dasselbe exakte Konzept, das nur auf einen Zahlenwert anstelle eines Zeichenfolgenwerts angewendet wird.
Hier ist ein kurzer Hinweis, ich bin sicher, dass es noch Hunderte gibt: /programming/47882/what-is-a-magic-number-and-why-is-it-bad
quelle
Kurze Antwort: Ja, Zeichenfolgen eignen sich nur für das Speichern und Zugreifen auf eine Folge von Textzeichen. Auch wenn die zugrunde liegenden Bits einer Abstraktion Zeichenfolgen sind, bietet es Vorteile, sie als Variablen oder Konstanten zu referenzieren .
Lange Antwort: Die meisten Sprachen bieten Typen an, die näher an der Domäne Ihres Problems liegen, und auch wenn dies nicht der Fall ist, verfügen sie wahrscheinlich über eine Methode, mit der Sie
left
eine Entität definieren können, die sich vonright
(etc etc) unterscheidet. Das Verwandeln in eine Zeichenfolge mithilfe von verfällt"left"
lediglich die Sprache und die hilfreichen Funktionen der IDE, z. B. die Fehlerprüfung. Auch wenn Sie verwenden müssenOder etwas Äquivalentes: Es hat Vorteile, die Zeichenfolge zu verwenden, wenn Sie im gesamten Code darauf verweisen. Beispielsweise,
würde als Fehler bei der Kompilierung erkannt (bester Fall, Java und so) oder von einer IDE als falsch gekennzeichnet (schlimmster Fall, grundlegend und so).
Darüber hinaus
left
hilft Ihnen der Begriff als referenzierbare Entität dabei, die Richtung zu berücksichtigen, in die Sie sich für den Richtungstyp entscheiden. Durch die Verwendung von"left"
wird Richtung dazu verpflichtet, einString
. Wenn Sie eine bessere Abstraktion für den Typ finden oder erstellen, müssen Sie Ihren gesamten Codekörper durchsuchen und dabei jede Instanz von ändern"left"
. Eine Konstante oder Variable erfordert keine Änderungen, wenn der Typ ausgearbeitet ist.Der Typ, den Sie wirklich wollen, ist spezifisch für Ihre Domain. Was hat Ihr Code mit Ihrem zu tun
left
? Vielleicht möchten Sie die x-Achse einer Textur oder eines Sprites spiegeln, die / das nach links zeigt oder sich vorwärts bewegt. In diesem Fall möchten Sie möglicherweiseleft
ein Objekt mit einer Eigenschaft oder Methode erstellen, die dieses Verhalten widerspiegelt, wobei Ihrright
Objekt das entgegengesetzte nicht gespiegelte Ergebnis aufweist. Sie können diese Logik in einem Objekt ausführen, das die Sprites oder Texturen darstellt. In diesem Fall leiden Sie erneut unter der Verwendung"left"
anstelle derleft
oben genannten Gründe.In Java (und wahrscheinlich in anderen Sprachen, die ich noch nicht kenne)
enum
ist dies eine gute Alternative, da es in Javaenum
genauso nützlich ist, wennfinal class
eine endliche Menge von Instanzen vorhanden ist. Sie können Verhalten definieren, wenn Sie diese benötigen, und Sie können problemlos zu einer offenen Klasse außerhalb der Datei wechseln, in der das deklariert wirdenum
, aber viele Sprachen sehen dasenum
als primitiven Typ oder erfordern eine spezielle Syntax. Dies führtenum
dazu, dass Code verloren geht, der nichts damit zu tun hat und möglicherweise später korrigiert werden muss. Stellen Sie sicher, dass Sie das Konzept Ihrer Sprache verstehen,enum
bevor Sie die Option in Betracht ziehen.quelle
Sie haben Ihre Sprache nicht angegeben, aber um eine generische Antwort zu geben, sollten Sie Zeichenfolgen verwenden, wenn Sie den Text tatsächlich benötigen, und nicht, um etwas darzustellen. Das Beispiel, das Sie zum Beispiel angegeben haben, wäre in Produktionssoftware einfach nicht akzeptabel.
Jede Sprache hat verschiedene grundlegende Datentypen, und Sie sollten den für die Aufgabe am besten geeigneten Datentyp verwenden. Um Ihr Beispiel zu verwenden, könnten Sie numerische Konstanten verwenden, um verschiedene Zustände darzustellen. Left könnte also einen Wert von Null haben und right wäre eins. Abgesehen von dem von Ihnen genannten Grund belegen numerische Werte weniger Speicherplatz und es ist immer schneller, Zahlen zu vergleichen, als mehrere Zeichenfolgen zu vergleichen.
Verwenden Sie, wie bereits vorgeschlagen, Aufzählungen, wenn Ihre Sprache dies zulässt. In Ihrem konkreten Beispiel ist es eindeutig die bessere Wahl.
quelle
if (uppercase(foo) == "LEFT")
Verwenden Sie einfach den Datentyp, der in Ihrer Situation sinnvoll ist.
Die Verwendung des
string
Typs als zugrunde liegende Kommunikation zwischen / innerhalb von Anwendungen ist von Natur aus kein Problem. In der Tat ist es manchmal vorzuziehen , Zeichenfolgen zu verwenden: Wenn Sie eine öffentliche API haben, kann es wünschenswert sein, dass die Werte, die in die API eingegeben und daraus entfernt werden, für den Menschen lesbar sind. Dies erleichtert es Leuten, die Ihre API verwenden, zu lernen und Fehler zu beheben.Das eigentliche Problem mit Ihrem Code besteht darin , den Wert zu wiederholen .
Mach das nicht:
Wenn Sie in einer dieser Bedingungen oder bei anderen Verwendungszwecken von "left" einen Tippfehler gemacht haben, können Sie möglicherweise keine effektive Suche auf Codebasis durchführen, da Sie sich vertippt haben!
Verwenden Sie stattdessen Code gegen eine Aufzählung oder eine Konstante. Dies hängt davon ab, welcher Datentyp in den von Ihnen verwendeten Sprachen benötigt wird.
Das heißt, Sie
LEFT
sollten in Ihrer Bewerbung einmal und nur einmal vergeben sein . Und der Rest Ihres Codes sollte diese Aufzählungen oder Konstanten nutzen:Auf diese Weise können Sie den Datentyp, den Sie später für Ihre Anweisungen verwenden, auch einfacher ändern, wenn Sie dies wünschen.
quelle
Ist es schlechte Praxis?
Wahrscheinlich ja, aber es hängt davon ab , was Sie genau tun und welche Programmiersprache Sie verwenden.
In Ihrem Beispiel können wir darauf schließen, dass es eine kleine und für immer festgelegte Menge von Werten gibt, die eine Richtung annehmen könnte. In diesem Fall hat die Verwendung einer Zeichenfolge keine Vorteile und einige eindeutige Nachteile. Für dieses Beispiel:
enum
Typ wäre vorzuziehen, wenn Ihre Programmiersprache dies unterstützt.Die Antwort kann jedoch unterschiedlich sein, wenn der Wertesatz dynamisch veränderbar ist oder sich im Laufe der Zeit weiterentwickeln muss. In den meisten Sprachen
enum
erfordert das Ändern eines Typs (z. B. zum Hinzufügen oder Entfernen eines Werts) eine vollständige Neukompilierung. (Wenn Sie beispielsweise einen Enum-Wert in Java entfernen, wird die Binärkompatibilität beeinträchtigt.) Dasselbe gilt für Konstanten für benannte Ganzzahlen.In solchen Szenarien ist möglicherweise eine andere Lösung erforderlich, und die Verwendung von Zeichenfolgen ist eine der Optionen. (Und Sie könnten String-Literale und benannte Konstanten kombinieren ... wenn das Szenario einen festen Kern mit dynamischen Erweiterungen beinhaltet.)
Wenn Sie in Java implementieren,
character.direction == "left"
ist dies aus einem anderen Grund eine schlechte Praxis. Sie sollten diese Option nicht==
zum Vergleichen von Zeichenfolgen verwenden, da sie die Objektidentitäten und nicht die Zeichenfolgengleichheit testet. (Es würde funktionieren, wenn Sie sicherstellen könnten, dass alle Instanzen der"left"
Zeichenfolge interniert wurden, dies jedoch eine Analyse der gesamten Anwendung erfordert.)quelle
String
zur Darstellung der Richtungen würde einen Unterschied von nahezu Null in Bezug auf den Arbeitsaufwand zur Durchführung der Änderungen bedeuten. Ein vernünftigerer Ansatz ist, davon auszugehen, dass sich die Anzahl der Richtungen nicht ändert, und zu erkennen, dass Sie in beiden Fällen eine Menge Arbeit zu tun hätten , wenn sich die Spielregeln so grundlegend geändert hätten.Wie vorgeschlagen, sollten Sie Enums verwenden. Allerdings ist es meiner Meinung nach nicht ausreichend, nur die Enum als Ersatz für die Strigns zu verwenden. In Ihrem speziellen Beispiel sollte die Geschwindigkeit des Spielers ein physikalischer Vektor sein:
Dieser Vektor sollte dann verwendet werden, um die Spielerposition bei jedem Tick zu aktualisieren.
Sie können dies dann mit einer Aufzählung für eine bessere Lesbarkeit kombinieren:
quelle