Skip to content

Стайлгайд

Victor Y. Fadeev edited this page Mar 27, 2021 · 5 revisions

Программы обычно пишутся прежде всего для человека, а уж потом для компьютера. Поэтому на читабельность программы и на то, чтобы она была понятной, надо обращать особое внимание. Неправильная, но понятная программа лучше правильной, но непонятной - в первой легко найти ошибку и поправить, а во вторую сложно вносить изменения. Поэтому существуют стили кодирования - некие соглашения между программистами, если не следовать которым, можно быть непонятым. Например, если написать:

for (int i = 0; i < 10; i++);
	printf("Ъ");

все подумают, что Ъ будет напечатан 10 раз, а на самом деле - 1. Обязательные к исполнению правила:

  1. Программа должна собираться без предупреждений компилятора.

  2. Вложенные операторы должны выделяться отступом, операторы одного уровня вложенности должны быть на одном уровне отступов (табуляции). Используйте пустые строки, чтобы выделять логически связные куски кода.

  3. Не должно быть раскопированного кода. Выделяйте общие куски в функции.

  4. Не следует писать несколько операторов на одной строке, например,

if (k < 0) fail = 1;

следует писать как

if (k < 0)
{
	fail = 1;
}
  1. По возможности сужайте области видимости переменных, множества возможных значений, набор допустимых операций и т.д.. Тогда если что-то пошло не так, вы сможете узнать об этом уже на этапе компиляции.

  2. Следствие из п. 5 - глобальные переменные - это плохо.

  3. Не используйте goto. Вообще, старайтесь, чтобы поток выполнения программы был прост и понятен.

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

  5. Не пишите функций размером больше экрана, разбивайте их на мелкие функции (здесь допустимы исключения).

  6. Все объявляемые переменные должны быть сразу же проинициализированы (при объявлении).

  7. Выбирайте подходящие имена для переменных и функций. Называйте переменные, функции и файлы со строчной буквы. Если в имени переменной, функции или файла содержится несколько слов, то все, должны начинаться со строчной буквы, для разделения используйте подчеркивание. Это называется Snake case. Имена переменных (за исключением счетчиков циклов), функций и типов данных не должны быть короче 4 символов. Например:

struct node
{
	int value;
	node *next;
};

int get_next_value();
void printout_list();
  1. Не используйте "магические константы" (опять же, не следует увлекаться). Неправильно:
for (i = 0; i < 10; i++)

правильно

const int DIMENSION = 10; 
... 
for (i = 0; i < DIMENSION; i++)
  1. Используйте в своих библиотеках #pragma once.

  2. Не используйте в своих программах файл conio.h.

  3. Выделяйте пробелами арифметические операции, оператор присваивания и т.д.

  4. Не отделяйте пробелами скобки. Например, не assert (false) или assert( false ), а assert(false).

  5. Ставьте пробел после ключевого слова: между if и (, for и ( и т.д. Например, правильно оформленный for:

for (int i = 0; i < MAX_N; i++) 
{         
	printf("Hello, world!\n");     
}
  1. Операторы доступа к полям структур -> и . пробелами не выделяются.

  2. Предложения case в операторе switch должны оформляться следующим образом:

case '1':
{
	...
}
break;

или

case '2':
	...
	break;
  1. Отделяйте пробелами #include и < (или "), например, #include <stdio.h>.

  2. Пишите фигурные скобки на отдельной строке.

  3. Функции-предикаты следует именовать следующим образом:
    [глагол][предикат]
    где "глагол" - глагол бытия (to be) или обладания (to have) в соответствующей форме, а "предикат" - проверяемое свойство. Например:

int is_prime(int n);
int has_color();
  1. При вызове функций-предикатов запрещается сравнивать результат с логическими константами. if (isPrime(n) == 1) - плохой код. Сравнивать логические переменные с логическими константами столь же бессмысленно.

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

  3. Если вы выделяете системные ресурсы (память, файловые дескрипторы, etc), то вы обязательно должны их освободить, как только в них отпадает нужда. Пример с файлами:

FILE *f = fopen("file.txt", "r");
<использование f>
fclose(f);

или с памятью:

int *a = malloc(sizeof(int) * 10);
<использование a>
free(a);
  1. Для обозначения нулевого указателя используйте константу NULL.

  2. Каждый вывод данных на экран должен сопровождаться сообщением с пояснением того, что именно выводится.

  3. Каждый ввод пользовательских данных должен сопровождаться приглашением к вводу, объясняющим пользователю, ввод данных какого рода и в каком объеме от него ожидается.