Perl では、オブジェクト コンストラクターで名前付きパラメーターを使用したい場合、何らかの検証が必要な場合、私のコードは少しぎこちないように見えます。
sub new {
my $class = shift;
my $self = {};
my %args = @_;
foreach my $argname (keys %args) {
if ($argname eq 'FOO') { $self->{$argname} = $args{$argname}; }
elsif ($argname eq 'BAR') { $self->{$argname} = $args{$argname}; }
elsif ($argname eq 'BAZ') { $self->{$argname} = $args{$argname}; }
…
else { die "illegal argument $argname\n"; }
}
bless $self;
return $self;
}
まず、一時的なハッシュ ( %args
) を持つのは少し不器用に思えます。第二に、チェーン全体if
が冗長で退屈に見えます。
後者は次のように簡略化できます
if ('-FOO-BAR-BAZ-'=~m/-$argname-/) { $self->{$argname} = $args{$argname} }
else { die "..."; }
しかし、これは改善できると思います。
値を確認する必要がある場合、if … elsif
チェーンはまだ必要ですか?
少し検索しましたが、より良いイディオムが見つかりません。ありますか (ある種の Perl OO フレームワークを使用する以外に)