Ich begann mit der Arbeit an einer großen c # -Code-Basis und fand die Verwendung einer statischen Klasse mit mehreren const ints -Feldern. Diese Klasse verhält sich genau wie ein Enum.
Ich möchte die Klasse in eine tatsächliche enum umwandeln, aber die Kräfte, die gesagt werden, nein. Der Hauptgrund, warum ich es konvertieren möchte, ist so, dass ich die enum als Datentyp anstelle von int haben könnte. Dies würde viel zur Lesbarkeit beitragen.
Gibt es einen Grund, keine enums zu verwenden und stattdessen const ints zu verwenden? Dies ist zur Zeit der Code:
%Vor%Aber ich denke, es sollte stattdessen folgendes sein:
%Vor% Ich denke, viele der Antworten hier ignorieren die Implikationen der Semantik von enums
.
Sie sollten erwägen, eine Aufzählung zu verwenden, wenn die gesamte Menge aller gültigen Werte (Ids) im Voraus bekannt ist und klein genug ist, um im Programmcode deklariert zu werden.
Sie sollten in Erwägung ziehen, ein int zu verwenden, wenn die Menge bekannter Werte eine Teilmenge aller möglichen Werte ist - und der Code muss nur diese Teilmenge kennen.
Was das Refactoring betrifft - wenn Zeit und geschäftliche Einschränkungen es zulassen, ist es eine gute Idee, den Code zu bereinigen, wenn das neue Design / die Implementierung deutliche Vorteile gegenüber der vorherigen Implementierung hat und das Risiko gut verstanden wird. In Situationen, in denen der Nutzen gering oder das Risiko hoch ist (oder beides), kann es besser sein, die Position "do no harm" einzunehmen und nicht "kontinuierlich zu verbessern" . Nur Sie sind in der Lage zu beurteilen, welcher Fall auf Ihre Situation zutrifft.
Übrigens ist ein Fall, in dem keine enums oder Konstanteneinträge sind, eine gute Idee, wenn die IDs die Bezeichner von Datensätzen in einem externen Speicher darstellen (wie a Datenbank). Es ist oft riskant, solche IDs in der Programmlogik fest zu codieren, da diese Werte in verschiedenen Umgebungen (z. B. Test, Entwicklung, Produktion usw.) tatsächlich unterschiedlich sein können. In solchen Fällen kann das Laden der Werte zur Laufzeit eine geeignetere Lösung sein.
Ihre vorgeschlagene Lösung sieht elegant aus, funktioniert jedoch nicht so, wie sie ist, da Sie keine Instanzen eines statischen Typs verwenden können. Es ist etwas kniffliger, ein Enum zu emulieren.
Es gibt ein paar mögliche Gründe dafür, enum oder const-int für die Implementierung zu wählen, obwohl ich mir für das eigentliche Beispiel, das Sie gepostet haben, nicht viele starke vorstellen kann - auf den ersten Blick scheint es ein idealer Kandidat zu sein für ein enum.
Ein paar Ideen, die mir in den Sinn kommen, sind:
Enums
const-ints
Warum sollten Sie die Implementierung in Ruhe lassen?
Wenn es nicht kaputt ist, repariere es nicht.
Ich kenne das Design des Systems, an dem Sie gerade arbeiten, nicht, aber ich vermute, dass die Felder Integer sind, die zufällig eine Reihe vordefinierter Werte haben. Das heißt, sie könnten in einem zukünftigen Zustand mehr als diese vordefinierten Werte enthalten. Während ein enum
dieses Szenario (über Casting) zulässt, bedeutet dies, dass nur die Werte gültig sind, die die Enumeration enthält.
Insgesamt ist die Änderung semantisch, aber unnötig. Unnötige Änderungen wie diese sind oft eine Fehlerquelle, zusätzlicher Testaufwand und andere Kopfschmerzen mit nur geringen Vorteilen. Ich sage, fügen Sie einen Kommentar hinzu, der ausdrückt, dass dies ein enum
sein könnte und lassen Sie es so wie es ist.
Der Grund, den ich sehe, ist, dass Sie, wenn Sie locker mit einem anderen System verbunden sein wollen, das die gleichen Konstanten verwendet, vermeiden, eng gekoppelt zu sein und den gleichen Aufzählungstyp zu teilen.
Wie in RPC-Aufrufen oder etwas ...
Tags und Links c# design-patterns enums