Глава 3. Стиль

Выравнивание строк текста
Пробелы

Программа на языке Perl представляет собой последовательность лексем — единиц языка, отделённых друг от друга одним или несколькими пробельными символами. Чаще всего используются в качестве разделителя лексем символы пробела, табуляции и конца строки.

Выбор конкретного пробельного символа-разделителя не важен с точки зрения синтаксических правил языка Perl; не важно также их количество. Можно использовать как разделители одни лишь символы пробела, и тогда текст программы составит единственную, возможно, очень длинную, строку:

use warnings; use BitSet; my $n=shift or die "Укажите число в командной строке\n"; my $sieve=BitSet->new(2..$n); for(my $p=2; $p<=$n; $p++) { while(not $sieve->isMember($p) and $p<=$n) { $p++; } last if $p>$n; print "$p\n"; for($i=2*$p; $i<=$n; $i+=$p) { $sieve->delete($i); } }

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

use warnings;
use BitSet;
my $n=shift or die "Укажите число в командной строке\n";
my $sieve=BitSet->new(2..$n);
for(my $p=2; $p<=$n; $p++)
{
while(not $sieve->isMember($p) and $p<=$n)
{
$p++;
}
last if $p>$n;
print "$p\n";
for($i=2*$p; $i<=$n; $i+=$p)
{
$sieve->delete($i);
}
}

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

use warnings;
use BitSet;
my $n=shift or die "Укажите число в командной строке\n";
my $sieve=BitSet->new(2..$n);
for(my $p=2; $p<=$n; $p++)
{
	while(not $sieve->isMember($p) and $p<=$n)
	{
		$p++;
	}
	last if $p>$n;
	print "$p\n";
	for($i=2*$p; $i<=$n; $i+=$p)
	{
		$sieve->delete($i);
	}
}

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

На наше счастье текстовый редактор VIM поддерживает правильное выравнивание текста программ на Perl: если очередная строка заканчивается открывающей фигурной скобкой, последующие строки вводятся с дополнительным отступом в один символ табуляции. Строка, начинающаяся с закрывающей фигурной скобки, отменяет этот дополнительный отступ. Если всё же потребуется ввести символ табуляции вручную, жмём на клавишу Tab (слева, прямо под клавишей Ё).

Выведенный на экран терминала символ табуляции сдвигает курсор вправо в ближайшую позицию табуляции. Позиции табуляции располагаются через каждые 8 символов. Такой отступ нам кажется слишком широким; хотелось бы, чтобы он стал вдвое уже. Чтобы добиться расстояния между позициями табуляции в 4 символа, открываем в VIM файл ~/.vimrc и в его конец добавляем строчку

Файл содержит команды персональной настройки VIM, которые исполняются при каждом запуске этого текстового редактора. Для других редакторов потребуются другие способы настройки.

В окне нашего броузера в листингах программ этого руководства позиции табуляции располагаются через 4 символа (мы специально позаботились об этом). Если же они располагаются через 8 символов, ваш броузер не позволяет регулировать ширину колонок табуляции. Тут уж ничего не поделать.

Ещё один случай, когда может потребоваться дополнительный отступ — слишком длинные команды:

return $field[$y][($x+1) % $width]
	+$field[($y+1) % $height][($x+1) % $width]
	+$field[($y+1) % $height][$x]
	+$field[($y+1) % $height][($x-1) % $width]
	+$field[$y][($x-1) % $width]
	+$field[($y-1) % $height][($x-1) % $width]
	+$field[($y-1) % $height][$x]
	+$field[($y-1) % $height][($x+1) % $width];

Мы советуем разрывать длинные выражения, делая после первого разрыва дополнительный отступ. Разрывать лучше по знаку оператора, перенося его на следующую строку (ни в коем случае не следует удваивать знак операции, как это принято в математике; если вы так поступите, Perl будет не в восторге). Старайтесь разрывать длинные команды по знакам оператора с низким приоритетом. Например, лучше разорвать выражение для многочлена по оператору сложения, хуже — по умножению, и совсем плохо — по оператору возведения в степень:

хорошоплохо
Perl
$p=1+2*$x+3*$x**2+4*$x**3+5*$x**4+6*$x**5 +7*$x**6+8*$x**7+9*$x**8+10*$x**9;
Perl
$p=1+2*$x+3*$x**2+4*$x**3+5*$x**4+6*$x**5+7 *$x**6+8*$x**7+9*$x**8+10*$x**9;
Perl
$p=1+2*$x+3*$x**2+4*$x**3+5*$x**4+6*$x **5+7*$x**6+8*$x**7+9*$x**8+10*$x**9;

Имеются и другие стили отступов, такой:

if(<STDIN> eq "y\n") {
	$a=$m+1;
} else {
	$b=$m;
}

или такой

if(<STDIN> eq "y\n")
	{
	$a=$m+1;
	}
else
	{
	$b=$m;
	}

Они представляются нам довольно уродливыми, однако это всего лишь наше мнение. Главное, что наличие определённого стиля в любом случае лучше, чем отсутствие какого-либо стиля.

Информатика-54© А. Н. Швец