2011-11-01 6 views
15

Le linee guida sono chiare per le enumerazioni ...Convenzione di denominazione per la classe di costanti in C#: plurale o singolare?

utilizzati un nome singolare per un'enumerazione, a meno che i suoi valori sono campi di bit.

(Fonte: http://msdn.microsoft.com/en-us/library/ms229040.aspx)

... ma non così chiaro per una classe di costanti (o di sola lettura statiche campi/propertes). Ad esempio, il nome di questa classe dovrebbe essere singolare o plurale?

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

Considerate questo, se si vuole creare una classe per contenere i metodi di estensione, vuoi dare un nome singolare o plurale? Pensa anche agli altri metodi che semplicemente contengono riferimenti a valori/istanze specifici. ad esempio "Colori". –

+4

Per quello che vale, Windows sembra utilizzare il plurale: [System.Windows.Media.Brushes] (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 non sempre però; per esempio 'System.Drawing.Color' prende l'approccio opposto. - A volte sembra che le classi WPF facciano cose strane con i nomi. – BrainSlugs83

risposta

22

Vorrei usare il plurale: Tokens. Ciò implica che la classe statica stia funzionando come una raccolta di elementi di qualche tipo (i cui tipi di runtime non sono quelli della classe).

D'altra parte, i campi di un enumerazione sono istanze del tipo di enumerazione. Ad esempio, TypeCode.Stringè a TypeCode. Sarebbe strano dire che TypeCodes.String è un TypeCodes.

Tuttavia, nel vostro Tokens esempio, utilizzando il singolare ci dà Token.Foo, che è una pedina, ma non è un Token (si tratta di un string).

(o, se si utilizza il nome della classe plurale, Tokens.Foo è un string, non un Tokens Ack.!)

+1

+1. Mi piace il tuo ragionamento. – devuxer

+1

+1. Mi piace lo stesso approccio comune alla situazione. Quando si nomina qualcosa, mi assicuro che sia pronunciabile e utilizzabile nella conversazione, poiché ci sono buone probabilità che, in un punto o in un altro, potrebbe essere necessario comunicarlo a un altro sviluppatore. Mentre ci sono "norme" in vigore nel modo in cui denominiamo le cose, ci sono sempre circostanze eccezionali che possono dettare una deviazione dalla norma. –

1

Non ho uno standard di denominazione ufficiale da collegare, ma posso dirvi cosa farei.

Vorrei utilizzare il nome al plurale: Segni

+0

Devo notare che spesso infrango anche le linee guida di denominazione per enumerazioni e le nominiamo al plurale. Mi sembra più naturale. –

6

Dal momento che entrambi sono utilizzati essenzialmente nello stesso modo, e sono concettualmente la stessa cosa, io consiglierei solo seguendo le linee guida enum.

+1

+1 per il nome singolare. IMHO plurale ha senso quando si scrive la classe statica (questo è un contenitore con Token Foo, Bar, ecc.), Mentre singolare ha senso quando si usa la classe statica (fare qualcosa con Token Foo). Poiché il secondo caso (utilizzando un token) deve superare di gran lunga il primo caso (definizione di token), il singolo è più appropriato. –

0

Vorrei utilizzare il nome al plurale: Tokens

Tuttavia si può prendere in considerazione la creazione di un Token classe per mantenere il valore const.

Questo sarebbe simile a System.Windows.Media.Colors dove ad es. Colors.Blue restituisce un'istanza 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); 
    } 
}