#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);
}
}