Изменения

Перейти к: навигация, поиск

Perl code style

5360 байтов добавлено, 19:51, 3 ноября 2014
Нет описания правки
== Отступы и пробелы ==[[Category:Разработка]]Данная статья отражает моё мнение по поводу правильного стиля кода в Perl’е.
Оно '''не совпадает''' со стандартными рекомендациями perlstyle, потому что, ИМХО, оно '''лучше''' — приводит к гораздо более читаемому коду :) Кстати, аналогичный стиль я всегда использую при программировании и на других языках — и на Java, и на C/C++, и на JavaScript, и на PHP. Не получается только с убогим питоном — Гвидо же выпендрился, убрав фигурные скобки совсем… == Отступы, пробелы == Желательно, чтобы все строки укладывались в 100—120 символов, но это не следует рассматривать как жёсткое требование: мониторы по 80 символов в ширину сейчас редкость, а случаи, когда длинные строки читаемее коротких, встречаются. Размер отступа — строго 4 пробела либо 1 таб. Никаких смесей пробелов и табов — ни для «симуляции половины таба» (запрещается встречается стиль кода, где один 1 отступ = 4 пробела, а 2 отступа = 1 табтаб — такой стиль запрещается), ни для выравнивания условий if () или параметров функций по открывающейся скобке. Если в файле пробелы, то только пробелы; если табы — то только табы.
Каждый уровень выравнивается строго на +1 отступ.
}
</code-perl></s>
 
При переносе условия <tt>if ()</tt> на новую строчку логические операторы остаются в предыдущей строке:
 
<code-perl>
if ($a && $b && $c &&
$d && $e)
{
...
}
</code-perl>
После ключевых слов for, if и подобных всегда следует пробел:
<code-perl>for (my $a = 0; $a < 100; $a++) ...</code-perl>
После открывающих и перед закрывающими скобками пробелы НЕ СТАВЯТСЯ(есть извращенцы, считающие, что это повышает читаемость, а по-моему — это ужас). То есть вот так не пишем НИКОГДА:
<s><code-perl>if ( $a == 1 ) ...</code-perl></s>
 
После имён функций в вызовах пробелы не ставятся:
 
<code-perl>function($arg1, $arg2);</code-perl>
Пробелами обрамляется большинство операторов — присваивания, сравнения, логические, арифметические и т. п. Исключение могут составлять слагаемые в арифметических выражениях, например, <tt>$a*10 + 5</tt>.
 
Файл всегда должен заканчивается переводом строки.
== Блоки ==
</code-perl>
Для строк не следует использовать синтаксис q{}, qq{}. Обычных кавычек (<nowiki>('одинарных'</nowiki> и "двойных") </nowiki> вполне достаточно. HEREDOC — разрешён, но на крайний случай, для очень длинных строк.
Суффиксная запись if/unless/for допускается только для очень коротких одинарных и однострочных операторов. Даже если тело if’а или for’а однострочное, но условие длинное и его приходится переносить на следующую строчку — лучше предпочесть обычную запись с фигурными скобками. Если тело выглядит слишком коротким — лучше заставить себя добавить к нему комментарий:
ON table2.x=table.x
WHERE table.x=?
", undef, $x);
</code-perl></s>
 
== Программирование ==
 
Нежелательно пользоваться линейным поиском в массиве. Практически всегда лучше искать с помощью хеша.
 
DRY (!!!) Если блок кода повторяется хотя бы ДВА раза — повторение следует СРАЗУ убрать и вынести в функцию.
 
Никакого хардкода! Всё, что потенциально может различаться в разных системах и окружениях, должно быть вынесено из кода в параметры конфигурации.
 
Если в проекте используется база данных, всегда должен существовать явный способ её инициализации либо специальными скриптами инициализации, либо просто SQL-файлом, в обоих случаях входящими в код проекта и версионируемыми вместе с ним. Иными словами, если новую базу данных легче всего инициализировать копированием с существующей (боевой или тестовой) системы — это беспредел. Также очень желательно, чтобы были и скрипты миграций (то есть, обновления схемы) БД — опять-таки хотя бы просто SQL-файлами.
 
В SQL-запросах следует ВСЕГДА использовать bind-переменные, и лишь только в крайнем случае — подстановку значений с помощью <tt>$dbh->quote()</tt>.
 
Желательно использовать методы <tt>$dbh->select***</tt> и помнить о <tt>{Slice=>{}}</tt>, дающем возможность получить строчки из БД в самом удобном виде — в виде ссылки на массив хешрефов, например,
 
<code-perl>
my $rows = $dbh->selectall_arrayref("SELECT * FROM table WHERE x=?", {Slice=>{}}, $var1);
</code-perl>
 
Для получения ссылки на массив со значениями первой колонки — <tt>$dbh->selectcol_arrayref</tt>; для получения первой строчки в виде списка — <tt>$dbh->selectrow_array</tt>; иногда можно применять и <tt>$dbh->selectall_hashref</tt>.
 
При этом нежелательно без крайней необходимости использовать пары prepare/execute, построчный fetch и длинные списки переменных вместо хешей:
 
<s><code-perl>
my $sth = $dbh->prepare("SELECT ...");
$sth->execute($var);
while (my ($field1, $field2) = $sth->fetchrow_array)
{
...
}
</code-perl></s>
 
Пары prepare/execute и построчный fetch имеет смысл использовать только при потоковой обработке очень больших наборов данных, и в этом случае '''при использовании MySQL обязательно включить mysql_use_result'''.

Навигация