Skip to content

Code Style Convention

Anastasiia Horban edited this page Oct 30, 2017 · 2 revisions

Имена

Обязательно:

  1. Используйте правильные английские слова для идентификаторов, названий классов, методов. Давайте имена в соответствии с назначением идентификатора, а не типом. Не сокращайте слова (кроме общеизвестных сокращений типа UI)

  2. Используйте Pascal и Camel стили для именования:

IDENTIFIER CASE EXAMPLE
Class Pascal AppDomain
Enum type Pascal ErrorLevel
Enum values Pascal FatalError
Event Pascal ValueChange
Exception class Pascal WebException
Field camel listItem
Const Field camel maximumItems
Read-only Static Field camel redValue
Interface Pascal IDisposable
Method Pascal ToString
Namespace Pascal System.Drawing
Parameter camel typeName
Property Pascal BackColor

С аббревиатурами:

CAMEL CASING PASCAL CASING
newImage NewImage
uiEntry UIEntry
pmsMR PmsMR
  1. Не добавляйте префиксы, идентифицирующие тип, не используйте венгерскую нотацию. Не добавляйте префиксы к полям – данным классов и структур.

  2. Не используйте идентификаторы, отличающиеся лишь регистром символов (например MySomething и MySomeThing)

  3. Не используйте подчеркивания _ в именах

  4. Интерфейсы должны начинаться с префикса I. Используйте существительное, словосочетание с существительным или прилагательное (IComponent, ICustomAttributeProvider, IPersistable)

  5. Не добавляйте суффикс Enum к имени этого типа. Используйте единственное число для имени enum (кроме битовых полей).

  6. Имена исходных файлов должны быть в стиле Pascal, без подчеркиваний. Не должно быть имен, отличающихся лишь регистром. Имя исходного файла должно совпадать с именем основного класса. В каждом исходном файле должен быть только один класс (за исключением дополнительных, вспомогательных)

  7. Константы пишутся большими буквами, составные слова именования разделяются нижним подчеркиванием. Пример:

static final int MAX_WIDTH = 120;

static final String TABLE_NAME = "order";

Желательно:

  1. Использовать существительное или словосочетание с существительным для имени класса или структуры. А для производного класса - сочетание с базовым классом (Button - PicturedButton)

  2. Не использовать для коротких имён буквы, которые могут быть восприняты как цифры, и наоборот (bool b001 = (lo == l0) ? (I1 == 11) : (lOl != 101)).

Комментарии, документация

Обязательно:

  1. Используйте только // комментарии, но не /**/. Для быстрого комментирования-раскомментирования блоков кода пользуйтесь Edit/Comment(Uncomment) Selection

  2. Пользуйтесь /// для создания шаблона XML документации для класса, члена данных и метода. Таблица всех тегов:

SECTION TAGS DESCRIPTION LOCATION
summary Short description type or member
remarks Describes preconditions and other additional information. type or member
param Describes the parameters of a method method
returns Describes the return value of a method method
exception Lists the exceptions that a method or property can throw method, even or property
value Describes the type of the data a property accepts and/or returns property
example Contains examples (code or text) related to a member or a type type or member
seealso Adds an entry to the See Also section type or member
overloads Provides a summary for multiple overloads of a method first method in a overload list
  1. Объявляйте каждую переменную отдельной строкой и сразу инициализируйте.

  2. Всегда объявляйте константные значения как const.

  3. Все блоки, которые относятся к if, else, while, for, do, switch, foreach, должны быть заключены в {}, даже если там 0 или 1 операторов.

  4. Switch обязательно должен иметь default, который обязан находиться последним в списке.

  5. Если у вас присутствует else if, в конце обязательно должен быть else

  6. Не модифицируйте объект в выражении больше одного раза (v[i] = ++i; i = ++i +1;)

Желательно:

  1. Иметь в методах только одну точку выхода (return). Иногда допускается предварительно проверить достаточность условий/параметров и выйти отдельным return, если метод не может выполняться дальше.

  2. Не сравнивать логические значения, а уже использовать их (while(condition != false) vs while(condition)).

  3. Оптимизировать код при инициализации: bool pos = (val > 0) вместо использования if/else.

ООП

  1. Все члены-данные должны быть private.

  2. Все варианты перегруженного метода должны использоваться для одной и той же цели и иметь сходное поведение.

  3. Не должно быть никакой зависимости от порядка присвоения значений свойствам.

  4. Не создавайте конструкторов, которые не до конца инициализируют экземпляр объекта.

  5. Исключения должны выбрасываться только в действительно исключительных ситуациях, когда невозможно продолжить нормальную работу. Не бросайте исключений из деструкторов (финализаторов). Если метод бросает исключения, нужно описывать их в XML документации тег exception (кроме NET исключений). Если у программы существует какой-либо лог, всегда логируйте в него исключение перед выбросом. Выбрасывайте наиболее конкретное исключение. Ловите также конкретные виды исключений, а не в общем Exception или ApplicationException. Порождайте ваши исключения от ApplicationException. Не выбрасывайте исключений из конструктора исключения.

Типы данных

  1. Не сравнивайте типы с плавающей запятой операторами == и !==

  2. Для создания строк пользуйтесь String.Format или StringBuilder вместо конкатенации

  3. Выполняйте преобразования из большего в меньший тип (long to int, например) только если вы абсолютно уверены, что часть значения не потеряется.

Стиль кодирования

  1. Пишите унарные операторы слитно с операндом. Используйте скобки в выражениях. Отделяйте бинарные/тернарный операторы от операндов и скобок пробелами.

  2. Всегда используйте пробелы вместо табуляций.

  3. Не создавайте строки длиннее 120 символов.

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

Clone this wiki locally