Какие модули Perl полезны для проверки аргументов подпрограммы? - PullRequest
10 голосов
/ 16 сентября 2009

Я ищу модуль общего назначения, чтобы избавить от рутинной работы при проверке аргументов подпрограмм и методов. Я просмотрел различные возможности CPAN: Params::Validate, Params::Smart, Getargs::Mixed, Getargs::Long и несколько других.

Будем благодарны за любую информацию, касающуюся плюсов и минусов этих или других модулей. Спасибо.

Ответы [ 3 ]

6 голосов
/ 16 сентября 2009

Если вы начнете использовать 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), и просто передайте объект.

5 голосов
/ 16 сентября 2009

Взгляните на 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}!");
    }
}

Существует также следствие подписи Модуль CPAN для простых подпрограмм, но, к сожалению, он не так богат, как указано выше.

2 голосов
/ 23 января 2011

Я сейчас изучаю тот же вопрос, что и О.П.

Я заметил, что Дейв Рольски - сверхпродуктивный программист из Moose Fame - недавно (2009) принял на себя обслуживание Params :: Validate, поэтому я считаю это хорошим знаком. Модуль не обновлялся с 2003 года. Поэтому, я думаю, его все еще можно будет снова использовать для проверки параметров подпрограммы.

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