Der Ort der Aufzählung in der sich verändernden Welt von heute


Zum Beispiel haben wir ein Computerspiel mit verschiedenen Charakteren. Das Geschlecht des Charakters wird im Feld Geschlecht gespeichert. Sie können dieses Feld als Ganzzahl oder als Zeichenfolge definieren. Ein guter Programmierer ist jedoch bestrebt, den falschen Status von Objekten unaussprechlich zu machen, und wird daher höchstwahrscheinlich eine Aufzählung für die Etage beginnen. Jetzt einen Charakter mit dem falschen Geschlecht zu machen ist einfach unmöglich!


Und im Spiel gibt es eine Datenbank, in der alle Spieler gespeichert sind, und dort müssen Sie auch aufzeichnen, welches Geschlecht sie haben. Es wäre schön zu verhindern, dass ein Charakter mit einem falschen Geschlecht in die Datenbank aufgenommen wird, da damit nicht nur der Code funktioniert, in dem nichts außer Enum für die Geschlechter, sondern auch für lebende Menschen vorgesehen ist. Und lebende Menschen bemühen sich, wie Sie wissen, in die Datenbank das einzutragen, was dort nicht eingegeben werden muss.


Glücklicherweise ist es in vielen DBMS, insbesondere in solchen Fällen, auch möglich, Spalten des Aufzählungstyps zu erstellen, wodurch der Wertebereich eingeschränkt wird, den die Daten in einer solchen Spalte haben können. Was nutzt ein erfahrener Entwickler, der nicht möchte, dass sein Projekt etwas ist, das nichts für Feng Shui ist?


Auf dem Client ist der Programmierer auch kein Dummkopf und weiß auch, dass falsche Zustände unaussprechlich sein müssen, und dafür muss das Geschlecht des Zeichens aufgezählt werden.


Perfekt!


Wenn Sie jedoch genau hinschauen, können Sie einen kleinen Fehler finden, der letztendlich zu Problemen führt. Das Feld, in dem der Boden gespeichert ist, heißt nicht Geschlecht, sondern Geschlecht. Das bedeutet, dass bereits ein Spieledesigner dafür ausgewählt ist. Früher oder später wird er feststellen, dass es im Gegensatz zu den Geschlechtern wesentlich mehr als zwei Geschlechter gibt, und er wird das Geschlecht GENERIC_TEEN hinzufügen wollen. Dann wird jeder dumm.


Der Client muss ständig aktualisiert werden


Die ersten, die fallen, sind die Leute, die den Client-Code geschrieben haben, weil bei jedem Niesen falsche Werte des Gender-Parameters vom Server kommen. Und wenn ein Charakter mit einem Geschlecht vom Server kommt, über dessen Existenz der Client nichts weiß, wird das Spiel, wie es der Programmierer auf dem Client wollte, einfach nicht gestartet. Jetzt, mit dem Aufkommen neuer Geschlechter, ist es notwendig, neue Versionen von Clients zu veröffentlichen und erzwungene Updates zu starten, die wir alle so lieben.


Auf dem Enum-Server ist dies eine gute Sache, denn wenn dort ein unbekannter Wert gefunden wird, ist dies eindeutig ein Fehler, der gefunden und behoben werden muss. Auf dem Client ist das Auftreten eines unbekannten Werts jedoch eine normale Situation, die regelmäßig auf veralteten Versionen des Clients auftritt da ist enum böse, das so schnell wie möglich ausgerottet und vernichtet werden muss.


Neuer Code kann nicht mit der alten Datenbank verwendet werden


Außerdem sollte nach den Empfehlungen der besten Hundezüchter der neue Code mit dem alten Datenschema funktionieren können, und hier stellt sich heraus, dass das gesamte System nur dann auseinanderfallen kann, wenn dem Code ein neues Geschlecht hinzugefügt wird.


Daher stört uns die Aufzählung in der Datenbank, und in diesem Fall müssen wir in den Feldern Zeichenfolgen oder Ints oder was auch immer speichern, in die Sie bei Bedarf einen Wert schreiben können, der nicht im Voraus bereitgestellt wird.


Und jemand wird sagen: Okay, okay, es schadet dem Enum-Client und in der Datenbank stört es mehr als es hilft, aber Enum ist im Server-Code von großem Vorteil. Er wird nicht anbieten, Enum aus dem Code auf dem Server zu entfernen? Wird sein!


Alter Code kann nicht mit der neuen Datenbank verwendet werden


Jetzt ist der Programmierer ist es empfehlenswert, nicht nur um den Code zu schreiben, so dass es richtig mit der alten Datenbank arbeitet, sondern auch Datenschema zu entwickeln, so dass ein wenig von Legacy-Code auch richtig es funktionieren könnte.


