假设我有sub1()和sub2()。 sub2仅从sub1调用。使用匿名子函数最小化sub2的范围是不错的做法,这样只有sub1可以看到sub2?
示例1(范围未最小化):
sub sub_called_only_in_calc {
#do s.th
#return s.th
}
sub calc {
my $n = sub_called_only_in_calc(1,2,3);
#...
return $n;
}
示例2(使用匿名子最小化范围):
sub calc {
#my or state
my $sub_called_only_in_calc = sub {
#do s.th
#return s.th
};
my $n = $sub_called_only_in_calc->(1,2,3);
#or
#my $n = sub {
#do s.th
#return s.th
#}->(1,2,3);
return $n;
}
答案 0 :(得分:4)
不同的人会有不同的意见,但我的观点是,在限制访问权限的情况下,使用词汇标量来定位子程序的访问可能是一种有用的技术;例如,当那些子程序被未经授权的人恶意调用时,通常是通过网页。
如果你正在考虑这样做只是为了防止编码错误(调用错误的子程序)或允许多个具有相同标识符的子程序,那么我会说你在浪费你的时间。无论如何,前者是一个微不足道的问题,我怀疑这个措施不会显着减少;而后者通常应该使用包来实现:它就是它们的设计目标。
大多数Perl模块通过在子例程标识符前加下划线来限制访问权限。
请记住拉里的这句话
Perl并没有对强制隐私感到迷恋。因为你没被邀请,所以你宁愿离开它的起居室,也不是因为它有霰弹枪
虽然Larry的许多原创想法可以被认为与Perl的更高版本无关,但我认为这个想法仍然存在。
答案 1 :(得分:3)
这取决于您优化的内容。在编写可维护代码时,优化可读性可能比优化最小范围更重要,因此您可以在模块中使用私有方法:
sub _only_called_in_calc {
...
}
sub calc {
my $result = _only_called_in_calc(1,2,3);
...
}
如果您担心可以使用其名称和包(如Foo::Bar::_only_called_in_calc(...)
)从任何地方调用私有函数,则可以将其存储在只能在同一文件中看到的词法变量中:< / p>
my $_only_called_in_calc = sub {
...
};
sub calc {
my $result = $_only_called_in_calc->(1,2,3);
...
}
此外,请考虑以下Perl最佳实践:
Place original code inline.
Place duplicated code in a subroutine.
Place duplicated subroutines in a module.
换句话说,除非您计划两次使用它,否则不要将代码放在当前范围之外。这背后的基本原理是,当您不需要重用代码时,不要公开接口。