Является ли использование прототипов для объявления контекста массива в аргументах подпрограммы хорошей вещью в Perl? - PullRequest
4 голосов
/ 22 октября 2010

В ответе связанный SO Эрик иллюстрирует способ вызова подпрограммы, которая принимает массивы по ссылке в качестве аргументов и использует прототипы, чтобы код вызывающей стороны мог передавать имена массивов без использования оператора ссылки\@;как встроенные модули, такие как push @array, $value do.

# Original code:
sub Hello { my ($x_ref, $y_ref) = @_; ...}
Hello(\@x, \@y);

# Same thing using array ref prototype:
sub Hello (\@\@$) {...}
Hello(@x, @y);

Мой вопрос: считается ли это наилучшей практикой?И каковы рекомендации по использованию шаблона?

Кажется, что этот шаблон должен использоваться ТОЛЬКО для встроенных функций или для 100% подпрограмм, которые принимают аргументы массива во всем вашем коде.

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

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

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

PS Мне не нужна книга Конвея, и я не припоминаю, обсуждал ли он когда-либо эту тему, чтобы опередить ответы RTFB.

Ответы [ 3 ]

4 голосов
/ 22 октября 2010

Используйте прототипы только тогда, когда вы пытаетесь расширить синтаксис Perl: например, если вы создаете Moose или что-то вроде примеров в Dominus '1001 * Higher Order Perl . Если вы делаете это, вы знаете достаточно, чтобы игнорировать PBP (и комментировать свой код, чтобы отключить Perl :: Critic). Если вы делаете что-то еще, не используйте их.

3 голосов
/ 22 октября 2010

Давайте спросим Perl::Critic:

echo "use strict; sub Hello (\@\@$) {...}" | perlcritic
Subroutine prototypes used at line 1, column 1.  See page 194 of PBP.  (Severity: 5)

Да, это было бы нет.

0 голосов
/ 22 октября 2010

Я склонен думать, что все, что заставляет подпрограмму действовать иначе, чем любая другая подпрограмма, не самое лучшее.Могут быть случаи, когда это хорошая идея, но в целом это более специальные случаи, документация и другие вещи, которые нужно запомнить.Чем больше ваш код работает, как большинство других кодов Perl, тем легче вам что-то делать для своих пользователей.

Обратите внимание, что это не главная жалоба, которую Perl Best Practices имеет с прототипами, которыеуродливый клудж в Perl.

...