Стили расстановки отступов при программировании на языке C
Использование пробелов
Стили расстановки скобок — не единственное поле, на котором происходят баталии войны стилей программирования. Способы использования пробелов также оказывают значительное влияние на читабельность вашего кода. Если вы думаете, что где-то должен быть, конечно, один стиль расстановки пробелов, которого придерживается каждый программирующий для максимизации читабельности своего кода, я боюсь, вы ошибаетесь. Здесь имеется столько стилей расстановки пробелов, сколько существует С-программистов.
Отступы
Что представляют собой правильные установки табуляции и отступов? Чаще всего выбирают два, три, четыре, восемь пробелов или ни одного. Я надеюсь, вы согласитесь, что мы можем отклонить нулевой вариант как делающий код полностью нечитабельным, но все другие варианты являются вполне читабельными. Большинство программистов начинают с использования заданной по умолчанию установки табуляции, которая часто имеет восемь колонок в ширину (но не обязательно; это зависит от вашего текстового процессора). Постепенно, особенно в случае большого числа уровней отступов, код начинает выглядеть немного растянутым:
int foo(int arr[А][В][С]) { int а, Ь, с, total = 0; for (а = 0; а < А; а++) { for(b = 0; Ь < В; Ь++) { fоr(с = 0; с < С; С++) { total += arr[a](b][c]; } } } return total; }
Поэтому многие уменьшают количество пробелов до четырех:
int foo(int bar[А][В][С]) { int a, b, c, total =
0; for(a = 0; a < A; a++) { for(b = 0; b
< B; b++) { for(c = 0; с < C;
С++) { total +=
bar[a][b][c]; } } } return total; }
Лично я пользовался таким способом на протяжении многих лет. Многим позже я обнаружил, что для моих целей наиболее удобными оказываются отступы в два пробела. Это была установка, от которой я не отступаю уже длительное время. Я приобрел привычку использовать два пробела, когда начал регулярно публиковать статьи в Usenet. Я использовал клавишу пробела вместо табулятора не только потому, что установка табулятора у моих читателей дает слишком широкий отступ, но мне также не нравилась сама идея вставки табуляции в публикации Usenet. Коль скоро такое решение было принято, я быстро обнаружил, что уменьшение количества символов пробела в 12 раз для трехуровневого отступа позволяет мне сэкономить немало времени, так что я начал использовать отступы в два пробела. К своему удивлению, я нашел, что мне нравится это больше, чем четыре пробела, так что теперь я использую два пробела все время.
Отступ в три пробела для многих С-программистов представляется неестественным. Тем не менее, он используется на некоторых сайтах, и при этом текст выглядит неплохо.
Какая же установка табуляции и отступа является правильной? Вы опередили меня, я знаю — действительно, нет одного правильного уровня. Если вашим проектом стандарта кодирования предусмотрена установка, которую вы должны использовать, выберите уровень, который, по вашему мнению, выглядит наиболее читабельно, используйте его последовательно в своей программе и будьте готовы пересмотреть свое мнение через некоторое время.
Табуляторы и мэйнфреймовские компиляторы
Некоторые мэйнфреймовские С-компиляторы не отвечают должным образом на вставку символов табуляции в исходные файлы. Если вы чувствуете, что попадаете в собственную ловушку, может оказаться необходимым потратить время (или деньги) на программный инструмент для замены табуляции пробелами. Фактически вы можете уже иметь такой инструмент. Например, редактор Microsoft Visual С++ имеет эту возможность.
Пробелы вокруг символов
Для улучшения читабельности программного кода следует творчески подходить к использованию пробелов. Снова-такигиет единственно правильного способа расстановки пробелов, но неправильных способов — множество. В приведенном ниже примере пробелы использованы скверно:
#include <stdlib.h> #include <stdio.h> #define P printf #define I atoi int main(int a,char*v []){int r=5, i;if(a>l ) r=l(v[lj); if(r<=0) r=5;if(r*2==0)++r;for (i=0; i<r*r; P(i/r== ( 3*r)/2-(iir+l)I|i/r== r/2 - i%r||i/r==r/2+i %r||i/r==i%r-r/2?"*-: " "),i++, I % r==0?P( "\n") : 0);return 0;}
(Если вы удивлены, что такое вообще может быть, спешу сообщить, что я не выудил это из материалов Международных соревнований по головоломному С-кодированию. Я написал этот текст лично, так что могу посылать его в IRC (Internet Relay Chat — Обмен дружескими посланиями через Internet) всякий раз, когда кто-то задает довольно общий для домашней работы вопрос, к которому этот код подходит. Выяснение вопроса о том, какие функции выполняет эта программа, я оставляю для вас в качестве упражнения. Сделать это сразу практически невозможно.)
Вероятно, наиболее эффективный способ повышения читабельности кода состоит в том, чтобы ставить пробелы вокруг бинарных операторов. Рассмотрим строку
a=b+c*d/e%f;
и строку
a = b + c*d/e%f;
Какую из них, по-вашему, легче читать? Именно так делаю я.
Некоторым людям нравится также устанавливать пробелы вокруг круглых скобок:
for ( foo = 0 ; foo < bar ; foo++ )
и даже вокруг прямоугольных скобок:
а [ baz ] = 0;
Лично мне кажется, что это уж чересчур усердное использование пробелов, но это стиль, с которым вы время от времени будете встречаться.