3

クラス メソッド呼び出しで名前付きパラメーターを使用していますが、不明なパラメーターが渡されないようにするためのベスト プラクティスがあるかどうか疑問に思っていました。これが私がやっていることです

sub classmethod {
    my $self = shift;
    my %args = (
        "param1" => "default1",
        "param2" => "default2",
        @_
    )

    if (my @invalid = grep { !/^(param1|param2)$/ } keys %args) {
        croak "received unknown arg(s) ".join(",", @invalid)." from ".caller();
    }
}

それは前進するための適切な方法ですか、それともパフォーマンスの問題を引き起こす可能性がありますか?

最高、マーカス

4

2 に答える 2

1

Perl でパラメーターを渡す方法は多数あり、それらを検証する (または検証しない) 方法も多数あります。

とにかく明示的なデフォルトのイディオムを使用していて、軽いタッチが必要な場合は、ハッシュのキーの数がデフォルトのキーの数と等しいことを確認できます。キーの数の取得は、ハッシュ テーブルのサイズや内容に依存しない高速な操作です。にないキーが「に」@_ある場合は%default%argsより多くのキーがあります。

これが現在のソリューションよりも優れているという欠点は、どのキーが予期しないものであるかがわからないことです。

sub classmethod {
    my $self = shift;
    my %args = (
        param1 => "default1",
        param2 => "default2",
        @_
    );
    keys %args == 2 or croak "received unknown arg. args: " . join(", ", keys %args);
}

または、パラメーターの数を変更するときに数を変更する必要がないように、このようなことを行います。

sub classmethod {
    my $self = shift;
    my %default = (
        param1 => "default1",
        param2 => "default2",
    );
    my %args = (%default, @_);

    keys %args == keys %default or croak 'unknown arg' . join(", ", keys %args);
}
于 2016-12-28T07:06:17.883 に答える