1.8 – Пробельные символы и базовое форматирование кода

Добавлено 9 апреля 2021 в 00:03

Пробельный символ – это термин, обозначающий символы, которые используются для форматирования. В C++ это в первую очередь относится к пробелам, табуляциям и символам новой строки. Компилятор C++ обычно игнорирует пробелы, за некоторыми незначительными исключениями (при обработке текстовых литералов). По этой причине мы говорим, что C++ – это язык, не зависящий от пробелов.

Следовательно, все следующие выражения делают одно и то же:

std::cout << "Hello world!";
 
std::cout               <<            "Hello world!";
 
		std::cout << 		"Hello world!";
 
std::cout
	<< "Hello world!";

Даже последнее выражение, разбитое на две строки, компилируется нормально.

Следующие функции выполняют одно и то же:

int add(int x, int y) { return x + y; }
 
int add(int x, int y) {
    return x + y; }
 
int add(int x, int y)
{    return x + y; }
 
int add(int x, int y)
{
    return x + y;
}

Одно исключение, когда компилятор C++ обращает на них внимание, это, когда пробельные символы находятся внутри текста в кавычках, например "Hello world!".

"Hello world!"

отличается от

"Hello     world!"

и каждый из них распечатывается именно так, как вы ожидали.

В тексте, заключенном в кавычки, переносы на новую строку не допускаются:

std::cout << "Hello
     world!"; // Недопустимо!

Фрагменты текста в кавычках, разделенные только пробельными символами (пробелы, табуляции или новые строки), будут объединены:

std::cout << "Hello "
     "world!"; // печатает "Hello world!"

Другое исключение, когда компилятор C++ обращает внимание на пробелы, – это комментарии с //. Однострочные комментарии продолжаются только до конца строки. Таким образом, если вы сделаете что-то вроде этого, у вас возникнут проблемы:

std::cout << "Hello world!"; // Вот однострочный комментарий
это не часть комментария

Базовое форматирование

В отличие от некоторых других языков, C++ не накладывает на форматирование для программиста никаких ограничений (помните, доверяйте программисту!). На протяжении многих лет было разработано множество различных методов форматирования программ на C++, и вы обнаружите разногласия по поводу того, какие из них лучше. Наше основное эмпирическое правило состоит в том, что лучшие стили – это те, которые создают наиболее читаемый код и обеспечивают наибольшую последовательность.

Ниже приведены наши рекомендации по базовому форматированию:

1) Для отступов можно использовать табуляцию или пробелы (в большинстве IDE есть параметр, позволяющий преобразовать нажатие табуляции в соответствующее количество пробелов). Разработчики, которые предпочитают пробелы, как правило, делают это, потому что пробелы делают форматирование самоописывающим – код, разделенный пробелами, всегда будет выглядеть правильно, независимо от редактора. Сторонники использования табуляций задаются вопросом, почему бы вам для отступов не использовать символ, предназначенный для создания отступов, тем более что вы можете установить ширину по своему усмотрению. Здесь нет правильного ответа – и спорить об этом всё равно, что спорить, что лучше – торт или пирог. В конечном итоге всё сводится к личным предпочтениям.

В любом случае мы рекомендуем вам установить для табуляций значение отступа в 4 пробела. Некоторые IDE по умолчанию используют отступ в 3 пробела, что тоже нормально.

2) Есть два приемлемых стиля для фигурных скобок.

Руководство по стилю Google C++ рекомендует ставить открывающую фигурную скобку в той же строке, что и выражение:

int main() {
}

Обоснованием этого является то, что это уменьшает количество вертикальных пробельных символов (вы не посвящаете всю строку ничему, кроме открывающей фигурной скобки), поэтому вы можете разместить больше кода на экране. Больше кода на экране упрощает понимание программы.

Однако мы предпочитаем распространенный вариант, когда открывающая фигурная скобка располагается в отдельной строке:

int main()
{
}

Это улучшает читаемость и снижает вероятность ошибок, поскольку пары скобок всегда должны иметь один и тот же отступ. Если вы получаете ошибку компилятора из-за несоответствия скобок, очень легко увидеть, где именно допущена ошибка.

3) Каждое выражение в фигурных скобках должно начинаться на одну табуляцию дальше от открывающей фигурной скобки функции, которой оно принадлежит. Например:

int main()
{
    std::cout << "Hello world!\n";      // отступ на одну табуляцию (4 пробела)
    std::cout << "Nice to meet you.\n"; // отступ на одну табуляцию (4 пробела)
}

