Какова наилучшая практика использования perl-isms (идиоматических выражений) в Perl?
пару лет назад я участвовал в написании лучших практик/стиля кодирования для нашей (довольно большой и часто использующей Perl) компании. Это сделал Комитет" старших " разработчиков Perl.
как и все, что было сделано консенсусом, у него были части, с которыми все не согласились. Да.
часть, которая терлась больше всего, была сильной рекомендацией не использовать много Перлизмов (свободно определенных как идиомы кода, отсутствующие, скажем, в C++ или Java), таких как "избегайте использования"... если только X; 'constructs".
основным обоснованием для таких правил, как этот, было то, что разработчикам без Perl было бы намного сложнее работать с базой кода Perl в противном случае. Предположение здесь я предполагаю, что жокеи кода Perl более редки в целом - и среди новых сотрудников компании - чем не-Perlers.
Мне было интересно, есть ли у SO хорошие аргументы для поддержки или отклонения этой логики... это в основном академическое любопытство на данный момент, как кодирование Perl компании стандарт окостенел и, насколько мне известно, никогда не будет пересмотрен.
P.S. Чтобы быть ясным, вопрос находится в контексте, который я отметил-ответ на все-Perl меньший магазин разработки, очевидно, громкий "использовать Perl для его максимальной возможности".
6 ответов
какие перлизмы вы имеете в виду?
хорошо:
- идиоматический для циклов:
for(1..5) {}
илиfor( @foo ) {}
- скалярная контекстная оценка массивов:
my $count = @items;
-
map
,grep
иsort
:my %foo = map { $_->id => $_ } @objects;
OK если ограничено:
- управление модификатором оператора-трейлинг if, unless и т. д.
- ограничить задержку ошибок и ранние возвраты.
die "Bad juju\n" unless $foo eq 'good juju';
- As Шверн отметил, что другим хорошим использованием является условное присвоение значений по умолчанию:
my $foo = shift; $foo = 'blarg' unless defined $foo;
. Это использование, IMO, чище, чемmy $foo = defined $_[0] ? shift : 'blarg';
. - причина избежать: если вам нужно добавить дополнительные поведения к проверке или еще, у вас есть большое задание переформатирования. ИМО, хлопоты по повторению заявления (даже в хорошем редакторе) более разрушительны, чем ввод нескольких "ненужных" блоков.
- ограничить задержку ошибок и ранние возвраты.
- прототипов - использовать только для создания filtery функции, такие как
map
. Прототипы-это подсказки компилятора, а не "прототипы" в смысле любого другого языка. - логические операторы-стандартизируйте, когда использовать
and
иor
и&&
и||
. Весь ваш код должен быть последовательным. Лучше всего использовать политику Perl::Critic для принудительного применения.
избегать:
- локальные переменные. Динамическая область чертовски странная, и
local
- это не то же самое какlocal
где-либо еще. - переменные пакета. Включает плохие практики. Если вы думаете, что вам нужно глобально общее состояние, рефакторинг. Если вам все еще нужно глобально общее состояние, используйте singleton.
- символ таблицы hackery
Я пишу код, предполагая, что компетентный программист Perl будет его читать. Я не из кожи вон лезу, чтобы быть умным, но и дурачиться не собираюсь.
Если вы пишете код для людей, которые не знают языка, вы пропустите большую часть смысла использования этого языка. Я часто нахожу, что люди хотят запретить Перлизмы, потому что они отказываются узнать больше, чем они уже знают.
поскольку вы говорите, что находитесь в небольшом магазине Perl, это должно быть довольно легко спросить человека, который написал код, что это значит, если вы его не понимаете. Такие вещи должны появляться в обзорах кода и так далее. Все продолжают узнавать больше о языке, поскольку у вас есть периодические и регулярные шансы Просмотреть код. Вы не должны позволять слишком много времени протекать без других глазных яблок, смотрящих на чей-то код. Вы, конечно, не должны ждать до недели после того, как они покинут компанию.
Что касается новых сотрудников, я всегда озадачен, почему кто-то подумает что вы должны посадить их перед клавиатурой и отпустить, ожидая продуктивной работы в кодовой базе, которую они никогда не видели.
Это не ограничивается Perl, либо. Это общая проблема программирования. Вы всегда должны больше узнавать о своих инструментах. В большинстве больших магазинов, которые я знаю, есть мини-буткэмпы, чтобы ускорить разработчиков на базе кода, включая любые биты хитрого кода, с которыми они могут столкнуться.
Я задаю себе два простых вопроса:
- я делаю это, потому что это дьявольски умно и/или демонстрирует мои обширные знания о Perl arcana?
тогда это плохая идея. Но,
- я делаю это, потому что это идиоматический Perl и выгоды от различных преимуществ Perl?
тогда это хорошая идея.
Я не вижу оправданной причины отклонять, скажем, интерполяцию строк только потому, что Java и C нет. unless
забавно, но я думаю, что подпрограмма начинается со случайного
return undef unless <something>;
не так уж и плохо.
должно быть, это было, как вы говорите, несколько лет назад, потому что Дамиан Конвей "загнал рынок в угол" по стандартам Perl с Perl Лучшие Практики за последние несколько лет.
Я работал в аналогично окостенелой среде-где нам не разрешалось принимать последние лучшие практики, потому что это было бы изменение, и никто на достаточно высоком уровне в корпоративной структуре не понимал (или не мог потрудиться понять) Perl и подписаться на переезд в 21-й век.
корпорация, которая развертывает технологию и сохраняет ее, но не покупает опыт или не тренируется в доме, это прошу для неприятностей.
(Я бы предположил, что вы работаете в сильно контролируемой изменениями среде-финансовой, возможно?)
Я согласен с Брайаном об этом кстати.
Я бы сказал Лось убивает 99.9% Perl-измов, по соглашению, которые не должны использоваться: хакерство таблиц символов, повторная обработка объектов, общие нарушения черного ящика: обработка объектов как массивов или хэшей. Самое замечательное, что он делает все это, не принимая функциональный удар "не используя его".
Если "perl-isms", на которые вы действительно ссылаетесь, являются формой мутатора (предупредите "плохую идею", если $good_idea),unless
и until
тогда я не думаю, что у вас действительно есть много аргумент, потому что эти "перлизмы", похоже, не препятствуют читаемости ни для пользователей perl, ни для пользователей без perl.
возьмите копию эффективное Программирование Perl: способы писать лучше, более идиоматичный Perl (2-е издание), и рассматривайте это как руководство. Он содержит многие из лучших идиом и упакован с небольшими битами информации, которая заставит вас писать хороший Perl стиль Perl код, в отличие от C или Java (или что-то еще) стиль Perl код.