Стайлгайд
Программы обычно пишутся прежде всего для человека, а уж потом для компьютера. Поэтому на читабельность программы и на то, чтобы она была понятной, надо обращать особое внимание. Неправильная, но понятная программа лучше правильной, но непонятной - в первой легко найти ошибку и поправить, а во вторую сложно вносить изменения. Поэтому существуют стили кодирования - некие соглашения между программистами, если не следовать которым, можно быть непонятым. Например, если написать:
for (int i = 0; i < 10; ++i); printf("Ъ");все подумают, что Ъ будет напечатан 10 раз, а на самом деле - 1. Обязательные к исполнению правила:
- Программа должна собираться без предупреждений компилятора (за исключением функций scanf() и пр. в Visual Studio)
- Вложенные операторы должны выделяться отступом, операторы одного уровня вложенности должны быть на одном уровне отступов. Допускаются разные варианты - 2 пробела, 4 пробела, табуляция, но если вы выбрали что-то, вы должны этого придерживаться во всей программе. Обычно рекомендуются 4 пробела. Используйте пустые строки, чтобы выделять логически связные куски кода.
- Не должно быть раскопированного кода. Выделяйте общие куски в функции.
- Не следует писать несколько операторов на одной строке, например,
if (k < 0) fail = true;
следует писать какif (k < 0) { fail = true; }
- По возможности сужайте области видимости переменных, множества возможных значений (например, не стоит использовать переменную типа int в качестве логической переменной), набор допустимых операций и т.д. (например, пишите const везде, где только можно). Тогда если что-то пошло не так, вы сможете узнать об этом уже на этапе компиляции.
- Следствие из п. 5 - глобальные переменные - это плохо.
- Не используйте goto. Вообще, старайтесь, чтобы поток выполнения программы был прост и понятен.
- Одна сущность должна отвечать за одно действие и играть одну роль по всей программе. Одна функция должна делать что-то одно, если функция делает что-то и что-то ещё, её надо разбить на две. Одну и ту же переменную нельзя использовать в двух различных ролях.
- Не пишите функций размером больше экрана, разбивайте их на мелкие функции (здесь допустимы исключения).
- Все объявляемые переменные должны быть сразу же проинициализированы (при объявлении).
- Выбирайте подходящие имена для переменных и функций. Называйте переменные, константы, функции и файлы со строчной буквы, а свои типы (в т.ч. классы) с заглавной. Если в имени переменной, функции или файла содержится несколько слов, то все, кроме первого, должны начинаться с заглавной буквы (без каких-либо символов подчеркивания). Это называется CamelCase. Имена переменных (за исключением счетчиков циклов), функций и типов данных не должны быть короче 4 символов. Например:
struct ListNode { int value; ListNode* next; }; int getNextValue(); void printoutList();
- Не используйте "магические константы" (опять же, не следует увлекаться).
Неправильно:for (i = 0; i < 10; i++)
Правильно:
int const dimension = 10;
...
for (i = 0; i < dimension; i++) - Не используйте макропроцессор (кроме #include)
- Не используйте в своих программах файл conio.h
- Выделяйте пробелами арифметические операции, оператор присваивания и т.д.
- Не отделяйте пробелами скобки. Например, не "assert (false)" или "assert( false )", а "assert(false)"
- Ставьте пробел после ключевого слова: между if и (, for и ( и т.д. Например, правильно оформленный for:
for (int i = 0; i < maxN; ++i)
{
printf("Hello, world!\n");
} - Операторы доступа к полям структур и классов -> и . пробелами не выделяются
- Предложения case в операторе switch должны оформляться следующим образом:
case '2': { ... break; }
- Отделяйте пробелами "#include" и '<' (или '"'), например, #include <stdio.h>
- Пишите фигурные скобки на отдельной строке.
- Функции-предикаты (булевы функции) следует именовать следующим образом:
[глагол][предикат]
где "глагол" - глагол бытия (to be) или обладания (to have) в сооветствующей форме, а "предикат" - проверяемое свойство. Например:
bool isPrime(int n)
bool hasColor() - При вызове функций-предикатов запрещается сравнивать результат с логическими константами.
if (isPrime(n) == true) - плохой код. Сравнивать логические переменные с логическими константами столь же бессмысленно. - Не используйте транслит, пишите все либо по-русски в читабельной в компьютерном классе кодировке, либо по-английски. Например, vstavka() - неудачное название для функции, реализующей алгоритм сортировки вставками.
- Если вы выделяете системные ресурсы (память, файловые дескрипторы, etc), то вы обязательно должны их освободить, как только в них отпадает нужда. Пример с файлами:
FILE *f = fopen("file.txt", "r"); <использование f> fclose(f);
или с памятью:int *a = new int[10]; <использование a> delete[] a;
- Для обозначения нулевого указателя используйте константу nullptr.
- Каждый вывод данных на экран должен сопровождаться сообщением с пояснением того, что именно выводится.
- Каждый ввод пользовательских данных должен сопровождаться приглашением к вводу, объясняющим пользователю, ввод данных какого рода и в каком объеме от него ожидается