Серия постов "Стандарты кодирования Perl". Часть 5: Лаконичность кода.

1. Сокращённая форма записи, основанная на ||

Если это не ухудшает читабельность кода, приветствуется использование сокращённой формы записи, основанной на применении логического оператора «или».

Например:

$a = $b || $c

лучше, чем

$a = $b ? $b : $c

и тем более лучше, чем

if ($b) {
    $a = $b;
}
else {
    $a = $c;
}

Также

$a ||= $b

короче и элегантнее, чем

unless ($a) {
    $a = $b;
}

2. Сокращённая форма записи, основанная на &&

Если это не ухудшает читабельность кода, приветствуется использование сокращённой формы записи, основанной на применении логического оператора «и».

$result = $switch && $value;

Данная конструкция присваевает значение $value переменной $result только в том случае, если $switch имеет true-значение. В противном случае будет присвоено значение $switch.

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

Метод method будет вызван только тогда,когда объект $obj проинициализирован.

$result = $obj && $obj->method;

Но лучше постфиксное условие:

$result = $obj->method if $obj;

Функция do_something будет вызвана только при выполнении условий $condition1 и $condition2

$condition1 && $condition2 and do_something();

Но лучше использовать постфиксный if,  т. к. Сразу бросается в глаза действие, а условие чаще всего вторично:

do_something() if $condition1 && $condition2; 

3. Используйте and и or вместо условных конструкций if при обработке фатальных ошибок

В ряде случаях (когда при каком либо условии нужно выполнить всего один оператор) удобнее выполнять условный код с помощью and или or, чем громоздить блоки if:

mkdir $tmpdir, 0700 or die "can't mkdir $tmpdir: $!";
$username = get_user_name() and print "Username: $username\n";

4. Минимизация использования циклов for и обращений к элементам по индексу

Старайтесь избегать использование классического цикла for с целочисленным индексом, везде, где это возможно. В целом, старайтесь минимизировать обращение к элементам массивов по индексам. При обработке элементов списка отдавайте предпочтение циклам foreach, а также функциям, обрабатывающим сразу весь список сразу, таким как grep, map, sort, join, split и т.д.:

@foo = grep !/^P/, @bar;
@foo = map { $_ * 10 } @bar;
$_  *= 10 for @bar;

При этом не переусердствуйте: не стоит использовать map в void-контексте, там где уместнее было бы использовать for.

Обычно требуется обработка всех элементов массива сразу, а в этом случае удобнее использовать циклы foreach или функции, обрабатывающие массив целиком. В случае использования foreach, grep, map элементы массива при каждой итерации предстают в виде переменной "$_" (или, для циклов foreach, любой другой переменной, какой Вы укажете), с которой работать куда удобнее, чем каждый раз обращаться к элементам массива по индексу.

Кроме того, часто необходим доступ только к крайним элементам массива (например, идёт процесс поэлементного заполнения массива и на каждой итерации мы добавляем новый элемент). В этом случае рекомендуется пользоваться функциями push, pop, shift, unshift. Применение этих функций позволяет получить более простой, компактный и БЫСТРЫЙ код. Сравните:

$cnt = 0;
while (condition) {
    ...
    $items[ $cnt++ ] = $value; # Калька с низкоуровневых языков
}

while (condition) {
    ...
    push @items, $value; # Короче и быстрее
}

5. Использование лаконичных вариантов функций DBI

Вместо последовательности DBI вызовов prepare / execute для изменения данных предпочтительнее использовать единственный вызов do.
Вместо последовательности DBI вызовов prepare / execute / fetch_* для выборки данных предпочтительнее использовать единственный вызов selectrow_* / selectall_* / selectcol_*.

 

Original: REG.RU coding standarts