-
Notifications
You must be signed in to change notification settings - Fork 9
Стайлгайд
Программы обычно пишутся прежде всего для человека, а уж потом для компьютера. Поэтому на читабельность программы и на то, чтобы она была понятной, надо обращать особое внимание. Неправильная, но понятная программа лучше правильной, но непонятной - в первой легко найти ошибку и поправить, а во вторую сложно вносить изменения. Поэтому существуют стили кодирования - некие соглашения между программистами, если не следовать которым, можно быть непонятым. Например, если написать:
for (int i = 0; i < 10; ++i);
printf("Ъ");
все подумают, что Ъ будет напечатан 10 раз, а на самом деле - 1. Обязательные к исполнению правила:
-
Программа должна собираться без предупреждений компилятора.
-
Вложенные операторы должны выделяться отступом, операторы одного уровня вложенности должны быть на одном уровне отступов (табуляции). Используйте пустые строки, чтобы выделять логически связные куски кода.
-
Не должно быть раскопированного кода. Выделяйте общие куски в функции.
-
Не следует писать несколько операторов на одной строке, например,
if (k < 0) fail = 1;
следует писать как
if (k < 0)
{
fail = 1;
}
-
По возможности сужайте области видимости переменных, множества возможных значений, набор допустимых операций и т.д.. Тогда если что-то пошло не так, вы сможете узнать об этом уже на этапе компиляции.
-
Следствие из п. 5 - глобальные переменные - это плохо.
-
Не используйте goto. Вообще, старайтесь, чтобы поток выполнения программы был прост и понятен.
-
Одна сущность должна отвечать за одно действие и играть одну роль по всей программе. Одна функция должна делать что-то одно, если функция делает что-то и что-то ещё, её надо разбить на две. Одну и ту же переменную нельзя использовать в двух различных ролях.
-
Не пишите функций размером больше экрана, разбивайте их на мелкие функции (здесь допустимы исключения).
-
Все объявляемые переменные должны быть сразу же проинициализированы (при объявлении).
-
Выбирайте подходящие имена для переменных и функций. Называйте переменные, функции и файлы со строчной буквы, а свои типы с заглавной. Если в имени переменной, функции или файла содержится несколько слов, то все, должны начинаться со строчной буквы, для разделения используйте подчеркивание. Это называется Snake case. Имена переменных (за исключением счетчиков циклов), функций и типов данных не должны быть короче 4 символов. Например:
struct List_node
{
int value;
List_node *next;
};
int get_next_value();
void printout_list();
- Не используйте "магические константы" (опять же, не следует увлекаться). Неправильно:
for (i = 0; i < 10; i++)
правильно
const int dimension = 10;
...
for (i = 0; i < dimension; i++)
-
Используйте в своих библиотеках Include guard.
-
Не используйте в своих программах файл conio.h.
-
Выделяйте пробелами арифметические операции, оператор присваивания и т.д.
-
Не отделяйте пробелами скобки. Например, не "assert (false)" или "assert( false )", а "assert(false)".
-
Ставьте пробел после ключевого слова: между if и (, for и ( и т.д. Например, правильно оформленный for:
for (int i = 0; i < max_n; ++i)
{
printf("Hello, world!\n");
}
-
Операторы доступа к полям структур -> и . пробелами не выделяются.
-
Предложения case в операторе switch должны оформляться следующим образом:
case '2':
{
...
break;
}
-
Отделяйте пробелами "#include" и '<' (или '"'), например, "#include <stdio.h>".
-
Пишите фигурные скобки на отдельной строке.
-
Функции-предикаты следует именовать следующим образом:
[глагол][предикат]
где "глагол" - глагол бытия (to be) или обладания (to have) в соответствующей форме, а "предикат" - проверяемое свойство. Например:
int is_prime(int n)
int has_color()
-
При вызове функций-предикатов запрещается сравнивать результат с логическими константами. if (isPrime(n) == 1) - плохой код. Сравнивать логические переменные с логическими константами столь же бессмысленно.
-
Не используйте транслит, пишите все либо по-русски в читабельной в компьютерном классе кодировке, либо по-английски. Например, vstavka() - неудачное название для функции, реализующей алгоритм сортировки вставками.
-
Если вы выделяете системные ресурсы (память, файловые дескрипторы, etc), то вы обязательно должны их освободить, как только в них отпадает нужда. Пример с файлами:
FILE *f = fopen("file.txt", "r");
<использование f>
fclose(f);
или с памятью:
int *a = malloc(sizeof(int) * 10);
<использование a>
free(a);
-
Для обозначения нулевого указателя используйте константу NULL.
-
Каждый вывод данных на экран должен сопровождаться сообщением с пояснением того, что именно выводится.
-
Каждый ввод пользовательских данных должен сопровождаться приглашением к вводу, объясняющим пользователю, ввод данных какого рода и в каком объеме от него ожидается.