Какие модули Perl полезны для проверки аргументов подпрограммы?
Я ищу модуль общего назначения, чтобы вывести drudgery из проверки подпрограмм и аргументов метода. Я просмотрел различные возможности в CPAN: Params::Validate
, Params::Smart
, Getargs::Mixed
, Getargs::Long
и несколько других.
Была бы оценена любая информация о плюсах и минусах этих или других модулей. Спасибо.
Ответы
Ответ 1
Если вы начнете использовать Moose
, вы найдете MooseX::Types
по своему усмотрению. Типы автоматически имеют тип is_ $type() и to_ $type(). Это делается для того, чтобы убедиться, что вы вводите ограничения типа ввода, или что ваш ввод имеет правильное принуждение к типу. Я люблю их лучше даже для этих типов вещей, потому что вы можете гарантировать, что состояние вашего объекта имеет указанные типы без каких-либо дополнительных затрат.
use Moose;
has 'foo' => ( isa => MyType, is => ro );
sub _check_my_type {
my ( $self, $type ) = @_;
is_MyType( $type );
};
Возможно, не хватает поддержки для глубоких/рекурсивных типов, но если вы используете этот материал в современном perl, вы, вероятно, "делаете это неправильно". Вместо этого используйте объект, который имеет свои собственные проверки согласованности (как и мой выше с MyType), и просто передайте объект.
Ответ 2
Посмотрите MooseX:: Method:: Signatures, который предоставляет немного больше, чем просто проверку аргументов.
Пример из POD:
package Foo;
use Moose;
use MooseX::Method::Signatures;
method morning (Str $name) {
$self->say("Good morning ${name}!");
}
method hello (Str :$who, Int :$age where { $_ > 0 }) {
$self->say("Hello ${who}, I am ${age} years old!");
}
method greet (Str $name, Bool :$excited = 0) {
if ($excited) {
$self->say("GREETINGS ${name}!");
}
else {
$self->say("Hi ${name}!");
}
}
MooseX:: Method:: Signatures также входит в стандартную комплектацию с MooseX:: Declare, который привносит еще более сексуальный синтаксис в пластинку Perl. Вышеприведенное может быть написано так (просто показывая первый метод для краткости):
use MooseX::Declare;
class Foo {
method morning (Str $name) {
$self->say("Good morning ${name}!");
}
}
Существует также следствие signatures Модуль CPAN для простых подпрограмм, но, к сожалению, он не так богат, как указано выше.
Ответ 3
В настоящее время я изучаю тот же вопрос, что и O.P.
Я заметил, что Дэйв Ролски - гиперпродуктивный программист славы Муза - недавно (2009) принял на себя обслуживание Params:: Validate, поэтому я считаю это хорошим знаком. Модуль не обновлялся с 2003 года. Поэтому, я думаю, он все еще может быть использован снова для проверки параметров подпрограммы.