【问题标题】:Perl: Named parameters validation best practicePerl:命名参数验证最佳实践
【发布时间】:2013-10-22 10:01:59
【问题描述】:

我在类方法调用中使用命名参数,想知道是否有最佳实践来确保不传递未知参数。这就是我正在做的事情

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();
    }
}

这是一种正确的前进方式,还是会导致性能问题?

最好, 马库斯

【问题讨论】:

    标签: perl validation parameters named


    【解决方案1】:

    您可以使用Params::Validate。另一种选择是Params::Check

    如果参数是固定的,那么最好在开发过程中对其进行验证,并可选择在生效时关闭验证。

    【讨论】:

    • 我投了赞成票,因为这两个模块似乎都对验证参数很有用。我不会将此作为可接受的答案,因为使用另一个模块来检查不需要的术语似乎有点过头了。无论如何,感谢您的努力!
    【解决方案2】:

    在 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);
    }
    
    猜你喜欢
    • 2011-09-24
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 2011-08-09
    • 2018-11-19
    • 1970-01-01
    相关资源
    最近更新 更多