Поделиться через


Имена классов, структур и интерфейсов

Замечание

Это содержимое перепечатывается разрешением Pearson Education, Inc. из руководства по проектированию платформы: соглашения, идиомы и шаблоны для повторно используемых библиотек .NET, 2-го выпуска. Этот выпуск был опубликован в 2008 году, и книга с тех пор была полностью пересмотрена в третьем выпуске. Некоторые сведения на этой странице могут быть устаревшими.

Приведенные ниже рекомендации по именованию применяются к именованию общих типов.

✔️ Давайте называть классы и структуры существительными или фразами на основе существительных, используя PascalCasing.

Это отличает имена типов от методов, которые именуются глагольными конструкциями.

✔️ Именуйте интерфейсы прилагательными группами или, иногда, существительными или группами существительных.

Существительные и именные фразы должны использоваться редко, так как они могут указывать на то, что тип должен быть абстрактным классом, а не интерфейсом.

❌ НЕ присваивайте имена классов префиксу (например, "C").

✔️ Рассмотрите возможность завершения имени производных классов с именем базового класса.

Это очень удобочитаемо и четко объясняет связь. Некоторые примеры этого в коде: ArgumentOutOfRangeException, который является разновидностью Exception, и SerializableAttribute, который является разновидностью Attribute. Однако важно проявлять здравый смысл при применении этого руководства, например, класс Button является типом события Control, хотя Control не встречается в его названии.

✔️ ДОБАВЛЯЙТЕ префикс букву I к именам интерфейсов, чтобы указать, что тип является интерфейсом.

Например, IComponent (описательное существительное), ICustomAttributeProvider (фраза существительного) и IPersistable (прилагательная) являются соответствующими именами интерфейсов. Как и в случае с другими именами типов, избегайте аббревиаций.

✔️ Убедитесь, что имена отличаются только префиксом "I" в имени интерфейса при определении пары интерфейсов класса, где класс является стандартной реализацией интерфейса.

Имена параметров универсального типа

Дженерики были добавлены в .NET Framework 2.0. Эта функция представила новый тип идентификатора, называемого параметром типа.

✔️ Давайте давать параметрам универсального типа описательные имена, если только однобуквенные имена не являются полностью самоочевидными, а описательное имя не добавляет ценности.

✔️ Рекомендуется использовать T в качестве имени параметра типа для типов с одним параметром типа однобуквенный.

public int IComparer<T> { ... }
public delegate bool Predicate<T>(T item);
public struct Nullable<T> where T:struct { ... }

✔️ Используйте T в качестве префикса для описательных имен параметров.

public interface ISessionChannel<TSession> where TSession : ISession {
    TSession Session { get; }
}

✔️ РЕКОМЕНДУЕТСЯ указывать ограничения, помещенные в параметр типа в имени параметра.

Например, параметр, ограниченный ISession, может назваться TSession.

Имена распространенных типов

✔️ Следуйте инструкциям, описанным в следующей таблице, при именовании типов, производных от или реализующих определенные типы .NET Framework.

Базовый тип Руководство по производным типам и типам реализации
System.Attribute ✔️ Добавьте суффикс "Attribute" в имена пользовательских классов атрибутов.
System.Delegate ✔️ Добавьте суффикс EventHandler в имена делегатов, которые используются в событиях.

✔️ Добавьте суффикс "Callback" к именам делегатов, за исключением тех, которые используются в качестве обработчиков событий.

❌ Не добавляйте суффикс "Делегат" для делегата.
System.EventArgs ✔️ Добавьте суффикс EventArgs.
System.Enum ❌ НЕ наследуйтесь от этого класса; вместо этого используйте ключевое слово, поддерживаемое языком; например, в C# используйте ключевое enum слово.

❌ НЕ добавляйте суффикс "Enum" или "Flag".
System.Exception ✔️ Добавьте суффикс "Исключение".
IDictionary
IDictionary<TKey,TValue>
✔️ Добавьте суффикс "Словарь". Обратите внимание, что IDictionary это определенный тип коллекции, но это руководство имеет приоритет над более общим руководством по коллекциям, приведенным ниже.
IEnumerable
ICollection
IList
IEnumerable<T>
ICollection<T>
IList<T>
✔️ Добавьте суффикс "Коллекция".
System.IO.Stream ✔️ Добавьте суффикс Stream.
CodeAccessPermission IPermission ✔️ Добавьте суффикс "Разрешение".

Именование перечислений

Имена типов перечислений (также называемых перечислениями) в целом должны соответствовать стандартным правилам именования типов (PascalCasing и т. д.). Однако существуют дополнительные рекомендации, которые применяются специально к перечислениям.

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

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

❌ Не используйте суффикс "Enum" в именах типов перечисления.

❌ Не используйте суффиксы "Flag" или "Flags" в именах типов перечисления.

❌ Не используйте префикс для имен значений перечисления (например, "ad" для перечислений ADO, RTF для перечислений с форматированным текстом и т. д.).

© Часть 2005, 2009 Корпорация Майкрософт. Все права защищены.

Перепечатан с разрешения Pearson Education, Inc. из Руководство по проектированию: Соглашения, идиомы и шаблоны для повторного использования библиотек .NET, 2-е издание Кшиштоф Чвалина и Брэд Абрамс, опубликованное 22 октября 2008 года Addison-Wesley Профессиональный в рамках серии разработки Microsoft Windows.

См. также