如果潜艇真的非常相似,为什么不推广到一个潜艇呢?
my %validRequests = map {($_ => 1)} qq(UserDeleteRequest);
sub SendRequest {
my ($self, $request, $inputParam) = @_;
my $config = $self->getConfig();
return undef unless $validReqiests{$request}; # If want to verify
#
$inputParam = getInputParamDefault($request) unless $inputParam;
return $self->_doRequest (REQUEST => $inputParam,
PARAM => $inputParam));
}
如果某些类型的潜艇之间存在其他逻辑差异,您可以通过对继承进行适当的 OO 来解决它们,正如 Ilion 的回答所指出的那样;或者您可以采用更简单的方法,在更简单的情况下使用每个请求类型的帮助子引用哈希。
我添加了一个特殊的getInputParamDefault()
调用 get 来解决您的评论“有时函数的调用者不提供 $inputParam 然后我们必须找到默认的调用者并将其传递给 _doRequest 子例程。”
更新:如果由于遗留代码调用它们而无法重构而必须保留原始子名称,则可以自动生成它们(使用 AUTOLOAD 或手动添加到命名空间):
# Code not tested.
my %requestSubNames = ("UserDeleteRequest" => "UserDeleteRequest");
foreach my $requestType (sort keys %requestSubNames) {
no strict 'refs';
my $subName = __PACKAGE__ . "::$requestSubNames{$requestType}";
*{$subname} = sub { return $_[0]->SendRequest($requestType, $_[1]); };
# Note - this may need to be closure-tweaked, it's 5am and I'm a bit asleep
# Add to EXPORT/EXPORT_OK if needed
}