-
Notifications
You must be signed in to change notification settings - Fork 0
Code Style Convention
Имена
-
Используйте правильные английские слова для идентификаторов, названий классов, методов. Давайте имена в соответствии с назначением идентификатора, а не типом. Не сокращайте слова (кроме общеизвестных сокращений типа UI)
-
Используйте 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 |
-
Не добавляйте префиксы, идентифицирующие тип, не используйте венгерскую нотацию. Не добавляйте префиксы к полям – данным классов и структур.
-
Не используйте идентификаторы, отличающиеся лишь регистром символов (например MySomething и MySomeThing)
-
Не используйте подчеркивания _ в именах
-
Интерфейсы должны начинаться с префикса I. Используйте существительное, словосочетание с существительным или прилагательное (IComponent, ICustomAttributeProvider, IPersistable)
-
Не добавляйте суффикс Enum к имени этого типа. Используйте единственное число для имени enum (кроме битовых полей).
-
Имена исходных файлов должны быть в стиле Pascal, без подчеркиваний. Не должно быть имен, отличающихся лишь регистром. Имя исходного файла должно совпадать с именем основного класса. В каждом исходном файле должен быть только один класс (за исключением дополнительных, вспомогательных)
-
Константы пишутся большими буквами, составные слова именования разделяются нижним подчеркиванием. Пример:
static final int MAX_WIDTH = 120;
static final String TABLE_NAME = "order";
-
Использовать существительное или словосочетание с существительным для имени класса или структуры. А для производного класса - сочетание с базовым классом (Button - PicturedButton)
-
Не использовать для коротких имён буквы, которые могут быть восприняты как цифры, и наоборот (bool b001 = (lo == l0) ? (I1 == 11) : (lOl != 101)).
Комментарии, документация
-
Используйте только // комментарии, но не /**/. Для быстрого комментирования-раскомментирования блоков кода пользуйтесь Edit/Comment(Uncomment) Selection
-
Пользуйтесь /// для создания шаблона 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 |
-
Объявляйте каждую переменную отдельной строкой и сразу инициализируйте.
-
Всегда объявляйте константные значения как const.
-
Все блоки, которые относятся к if, else, while, for, do, switch, foreach, должны быть заключены в {}, даже если там 0 или 1 операторов.
-
Switch обязательно должен иметь default, который обязан находиться последним в списке.
-
Если у вас присутствует else if, в конце обязательно должен быть else
-
Не модифицируйте объект в выражении больше одного раза (v[i] = ++i; i = ++i +1;)
-
Иметь в методах только одну точку выхода (return). Иногда допускается предварительно проверить достаточность условий/параметров и выйти отдельным return, если метод не может выполняться дальше.
-
Не сравнивать логические значения, а уже использовать их (while(condition != false) vs while(condition)).
-
Оптимизировать код при инициализации: bool pos = (val > 0) вместо использования if/else.
ООП
-
Все члены-данные должны быть private.
-
Все варианты перегруженного метода должны использоваться для одной и той же цели и иметь сходное поведение.
-
Не должно быть никакой зависимости от порядка присвоения значений свойствам.
-
Не создавайте конструкторов, которые не до конца инициализируют экземпляр объекта.
-
Исключения должны выбрасываться только в действительно исключительных ситуациях, когда невозможно продолжить нормальную работу. Не бросайте исключений из деструкторов (финализаторов). Если метод бросает исключения, нужно описывать их в XML документации тег exception (кроме NET исключений). Если у программы существует какой-либо лог, всегда логируйте в него исключение перед выбросом. Выбрасывайте наиболее конкретное исключение. Ловите также конкретные виды исключений, а не в общем Exception или ApplicationException. Порождайте ваши исключения от ApplicationException. Не выбрасывайте исключений из конструктора исключения.
Типы данных
-
Не сравнивайте типы с плавающей запятой операторами == и !==
-
Для создания строк пользуйтесь String.Format или StringBuilder вместо конкатенации
-
Выполняйте преобразования из большего в меньший тип (long to int, например) только если вы абсолютно уверены, что часть значения не потеряется.
Стиль кодирования
-
Пишите унарные операторы слитно с операндом. Используйте скобки в выражениях. Отделяйте бинарные/тернарный операторы от операндов и скобок пробелами.
-
Всегда используйте пробелы вместо табуляций.
-
Не создавайте строки длиннее 120 символов.
-
Оформление кода, не указанное в данных стандартах, должно быть в едином стиле внутри одного проекта. Не допускается применение личных особенностей оформления кода в общем проекте.