Персональные инструменты
Вы здесь: Главная Members ylitvinov's Home Стайлгайд

Стайлгайд

Программы обычно пишутся прежде всего для человека, а уж потом для компьютера. Поэтому на читабельность программы и на то, чтобы она была понятной, надо обращать особое внимание. Неправильная, но понятная программа лучше правильной, но непонятной - в первой легко найти ошибку и поправить, а во вторую сложно вносить изменения. Поэтому существуют стили кодирования - некие соглашения между программистами, если не следовать которым, можно быть непонятым. Например, если написать:
for (int i = 0; i < 10; ++i);
    printf("Ъ");
все подумают, что Ъ будет напечатан 10 раз, а на самом деле - 1. Обязательные к исполнению правила:

  1. Программа должна собираться без предупреждений компилятора (за исключением функций scanf() и пр. в Visual Studio)
  2. Вложенные операторы должны выделяться отступом, операторы одного уровня вложенности должны быть на одном уровне отступов. Допускаются разные варианты - 2 пробела, 4 пробела, табуляция, но если вы выбрали что-то, вы должны этого придерживаться во всей программе. Обычно рекомендуются 4 пробела. Используйте пустые строки, чтобы выделять логически связные куски кода.
  3. Не должно быть раскопированного кода. Выделяйте общие куски в функции.
  4. Не следует писать несколько операторов на одной строке, например,
    if (k < 0) fail = true;
    
    следует писать как
    if (k < 0) 
    {
      fail = true;
    }
    
  5. По возможности сужайте области видимости переменных, множества возможных значений (например, не стоит использовать переменную типа int в качестве логической переменной), набор допустимых операций и т.д. (например, пишите const везде, где только можно). Тогда если что-то пошло не так, вы сможете узнать об этом уже на этапе компиляции.
  6. Следствие из п. 5 - глобальные переменные - это плохо.
  7. Не используйте goto. Вообще, старайтесь, чтобы поток выполнения программы был прост и понятен.
  8. Одна сущность должна отвечать за одно действие и играть одну роль по всей программе. Одна функция должна делать что-то одно, если функция делает что-то и что-то ещё, её надо разбить на две. Одну и ту же переменную нельзя использовать в двух различных ролях.
  9. Не пишите функций размером больше экрана, разбивайте их на мелкие функции (здесь допустимы исключения).
  10. Все объявляемые переменные должны быть сразу же проинициализированы (при объявлении).
  11. Выбирайте подходящие имена для переменных и функций. Называйте переменные, константы, функции и файлы со строчной буквы, а свои типы (в т.ч. классы) с заглавной. Если в имени переменной, функции или файла содержится несколько слов, то все, кроме первого, должны начинаться с заглавной буквы (без каких-либо символов подчеркивания). Это называется CamelCase. Имена переменных (за исключением счетчиков циклов), функций и типов данных не должны быть короче 4 символов. Например:
    struct ListNode
    {
        int value;
        ListNode* next;
    };
    int getNextValue();
    void printoutList();
    
  12. Не используйте "магические константы" (опять же, не следует увлекаться).
    Неправильно:
    for (i = 0; i < 10; i++) 

    Правильно:
    int const dimension = 10; 
    ...
    for (i = 0; i < dimension; i++)
  13. Не используйте макропроцессор (кроме #include)
  14. Не используйте в своих программах файл conio.h
  15. Выделяйте пробелами арифметические операции, оператор присваивания и т.д.
  16. Не отделяйте пробелами скобки. Например, не "assert (false)" или "assert( false )", а "assert(false)"
  17. Ставьте пробел после ключевого слова: между if и (, for и ( и т.д. Например, правильно оформленный for:
    for (int i = 0; i < maxN; ++i) 
    {
        printf("Hello, world!\n");
    }
  18. Операторы доступа к полям структур и классов -> и . пробелами не выделяются
  19. Предложения case в операторе switch должны оформляться следующим образом:
    case '2':
    {
        ...
        break;
    }
  20. Отделяйте пробелами "#include" и '<' (или '"'), например, #include <stdio.h>
  21. Пишите фигурные скобки на отдельной строке.
  22. Функции-предикаты (булевы функции) следует именовать следующим образом:
    [глагол][предикат]
    где "глагол" - глагол бытия (to be) или обладания (to have) в сооветствующей форме, а "предикат" - проверяемое свойство. Например:
    bool isPrime(int n) 
    bool hasColor()
  23. При вызове функций-предикатов запрещается сравнивать результат с логическими константами.
    if (isPrime(n) == true) - плохой код. Сравнивать логические переменные с логическими константами столь же бессмысленно.
  24. Не используйте транслит, пишите все либо по-русски в читабельной в компьютерном классе кодировке, либо по-английски. Например, vstavka() - неудачное название для функции, реализующей алгоритм сортировки вставками.
  25. Если вы выделяете системные ресурсы (память, файловые дескрипторы, etc), то вы обязательно должны их освободить, как только в них отпадает нужда. Пример с файлами:
      FILE *f = fopen("file.txt", "r");
      <использование f>
      fclose(f);
    
    или с памятью:
      int *a = new int[10];
      <использование a>
      delete[] a;
    
  26. Для обозначения нулевого указателя используйте константу nullptr.
  27. Каждый вывод данных на экран должен сопровождаться сообщением с пояснением того, что именно выводится.
  28. Каждый ввод пользовательских данных должен сопровождаться приглашением к вводу, объясняющим пользователю, ввод данных какого рода и в каком объеме от него ожидается
Действия с Документом