-
Notifications
You must be signed in to change notification settings - Fork 22
Стайлгайд
Программы обычно пишутся прежде всего для человека, а уж потом для компьютера. Поэтому на читабельность программы и на то, чтобы она была понятной, надо обращать особое внимание. Неправильная, но понятная программа лучше правильной, но непонятной - в первой легко найти ошибку и поправить, а во вторую сложно вносить изменения. Поэтому существуют стили кодирования - некие соглашения между программистами, если не следовать которым, можно быть непонятым. Например, если написать:
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 node
{
int value;
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++)
-
Используйте в своих библиотеках
#pragma once
. -
Не используйте в своих программах файл
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 '1':
{
...
}
break;
или
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
. -
Каждый вывод данных на экран должен сопровождаться сообщением с пояснением того, что именно выводится.
-
Каждый ввод пользовательских данных должен сопровождаться приглашением к вводу, объясняющим пользователю, ввод данных какого рода и в каком объеме от него ожидается.