Практические занятия по курсу ОиМП/C++ check — различия между версиями

Материал из Wiki - Факультет компьютерных наук
Перейти к: навигация, поиск
Строка 1: Строка 1:
 
== Оформление ==
 
== Оформление ==
# Отступ - 4 пробела. Символы табуляции использовать для отступов запрещено.
+
<ol>
# Отступами выделяются: тела функций, структур/классов, вложенных блоков.
+
<li>Отступ - 4 пробела. Символы табуляции использовать для отступов запрещено.</li>
# Бинарные операторы отбиваются пробелами с двух сторон, после унарных пробелы не ставятся: a += b + -c
+
<li>Отступами выделяются: тела функций, структур/классов, вложенных блоков.</li>
# Пробелы после открывающей скобки и перед закрывающей скобкой не ставятся: f(1, (2 + 3)). Закрывающая скобка должна идти на той же строке, что и последнее выражение.
+
<li>Бинарные операторы отбиваются пробелами с двух сторон, после унарных пробелы не ставятся: a += b + -c</li>
# Максимальная длина строки - 100 символов.
+
<li>Пробелы после открывающей скобки и перед закрывающей скобкой не ставятся: f(1, (2 + 3)). Закрывающая скобка должна идти на той же строке, что и последнее выражение.</li>
# Перед ; пробел не ставится. После ; в for ставится пробел.
+
<li>Максимальная длина строки - 100 символов.</li>
# Пустые блоки записываются как {} (а не ;).
+
<li>Перед ; пробел не ставится. После ; в for ставится пробел.</li>
# Открывающая { пишется на той же строке, что и начало блока (if, while, for, объявление функции).
+
<li>Пустые блоки записываются как {} (а не ;).</li>
# else пишется на той же строке, что и закрывающая } от if: if (...) {...\n} else {
+
<li>Открывающая { пишется на той же строке, что и начало блока (if, while, for, объявление функции).</li>
# Однострочные комментарии отделяются от кода двумя пробелами и начинаются с пробела.
+
<li>else пишется на той же строке, что и закрывающая } от if: if (...) {...\n} else {</li>
# Пробелы в конце строки запрещены.
+
<li>Однострочные комментарии отделяются от кода двумя пробелами и начинаются с пробела.</li>
# Файл должен заканчиваться переводом строки.
+
<li>Пробелы в конце строки запрещены.</li>
# В range-base for двоеточие обрамляется пробелами.
+
<li>Файл должен заканчиваться переводом строки.</li>
# В начале/конце блока, после public/private/protected пустые строки не ставятся.
+
<li>В range-base for двоеточие обрамляется пробелами.</li>
# Перед объявлением функции/структуры/класса - пустая строка обязательна.
+
<li>В начале/конце блока, после public/private/protected пустые строки не ставятся.</li>
# Секции include-ов и using-ов были упорядочены по алфавиту.
+
<li>Перед объявлением функции/структуры/класса - пустая строка обязательна.</li>
 
+
<li>Секции include-ов и using-ов были упорядочены по алфавиту.
 
Плохо:
 
Плохо:
 
<source lang="cpp">
 
<source lang="cpp">
Строка 41: Строка 41:
 
using std::cout;
 
using std::cout;
 
using std::vector;
 
using std::vector;
</source>
+
</source></li>
 
+
<li>Имя шаблона и параметр шаблона НЕ должны разделяться пробелом.
# Имя шаблона и параметр шаблона НЕ должны разделяться пробелом.
+
  
 
Плохо:
 
Плохо:
Строка 53: Строка 52:
 
<source lang="cpp">
 
<source lang="cpp">
 
vector<int> v
 
vector<int> v
</source>
+
</source></li>
  
 
== Именование ==
 
== Именование ==
# Не используйте транслит в именах.
+
<li>Не используйте транслит в именах.
  
 
Плохо:
 
Плохо:
Строка 66: Строка 65:
 
<source lang="cpp">
 
<source lang="cpp">
 
size_t length;
 
size_t length;
</source>
+
</source></li>
  
# Давайте переменным осмысленные имена. В частности, не используйте однобуквенных имён за исключением имён итераторов (i, j, k, ...), координат (x, y, z).
+
<li>Давайте переменным осмысленные имена. В частности, не используйте однобуквенных имён за исключением имён итераторов (i, j, k, ...), координат (x, y, z).
  
 
Плохо:
 
Плохо:
Строка 96: Строка 95:
 
<source lang="cpp">
 
<source lang="cpp">
 
int length;
 
int length;
</source>
+
</source></li>
  
 
== Прочее ==
 
== Прочее ==

Версия 00:04, 28 февраля 2015

Оформление

  1. Отступ - 4 пробела. Символы табуляции использовать для отступов запрещено.
  2. Отступами выделяются: тела функций, структур/классов, вложенных блоков.
  3. Бинарные операторы отбиваются пробелами с двух сторон, после унарных пробелы не ставятся: a += b + -c
  4. Пробелы после открывающей скобки и перед закрывающей скобкой не ставятся: f(1, (2 + 3)). Закрывающая скобка должна идти на той же строке, что и последнее выражение.
  5. Максимальная длина строки - 100 символов.
  6. Перед ; пробел не ставится. После ; в for ставится пробел.
  7. Пустые блоки записываются как {} (а не ;).
  8. Открывающая { пишется на той же строке, что и начало блока (if, while, for, объявление функции).
  9. else пишется на той же строке, что и закрывающая } от if: if (...) {...\n} else {
  10. Однострочные комментарии отделяются от кода двумя пробелами и начинаются с пробела.
  11. Пробелы в конце строки запрещены.
  12. Файл должен заканчиваться переводом строки.
  13. В range-base for двоеточие обрамляется пробелами.
  14. В начале/конце блока, после public/private/protected пустые строки не ставятся.
  15. Перед объявлением функции/структуры/класса - пустая строка обязательна.
  16. Секции include-ов и using-ов были упорядочены по алфавиту. Плохо:
    #include <vector>
    #include <iostream>

    Хорошо:

    #include <iostream>
    #include <vector>

    Плохо:

    using std::vector;
    using std::cin;
    using std::cout;

    Хорошо:

    using std::cin;
    using std::cout;
    using std::vector;
  17. Имя шаблона и параметр шаблона НЕ должны разделяться пробелом. Плохо:
    vector <int> v;

    Хорошо:

    vector<int> v
  18. Именование

  19. Не используйте транслит в именах. Плохо:
    size_t dlina_massiva;

    Хорошо:

    size_t length;
  20. Давайте переменным осмысленные имена. В частности, не используйте однобуквенных имён за исключением имён итераторов (i, j, k, ...), координат (x, y, z). Плохо:
    char alf(int j) { 
        ...
    }
    // или
    char alphabet(int j) { 
        ...
    }

    Хорошо:

    char get_char(int j) {
        ...
    }

    Плохо:

    int ln;

    Хорошо:

    int length;
  21. Прочее

    1. Необходимо явно подключать заголовочные файлы, в которых объявляются используемые функции/классы/... Запрещено явно подключать один и тот же заголовочный файл дважды.
    2. В качестве логических операторов следует использовать &&, ||, ... Их аналоги and, or, ... запрещены.
    3. Запрещено использовать приведение типов в стиле C - следует использовать *_cast.
    4. Конструктор от одного аргумента должен быть объявлен explicit.
    5. Порядок аргументов функции: сначала входные параметры (по значению либо константой ссылке), затем выходные (по указателю).
    6. При объявлении виртуальной функции следует использовать один и только один из спецификаторов virtual, final, override.
    7. При объявлении переменной спецификаторы static/extern/... идут перед именем типа.
    8. Запрещено использовать директиву using namespace. Нужно либо каждый раз указывать namespace явно, либо импортировать конкретные типы/переменные: using std::vector.
    9. Передавайте аргументы в функции по константной ссылке везде, где это уместно.

    Плохо:

    void print_vector(vector<int> v) {
        ...
    }

    Хорошо:

    void print_vector(const vector<int>& v) {
        ...
    }
    1. Везде, где это возможно, используйте префиксный инкремент и декремент.

    Плохо:

    i++;
    it--;

    Хорошо:

    ++i;
    --it;
    1. Не создавайте функции с избыточным числом аргументов. Например, в функцию, печатающую вектор, не нужно передавать размер вектора.

    Плохо:

    void print_vector(const vector<int>& v, int n) {
        for (size_t i = 0; i < n; ++i) {
            cout << v[i] << " ";
        }
    }

    Хорошо:

    void print_vector(const vector<int>& v) {
        // Используйте v.size(), чтобы получить длину вектора
        for (size_t i = 0; i < v.size(); ++i) {
            cout << v[i] << " ";
        }
    }
    1. Пишите код так, чтобы не было предупреждений (warnings) компилятора. В частности, избегайте сравнений знаковых (int) и беззнаковых (size_t) переменных.

    Плохо:

    for (int i = 0; i < v.size(); ++i) {
        ...
    }

    Хорошо:

    for (size_t i = 0; i < v.size(); ++i) {
        ...
    }


    Примеры и проверка

    как делать не надо

    Флаги для cpplint: --filter=-,+build/include,-build/include_order,-build/include_what_you_use,+build/storage_class,+readability/alt_tokens,+readability/braces,+readability/casting,+readability/inheritance,+runtime/casting,+runtime/explicit,+whitespace/blank_line,+whitespace/braces,+whitespace/comma,+whitespace/comments,+whitespace/empty_conditional_body,+whitespace/empty_loop_body,+whitespace/end_of_line,+whitespace/ending_newline,+whitespace/forcolon,+whitespace/indent,+whitespace/line_length,+whitespace/newline,+whitespace/operators,+whitespace/parens,+whitespace/semicolon,+whitespace/tab --linelength=100