2009-01-29 20 views
13

So wurde ich zu einem bestimmten Code suchen, der in und ich geprüft habe alle rätseln:Sollen statische Variablen durch Enums ersetzt werden?

// Amount of days before cancellation can't be done 
enum Cancellation { Limit = 2 }; 

den Mann zu fragen, wer sie eingecheckt er argumentiert, dass es viel besser ist, Aufzählungen zu verwenden anstelle von statischen Variablen, bettern als dies:

private static int CANCELLATION_LIMIT = 2; 

Also begannen wir zu streiten. Mein Argument war, dass er enum als Möglichkeit zum Speichern von Werten verwendete (es würde brechen, wenn es zwei enum-Symbole mit dem gleichen Wert gäbe). Er argumentierte, es sei ein Antipattern, statische Variablen in einer Klasse zu haben.

Meine Frage ist, welche Best Practice sollte für beide verwendet werden?

+0

"Wenn zwei Enumsymbole mit dem gleichen Wert vorhanden sind, wird es unterbrochen" - nein, das wird nicht möglich - Sie können mehrere Enums in derselben Definition mit demselben Wert haben. Wie auch immer, es sollte "const" sein. –

Antwort

8

Aufzählungen eingegeben werden.

Das heißt, wenn Sie eine Methode haben, bei der Sie beispielsweise einen bestimmten "Zustand" an eine Methode übergeben müssen, können Sie nur "gültige" Argumente übergeben. Zum Beispiel:

enum OrderState 
{ 
    pending = 1, 
    shipped = 2 
} 

public IList<Order> GetOrdersInState(OrderState) 
{ 
} 

Dies ist ein gutes Beispiel -imho- Aufzählungen zu verwenden. Wenn OrderState ein Int ist, für den Sie 2 Konstanten erstellen, haben Sie keine Einschränkungen und können ungültige Werte übergeben. Der Compiler wird sich nicht beschweren.

Wie auch immer, der Fall, den Sie ansprechen, ich denke, Enums verwenden ist keine gültige Lösung. Es ist ein Missbrauch der Verwendung eines Int, und ein Const Int sollte verwendet werden.

Enums sind gut, aber sie sollten verwendet werden, wo sie verwendet werden müssen. Sie sind nicht das bevorzugte Werkzeug in jeder Situation. Eine const oder statische Var ist in diesem Fall kein Antipattern.

+0

Und Refactoring ist nicht so einfach mit enums, zum Beispiel wenn Sie wählen um die Static-Methode zu einer Instanz zu machen, da diese Abbruchgrenze abhängig von einem DB-Eintrag sein muss ... – Llyle

+0

Beachten Sie, dass es möglich ist, einen ungültigen Enumerationswert zu übergeben: 'GetOrdersInState ((OrderState) 99); Ein Enum-Wert von 99 wird übergeben. Der Compiler und die Runtime können dies gerne für Sie tun, wenn Sie danach fragen. –

0

Ich denke, dass Sie Enums verwenden sollten, wenn Sie eine Reihe von Werten direkt verbunden haben.

So etwas wie: enum Status {Offen = 1, Geschlossen = 2, Warten = 3};

Für alles andere, würde ich sagen, statische Variablen sind der Weg zu gehen.

0

Ich weiß nicht, dass es ein Anti-Pattern ist, statische Variablen in einer Klasse (?) Zu haben. Die Color-Klasse im .NET-Framework enthält beispielsweise viele statische öffentliche Variablen, z. B. Color.Red. Aus dieser Perspektive würde ich Ihnen zustimmen.

Allerdings kann es einen Kompromiss geben: private const verwenden CANCELLATION_LIMIT = 2; und beide von euch sollten glücklich sein. Für ihn wird es keine globale Variable für die Klasse (?) Geben, da die Constants durch den Compiler ersetzt werden, und Sie erhalten einen einzigen Punkt der Änderung mit einem eindeutigen Namen.

12

zurück "Ist es logisch eine Reihe von Werten"? "Enum ist angemessen": "Static const ist in Ordnung"

(ich ein großer Fan der logisch konsistent bin)

+0

Absolut zustimmen, 100%. –

+0

in C# Ich glaube nicht, dass Sie eine statische Konstante haben können. es ist entweder const, oder statisch readonly :) – Svish

+1

in der Tat sind alle Constants implizit statisch, und explizite Spezifikation ist verboten (ich würde mit einem statischen readonly though gut) – annakata

2

Nein, wie definieren Sie statische String-Variablen oder Dezimalwerte in enum?

1

Ich glaube nicht, dass CANELLATION_LIMIT klingt wie eine Enum, die in der Regel eine Reihe von Möglichkeiten ist.

Für etwas anderes, wenn es ein const war, dann vielleicht ... aber derzeit ist es ein veränderbares Feld?

Beachten Sie, dass Aufzählungen beschränkt sind auf ganzzahlige-basierte Typen, so kann es nicht für float, string usw.

+0

(dies hat einen Downvote ... Ich würde gerne wissen, warum ...) –

1

Für unveränderliche Werte verwendet werden soll eindeutig sein, Aufzählungen sind der Weg zu gehen. Die Frage ist einfach: Soll das Objekt den Wert selbst statisch speichern? In vielen Fällen, etwa bei der Beschreibung von Fehlern oder Handlungen, lautet die Antwort nein. Denken Sie daran, enum s wurde als Ersatz für #define geboren: es verbindet typische Werte mit Bezeichnern und es bietet einen Typ, es heißt eigentlich nicht "diese Konstante hier speichern".

Ich nehme an, Sie wollen eigentlich nichts speichern, aber solche typischen Werte liefern. statische Konstanten Mitglieder sind nur nützlich, wenn Sie sie als solche verwenden möchten, z. B. wenn Sie sie anhand einer Methode übergeben müssen.

+0

Const gibt auch Namen für diese magische Zahlen, um mehr beschreibenden Code zu machen, nicht nur für die Wiederverwendung. "müssen sie mit Bezug auf eine Methode übergeben". Nein, konstante Primitive werden nach Wert und nicht nach Referenz übergeben. – Llyle

+0

"statische const Variablen" - ist das nicht ein Oxymoron? –

+0

Sie können eine Konstante durch Verweis oder Adresse sehr gut übergeben. Etwas wie in: pass_me_an_object_by_addr (& my_const_object); –

Verwandte Themen