2012-09-14 13 views
5

Według sekcji Dobrych Praktyk dokumentacji MSDN dla klasy System.Enum:Dlaczego znaczniki pozycji, takie jak pierwsza lub ostatnia, w wyliczeniu są uważane za złe praktyki?

nie definiują wartość wyliczenia wyłącznie w celu odzwierciedlenia stanu samego wyliczenia. Na przykład nie definiuj wyliczonej stałej, która po prostu oznacza koniec wyliczenia. Jeśli chcesz określić ostatnią wartość wyliczenia, sprawdź tę wartość jawnie. Ponadto można wykonać sprawdzenie zakresu dla pierwszej i ostatniej wyliczonej stałej, jeśli wszystkie wartości w tym zakresie są prawidłowe.

Jeśli dobrze rozumiem, nie powinniśmy deklarować wyliczenia w następujący sposób.

public enum DrawOrder 
{ 
    VeryBottom = 0, 
    Bottom = 1, 
    Middle = 2, 
    Top = 3, 
    Lowest = VeryBottom, //marks a position in the enum 
    Highest = Top, //marks a position in the enum 
} 

Dlaczego jest to uważane za złą praktykę?

+1

Domyślam się, że jest to praktyka przeniesiona z C/C++. W świecie .NET mamy 'Enum.IsDefined',' Enum.GetValues', itd., Więc hack nie ma większego sensu. –

Odpowiedz

2

Ponieważ wartości te mogą się zmieniać z czasem. Załóżmy, że ustawiłeś właściwość na (używając twojego przykładu) DrawOrder.Highest i przechowujesz ją w swojej bazie danych/dokumencie/innym umyśle danych.

Czas mija.

Zmiany w kodzie.

Wyliczenie DrawOrder uzyskało kilka dodatkowych wartości, a wartość w utrwalonych danych nie jest już równa DrawOrder.Highest. Jest to równoznaczne z mapowaniem w czasie przechowywania danych.

Czy sądzisz, że ta sytuacja może powodować problemy?

+0

Najbardziej lubię to wyjaśnienie, mimo że wszystkie odpowiedzi są podobne. Dzięki! – Osiris

2

Nie jestem pewien, czy zgadzam się, że to zła praktyka; to zależy.

Kod Steve'a McConnella Kompletny używa tej konstrukcji. (Ta książka zaczyna pokazywać swój wiek z języków, którego używa, więc ta technika może być dobry praktyka potem.)

Minusem jest to, że nie ma dodatkową rzeczą, aby pamiętać, aby zrobić jeśli zaktualizować listę wyliczenia : zaktualizuj wartość Highest i/lub Lowest, jeśli to konieczne. Jeśli zapomnisz, wprowadzisz błędy.

Plusem jest to, że kod, który piszesz dla pętli, jest szybszy i samokonuje.

2

Ponieważ jeśli dodasz VeryTop = 4 do wyliczenia, musisz pamiętać o aktualizacji Highest.

Jeśli tego nie zrobisz, rozpęta się piekło. Zaskakująco łatwo o tym zapomnieć po upływie pewnego czasu (kilka miesięcy).

1

Powiedziałbym, że to tylko zły pomysł, jeśli utrzymujesz Enum i jest szansa, że ​​enum może się zmienić. Jeśli nie będziesz go utrzymywał lub nie będzie szansy na zmianę enum, to prawdopodobnie w większości przypadków będzie to w porządku. Ale cały punkt znacznika jest taki, że wartość może się zmienić ... więc nie ma to żadnego sensu.

Należy jednak zachować ostrożność podczas używania takiej konstrukcji, aby używać wyliczenia, które faktycznie zamierzają. Jeśli masz na myśli Top, ale zamiast tego użyj Najwyższego, a potem dodaj SuperTop i zmień Najwyższą na tę, to pierwotna intencja może być teraz błędem.

Wylicznik Marker powinien być używany tylko wtedy, gdy chcesz użyć wartości najwyższej lub najniższej, niezależnie od jej wartości.

Tak wiele osób uważa, że ​​jest to zła praktyka, ponieważ korzystanie z markera jest bardzo łatwe, gdy zamierzamy osiągnąć określoną wartość.