Data::Validatorでバリデーションする

hisaichi5518
2010-12-10

はじめまして!@hisaichi5518です。就活生です。誰か雇ってください。
Text::Xatenaについて書こうと思っていたんですが、もうText::Xatenaの記事が他のトラックにあるので、今日はgfxさんによってリリースされたData::Validatorを紹介しようと思います。

Data::Validator とは

実行時型チェック / パラメーターチェックが出来る便利なモジュールです。
現在、Params::Validateがデファクトスタンダードっぽいんですが、速度が遅かったりするので正直微妙です。

ベンチマーク

p5-Data-Validator/benchmark/simple.pl

Params::Validate/0.95
Smart::Args/0.06
Data::Validator/0.06
without type constraints
                   Rate   P::Validate P::Validate/off       S::Args D::Validator
P::Validate     20968/s            --             -1%          -44%         -67%
P::Validate/off 21144/s            1%              --          -43%         -67%
S::Args         37179/s           77%             76%            --         -42%
D::Validator    63999/s          205%            203%           72%           --

Data::Validatorが抜群に早いですね。素晴らしい。これは試してみないと!!!!
というわけで試しましょう。

Data::Validatorのインストール

    cpanm Data::Validator

CPANにも上がってるので簡単ですね!

Data::Validatorの使い方

    use Data::Validator;
    my $v = Data::Validator->new(
        hoge => { isa => "Num" },
    );
    my $args = $v->validate(hoge => 123);

これまた簡単!
isaだけなら、「 hoge => "Num" 」でも大丈夫です。
例えば、以下のようにすると「Invalid value for 'hoge': Validation failed for 'Num' with value str」と怒られます。

    my $args = $v->validate(hoge => "str");

isaは、Mouseのtype constraint名か任意のtype constraintオブジェクトを渡す事が出来ます。
Mouse::Util::TypeConstraintsのDefault Type Constraintsとかですね。
URIかどうか確かめたい!という時はこうします。

use Data::Validator;
use MouseX::Types::URI;

my $v    = Data::Validator->new( uri => { isa => 'URI' } );
my $args = $v->validate(uri => 'http://example.com/');

あらまあ、簡単。

use Mouse::Util::TypeConstraints;
use Data::Validator;

my $MyHash = subtype 'MyHash', as 'HashRef';
coerce $MyHash,
    from 'ArrayRef', via { +{ @{$_} } };

my $v = Data::Validator->new(
    foo => $MyHash,
);
$v->validate({ foo => { a => 42 } }); #=> { foo => { a => 42 } }
$v->validate({ foo => [ a => 42 ] }); #=> { foo => { a => 42 } }

なんて事も出来ます。これは、テストからコピペしたんですけども。

Data::Validatorをもっと詳しく知りたい場合はPODとか/t以下を見ればいいと思います。

まとめ

Data::Validatorかんたん、はやい、べんり!
これだけべた褒めしておいてなんですが、このモジュールはリリースされたばかりです。
みんなでたくさん使って、さらにいいものにしていきましょう!

「OSSは使って育てるもの。」by @__gfx__

次は、bayashiさんです!

関連リンク

Idea of Data::Validator
コンセプトとかが書かれています。
Data::Validatorの凝った使い方
ここでは説明してないメソッドwith()について書かれています。
Data::Validator
github
Data::Validator
CPAN