Liczba pojedyncza czy mnoga dla wyliczeń?


92

Czy w wyliczeniach używasz liczby pojedynczej czy mnogiej? Myślę, że najlepiej jest stosować liczbę mnogą w deklaracji

enum Weekdays
{
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday,
    Sunday
}

... ale wydaje mi się, że ma to większy sens w przypadku liczby pojedynczej przy użyciu typu, np

Weekday firstDayOfWeek = Weekday.Monday;

Czytałem gdzieś zalecenie, aby używać liczby pojedynczej z regularnymi wyliczeniami i liczby mnogiej z flagami, ale chciałbym usłyszeć więcej zalet i wad.


Powinny być wyliczeniami, a nie modułami wyliczającymi.
Reed Copsey

Odpowiedzi:


92

Tutaj jest prosto od Microsoftu:

http://msdn.microsoft.com/en-us/library/4x252001(VS.71).aspx

Użyj liczby pojedynczej dla większości typów wyliczeniowych, ale użyj nazwy liczby mnogiej dla typów wyliczeniowych, które są polami bitowymi.


1
Z uwagą, że pola bitowe powinny być mnożone.
M. Dudley,

2
Oto najnowsza wersja wytycznych MSDN dotyczących projektowania wyliczeń: msdn.microsoft.com/en-us/library/ms229058.aspx
Rodney S. Foley

Jedna książka, za którą jestem bardzo wdzięczna, to Wytyczne dotyczące projektowania ram . Zasadniczo jest napisana przez ponad 15 autorów, którzy przez lata odegrali dużą rolę w rozwoju frameworka .NET. Książka daje wgląd w ich proces myślowy podczas opracowywania interfejsów API frameworka, a czyniąc to, stajesz się na granicy jasnowidzenia, jeśli chodzi o poruszanie się po dowolnym frameworku Microsoft, zestawie narzędzi itp. Wiele, jeśli nie cały tekst można znaleźć w ich docs, ale to bardzo ładnie ją pakuje.
Krzywy

30

Jedno zalecenie pochodzi z Wytycznych dotyczących projektowania .NET Framework , strony 59-60:

Czy użycie liczby pojedynczej nazwy typu do wyliczenia, chyba że jej wartości są polami bitowymi.

public enum ConsoleColor {
  Black,
  Blue,
  Cyan,
  ...

Czy użyć liczby mnogiej nazwy typu do wyliczenia z bitowych dziedzinach jak wartości, zwany także flagi enum.

[Flags]
public enum ConsoleModifiers {
  Alt,
  Control,
  Shift
}

13

W .NET Framework, większość „normalnych” teksty stałe (np DayOfWeek) mają osobliwe nazwy i teksty stałe flagi (np StringSplitOptions, BindingFlags) mają nazwy w liczbie mnogiej. Ma to sens, ponieważ wartość wyliczenia flagi może reprezentować wiele elementów, ale w przypadku wyliczenia niebędącego flagą może reprezentować tylko jeden element.


5

Ogólnie uważam, że definicja wyliczenia jest definicją typu, a wartości wyliczenia są różnymi wartościami, jakie może mieć typ; dlatego otrzymuje pojedynczą nazwę: enum Weekday { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY }; enum CoffeeSize { SMALL, MEDIUM, LARGE };

Tak. Jeśli przeżyjesz mentalne doświadczenie implementacji wyliczeń jako klas, to fakt, że użyjesz pojedynczej nazwy dla typu, powinien ujawnić, że ma sens używanie pojedynczych nazw dla takich wyliczeń. Na przykład,

struct Weekday {};

const Weekday SUNDAY;
const Weekday MONDAY;
const Weekday TUESDAY;

...

void func (Weekday *day)
{
   if (day == &SUNDAY)
       ...
}

Kto woli liczbę mnogą w wyliczeniach, czy mógłbyś to nazwać struct Weekdays?


2

Ogólnie uważam, że definicja wyliczenia jest definicją typu, a wartości wyliczenia są różnymi wartościami, jakie może mieć typ; dlatego otrzymuje pojedynczą nazwę:

enum Weekday { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY };

enum CoffeeSize { SMALL, MEDIUM, LARGE };

2

Firma Microsoft zaleca używanie pojedynczej nazwy dla wyliczeń, chyba że używa Flagsatrybutu. Jak zaczerpnięto z książki Framework Design Guidelines, nie należy dodawać sufiksów do nazw typów wyliczeń z wyliczeniami, flagami itp., A także nie należy poprzedzać wartości wyliczenia skrótem lub akronimem, jak było to powszechne w przypadku wyliczeń w języku VB w tamtych czasach.


Ale czy właściwie jest powód, dla którego? Przedrostki interfejsów poprzedzamy literą „I”. Dlaczego nie poprzedzić wyliczeń „E”, a flagi „F”. To by było krystalicznie jasne. Zauważ, że nie lubię poprzedzać niczego innego, ale są to specjalne przypadki, takie jak interfejs, w których typ nigdy się nie zmieni.

0

Jest to subiektywne i nie ma znaczenia, czego używasz, o ile jesteś konsekwentny (osobiście używam liczby pojedynczej, ponieważ jest to przeniesienie z moich konwencji Sql)


11
To ma znaczenie. Konwencje promują czytelność i łatwość konserwacji. Konsekwencja osobista nie jest porównywalna z konsekwencją konwencjonalną.
granat

1
Trudno być konsekwentnym, jeśli każda biblioteka ma własną „subiektywną” opinię.
Paul Biggar

1
Myślę, że tak jak mówi Microsoft, używaj liczby pojedynczej, WSZYSCY powinniśmy używać liczby pojedynczej. Nie. Dopóki jesteś spójny ze swoją plualizacją i osobliwością (?), To naprawdę nie ma to znaczenia.
Jaimal Chohan

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.