使用匿名子函数最小化Perl中的子范围是一种好习惯吗?

时间:2014-02-28 12:14:24

标签: perl scope anonymous-function subroutine anonymous

假设我有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;
}

2 个答案:

答案 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.

换句话说,除非您计划两次使用它,否则不要将代码放在当前范围之外。这背后的基本原理是,当您不需要重用代码时,不要公开接口。