2011-11-01 10 views
15

Wytyczne są jasne dla wyliczeń ...Konwencja nazewnictwa dla klasy stałych w języku C#: liczba mnoga lub liczba pojedyncza?

używaj osobliwą nazwę wyliczenie, chyba że jej wartości są polami bitowymi.

(Źródło: http://msdn.microsoft.com/en-us/library/ms229040.aspx)

... ale nie tak oczywiste dla klasy stałych (lub tylko do odczytu statycznych pól/propertes). Na przykład, czy nazwa tej klasy powinna być pojedyncza czy mnoga?

public static class Token // or Tokens? 
{ 
    public const string Foo = "Foo"; 
    public const string Bar = "Bar"; 
    public const string Doo = "Doo"; 
    public const string Hicky = "Hicky"; 
} 
+0

Rozważ to, jeśli tworzysz klasę do przechowywania metod rozszerzeń, czy nadasz jej liczbę pojedynczą lub mnogą? Pomyśl także o innych metodach, które po prostu zawierają odniesienia do konkretnych wartości/instancji. np. "Kolory". –

+4

O ile warto, sam system Windows wydaje się używać liczby mnogiej: [System.Windows.Media.Broshes] (http://msdn.microsoft.com/en-us/library/system.windows.media.brushes.aspx) , [System.Windows.Media.Colors] (http://msdn.microsoft.com/en-us/library/system.windows.media.colors.aspx). –

+1

@RaymondChen nie zawsze jednak; na przykład 'System.Drawing.Color' przyjmuje odwrotne podejście. - Wydaje się, że czasami klasy WPF robią dziwne rzeczy z nazywaniem. – BrainSlugs83

Odpowiedz

22

Chciałbym użyć liczby mnogiej: Tokens. Oznacza to, że klasa statyczna służy jako zbiór elementów pewnego rodzaju (których typy runtime nie należą do klasy).

Z drugiej strony pola wyliczeniowe są instancjami typu wyliczeniowego. Na przykład: TypeCode.Stringto a TypeCode. Byłoby dziwnym powiedzieć, że jest to TypeCodes.String.

Jednak w swoim przykładzie Tokens, używając liczby pojedynczej daje nam Token.Foo, który jest token, ale to nie jest Token (jest to string).

(Lub, jeśli używasz liczby mnogiej nazwę klasy, Tokens.Foo jest string, a nie Tokens Ack.!)

+1

+1. Podoba mi się twoje rozumowanie. – devuxer

+1

+1. Podoba mi się to samo sensowne podejście do sytuacji. Gdy wymieniam cokolwiek, upewniam się, że jest ono wymowne i użyteczne w rozmowie, ponieważ istnieje duża szansa, że ​​w takim czy innym momencie może być konieczne przekazanie komuś innemu programisty. Chociaż istnieją "standardy" w tym, jak nazywamy rzeczy, zawsze są wyjątkowe okoliczności, które mogą dyktować odejście od normy. –

1

Nie mam oficjalnego standardu nazewnictwa, do którego można się połączyć, ale mogę powiedzieć, co bym zrobił.

chciałbym używać nazwy w liczbie mnogiej: Żetony

+0

Należy zauważyć, że często łamam wytyczne dotyczące nazewnictwa dla wyrażeń również i nazywam je liczbą mnogą. Po prostu wydaje mi się to bardziej naturalne. –

6

Ponieważ oba są używane zasadniczo w ten sam sposób i są koncepcyjnie samo, polecam tylko zgodnie z wytycznymi enum.

+1

+1 dla liczby pojedynczej. IMHO w liczbie mnogiej ma sens przy pisaniu klasy statycznej (jest to kontener z Tokens Foo, Bar, itp.), Podczas gdy pojedyncza ma sens w przypadku korzystania z klasy statycznej (Zrób coś z Tokenem Foo). Ponieważ drugi przypadek (przy użyciu tokena) powinien znacznie przewyższać 1 przypadek (określając żetony), bardziej odpowiedni jest liczba pojedyncza. –

0

chciałbym używać nazwy w liczbie mnogiej: Tokens

Jednakże można rozważyć utworzenie Token klasa do przechowywania wartości const.

Byłoby podobne do System.Windows.Media.Colors, gdzie np. Colors.Blue zwraca instancję System.Windows.Media.Color.

public class Token 
{ 
    public Token(string value) 
    { 
     Value = value; 
    } 

    public string Value { get; private set; } 

    public static implicit operator string(Token token) 
    { 
     return token == null ? null : token.Value; 
    } 

    public bool Equals(string value) 
    { 
     return String.Equals(Value, value); 
    } 

    public override bool Equals(object obj) 
    { 
     var other = obj as Token; 
     if (other == null) 
     { 
      return false; 
     } 

     return Equals(other.Value); 
    } 

    public override int GetHashCode() 
    { 
     return Value.GetHashCode(); 
    } 

    public override string ToString() 
    { 
     return Value; 
    } 
} 

public static class Tokens 
{ 
    public static readonly Token Foo = new Token("Foo"); 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     // You can use it as if they were string constants. 
     string token = Tokens.Foo; 
     bool areEquals = String.Equals(token, Tokens.Foo); 
    } 
} 
Powiązane problemy