Und wenn Sie enum auf dem Server für das Geschlecht verwenden, fällt alles wieder auseinander, erst wenn sich herausstellt, dass etwas mit dem neuen Code nicht stimmt und Sie sofort alles auf die vorherige Version zurücksetzen müssen und die neuen Geschlechter bereits in die Datenbank eingegangen sind.


Und deshalb gehen die Aufzählungen vom Servercode mit dem Schritt eines gemessenen Soldaten irgendwo in Richtung des nächsten Waldes, um von dort niemals zurückzukehren, denn alles, was das System zur falschen Zeit zerstören kann, ist böse und das Böse hat keinen Platz in unserem gemütlichen Code.


Also vielleicht auf Enum hämmern und immer Strings verwenden?


Kurz gesagt, wie Winnie the Pooh sagen würde - das ist eine Art falscher Enamie, und sie provozieren den Programmierer, den falschen Code zu schreiben! In enum, müssen Sie wirklich unerschütterliche und grundlegende Dinge, die sich im Laufe der Jahre nicht geändert haben, und keine Geschlechter, die jede Veröffentlichung hinzufügen und verschwinden lassen! Jede Aufgabe hat ein eigenes Werkzeug, und enum ist nicht das Werkzeug, mit dem Sie Werte speichern müssen, deren mögliches Spektrum ständig erweitert wird.


Wenn eine Variable nur einige zuvor bekannte Werte annehmen kann und alles, was nicht in diesen Werten enthalten ist, zu einem Fehler führen sollte, ist die Verwendung von Enum eine gute Idee. Wenn dies jedoch nicht der Fall ist, verwenden Sie, wenn die unerwarteten Werte regelmäßig in die Variable fallen enum ist gleichbedeutend damit, sich in den Fuß zu schießen, und es ist besser, dies nicht zu tun, es sei denn, Sie sind natürlich ein Masochist.


Diese besondere Situation ist interessant, da nichts die Hinzufügung neuer Werte in die Aufzählung ankündigte, ganz zu schweigen von der Tatsache, dass regelmäßig neue Werte erscheinen werden. Woher wussten wir überhaupt, dass es mehr als zwei Geschlechter geben würde?


Daher ist nach dem KISS-Prinzip die Aufzählung in der ersten Stufe eine gute und richtige Wahl. Ein erfahrener Programmierer führt eine Aufzählung durch und korrigiert, dass Sie, wenn ein zusätzlicher Wert angezeigt wird, sofort die Ereignisse ausführen müssen, die erforderlich sind, damit die Aufzählung aus dem Code verschwindet.


Leider zeigt die Praxis, dass in der Realität jemand anderes daran beteiligt sein wird, ein neues Geschlecht hinzuzufügen, und ohne darüber nachzudenken, wird er der Aufzählung eine neue Bedeutung hinzufügen, was sich beruhigen wird. Im Zweifelsfall ist es also besser, eine einfache Regel zu befolgen: Sie wird an einem anderen Ort gespeichert, mit Ausnahme des Codes. Das bedeutet nicht, dass eine Aufzählung vorliegt, und genau darum geht es.


Die Aufzählung sollte also überhaupt nicht im geschlechtsspezifischen Code enthalten sein?


Trotz der Tatsache, dass ich gerade sagte, kann die Aufzählung im Code immer noch sehr nützlich sein, auch wenn sie Werte enthält, die in die Datenbank fallen. Sie müssen nicht nur verwendet werden, um die aus der Datenbank abgerufenen Werte zu speichern, sondern auch, um die Daten aus der Datenbank mit dem gewünschten Wert zu vergleichen. Wenn ein Programmierer beispielsweise schreiben möchte, dass das Geschlecht des Zeichens GENERIC_TEEN ist und er keinen Alkohol in sein Inventar aufnehmen kann, können Sie eine Aufzählung Gender mit der Wertemethode erstellen, die eine Zeichenfolge zurückgibt, und einen Code schreiben, der prüft, ob das Zeichen ein Feld gender und Gender.GENERIC_TEEN enthält .value () und das ist gut, weil es dem Programmierer nicht erlaubt, einen Fehler im Statuswert zu machen.


Code muss sich weiterentwickeln


Entscheidungen, die uns irgendwann gute Dienste geleistet haben, werden mit der Zeit möglicherweise unangenehm. Und Sie müssen sicherstellen, dass der Code den aktuellen Stand des Projekts widerspiegelt, und nicht eine Reihe von Krücken, mit denen die Lösung, die vor ein paar Jahren am Knie erstellt wurde, bis zum "Hier und Jetzt" reicht. Andernfalls wird es eine unerschöpfliche Quelle von Fakap und Lulz für alle, die in irgendeiner Weise mit dem Projekt verbunden sind, ob Entwickler, Tester oder Direktverbraucher.

Source: https://habr.com/ru/post/de476650/


All Articles