Соглашение об именовании для класса констант в C #: множественное или единственное число?

#c# #coding-style #naming-conventions

#c# #стиль кодирования #соглашения об именовании

Вопрос:

Рекомендации понятны для перечислений…

Используйте единственное имя для перечисления, если его значения не являются битовыми полями.

(Источник: http://msdn.microsoft.com/en-us/library/ms229040.aspx )

… но не так ясно для класса констант (или статических полей / свойств, доступных только для чтения). Например, должно ли имя этого класса быть единственным или множественным?

 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";
}
  

Комментарии:

1. Подумайте об этом, если бы вы создавали класс для хранения методов расширения, вы бы дали ему имя в единственном или множественном числе? Также подумайте о других методах, которые просто содержат ссылки на определенные значения / экземпляры. например, Colors .

2. Как бы то ни было, сама Windows, похоже, использует множественное число: System . Windows. Медиафайлы. Кисти , система. Windows. Медиафайлы. Цвет .

3. @RaymondChen, хотя и не всегда; например System.Drawing.Color , использует противоположный подход. — кажется, иногда классы WPF делают странные вещи с именованием.

4. @RaymondChen А также рассмотрим систему. Windows. Медиафайлы. DashStyle против Система. Windows. Медиафайлы. DashStyles . Здесь последнее является предопределенным набором первого.

Ответ №1:

Я бы использовал множественное число: Tokens . Это означает, что статический класс служит в качестве набора элементов некоторого рода (чьи типы времени выполнения не являются типами класса).

С другой стороны, поля перечисления являются экземплярами типа перечисления. Например, TypeCode.String является TypeCode . Было бы странно сказать, что TypeCodes.String это a TypeCodes .

Однако в вашем Tokens примере использование единственного числа дает нам Token.Foo , который является токеном, но это не a Token (это a string ).

(Или, если вы используете имя класса во множественном числе, Tokens.Foo это a string , а не a Tokens . Подтверждение!)

Комментарии:

1. 1. Мне нравится тот же здравый смысловой подход к ситуации. Когда я называю что-либо, я удостоверяюсь, что это произносится и может использоваться в разговоре, поскольку есть большая вероятность, что в тот или иной момент это может потребоваться другому разработчику. Хотя существуют «стандарты» в том, как мы называем вещи, всегда есть исключительные обстоятельства, которые могут диктовать отход от нормы.

Ответ №2:

Поскольку оба они используются по существу одинаково и концептуально являются одним и тем же, я бы рекомендовал просто следовать рекомендациям enum .

Комментарии:

1. 1 для имени в единственном числе. ИМХО множественное число имеет смысл при написании статического класса (это контейнер с токенами Foo, Bar и т. Д.), Тогда как единственное число имеет смысл при использовании статического класса (сделайте что-нибудь с токеном Foo).). Поскольку 2-й случай (использование токена) должен намного перевешивать 1-й случай (определение токенов), единственное число является более подходящим.

Ответ №3:

У меня нет какого-либо официального стандарта именования для ссылки, но я могу сказать вам, что я бы сделал.

Я бы использовал имя множественного числа: токены

Комментарии:

1. Я должен отметить, что я часто нарушаю правила именования для перечислений и называю их множественным числом. Для меня это просто более естественно.

Ответ №4:

Я бы использовал имя во множественном числе: Tokens

Однако вы можете рассмотреть возможность создания Token класса для хранения значения const .

Это было бы похоже на System.Windows.Media.Colors то, где, например Colors.Blue , возвращает 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);
    }
}