4) Строки не должны быть слишком длинными. Как правило, максимальная длина строки составляет 80 символов. Если строка будет длиннее, ее следует разделить (в разумном месте) на несколько строк. Это можно сделать, добавив к каждой последующей строке дополнительную табуляцию, или, если строки похожи, выровняв ее по строке выше (в зависимости от того, что легче читается).

int main()
{
    std::cout << "This is a really, really, really, really, really, really, really, " 
        "really long line\n"; // один дополнительный отступ для строки продолжения
 
    std::cout << "This is another really, really, really, really, really, really, really, "
                 "really long line\n"; // текст, выровненный по предыдущей строке для строки продолжения
 
    std::cout << "This one is short\n";
}

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

Лучшая практика


Длина ваших строк не должна превышать 80 символов.

5) Если длинная строка разделена оператором (например, << или +), оператор должен быть помещен в начало следующей строки, а не в конец текущей строки.

    std::cout << 3 + 4
        + 5 + 6
        * 7 * 8;

Это помогает прояснить, что последующие строки являются продолжением предыдущих строк, и позволяет выровнять операторы слева, что упрощает чтение.

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

Следующий код читать сложнее:

cost = 57;
pricePerItem = 24;
value = 5;
numberOfItems = 17;

А этот код читать легче:

cost          = 57;
pricePerItem  = 24;
value         = 5;
numberOfItems = 17;

Читать сложнее:

std::cout << "Hello world!\n"; // cout живет в библиотеке iostream
std::cout << "It is very nice to meet you!\n"; // эти комментарии затрудняют чтение кода
std::cout << "Yeah!\n"; // особенно когда строки разной длины

Легче читать:

std::cout << "Hello world!\n";                  // cout живет в библиотеке iostream
std::cout << "It is very nice to meet you!\n";  // эти комментарии читать легче 
std::cout << "Yeah!\n";                         // особенно когда все выровнены

Сложнее читать:

// cout живет в библиотеке iostream
std::cout << "Hello world!\n";
// эти комментарии затрудняют чтение кода
std::cout << "It is very nice to meet you!\n";
// особенно, когда всё сбито в кучу
std::cout << "Yeah!\n";

Легче читать:

// cout живет в библиотеке iostream
std::cout << "Hello world!\n";
 
// эти комментарии легче читать
std::cout << "It is very nice to meet you!\n";
 
// когда они разделены пробельными символами
std::cout << "Yeah!\n";

Мы будем следовать этим соглашениям на протяжении всех уроков, и они станут вашей второй натурой. По мере того, как мы представляем вам новые темы, мы будем предлагать новые рекомендации по стилю оформления для этого нового функционала.

В конечном итоге C++ дает вам возможность выбрать тот стиль, который вам больше всего подходит, или который вы считаете лучшим. Однако мы настоятельно рекомендуем вам использовать тот же стиль, который используем мы в наших примерах. Он был протестирован тысячами программистов над миллиардами строк кода и оптимизирован для достижения успеха. Одно исключение: если вы работаете с чужим кодом, перенимайте его стили. Лучше отдать предпочтение последовательности, чем вашим предпочтениям.

Автоматическое форматирование

Большинство современных IDE помогут вам отформатировать код по мере его ввода (например, когда вы создаете функцию, IDE автоматически делает отступы для выражений внутри тела функции).

Однако когда вы добавляете или удаляете код, или изменяете форматирование IDE по умолчанию, или вставляете блок кода с другим форматированием, форматирование может испортиться. Исправление форматирования для фрагмента или всего файла может вызывать головную боль. К счастью, современные IDE обычно содержат функцию автоматического форматирования, которая переформатирует либо выделенный фрагмент (выделенный мышью), либо весь файл.

Для пользователей Visual Studio


В Visual Studio параметры автоматического форматирования можно найти в меню Правка (Edit) → Дополнительно (Advanced) → Форматировать документ (Format Document) и Правка (Edit) → Дополнительно (Advanced) → Форматировать выделенный фрагмент (Format Selection).

Для пользователей Code::Blocks


В Code::Blocks параметры автоматического форматирования можно найти в меню клик правой кнопкой мыши в любом месте редактора → Format use AStyle (Форматировать с использованием AStyle).

Для облегчения доступа к этим функциям мы рекомендуем добавить сочетание клавиш для автоматического форматирования активного файла.

Лучшая практика

Для сохранения единообразия стиля форматирования кода настоятельно рекомендуется использовать функцию автоматического форматирования.

Теги

C++ / CppДля начинающихОбучениеПрограммирование

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.