如何决定是将代码放在子例程还是Perl脚本的主要部分?
我理解你是否需要重新使用代码,你会把它放在子程序中,但是如果你没有重用呢?将子程序放入分组代码并使其更易于阅读是不错的做法?
示例(主要内容):
my ($num_one, $num_two) = 1, 2;
print $num_one + $num_two;
print $num_one - $num_two;
示例(在子程序中):
my ($num_one, $num_two) = 1, 2;
add($num_one, $num_two);
subtract($num_one, $num_two);
sub add {
my ($num_one, $num_two) = @_;
return $num_one + $num_two;
}
sub subtract {
my ($num_one, $num_two) = @_;
return $num_one - $num_two;
}
我知道这是一个简单的例子,但是对于更复杂的代码(如果sub add和sub subtract有更多的代码),在子例程中分组是否有意义?
谢谢!
答案 0 :(得分:4)
您已经指出,如果代码位于子例程中,则代码更容易重用。我认为使用子程序至少还有其他三个很好的理由。
这些要点显然都是简化。但他们在某种程度上解释了为什么我的绝大多数代码都在子程序中。
答案 1 :(得分:4)
我想补充一点,使用subs添加了自我文档的元素。通过创建三行子,可以替换
my $sum;
my $count;
for (@levels) {
next if $_ >= 10;
++$count;
$sum += $_;
}
my $avg = $sum / $count;
与
my $avg = avg grep $_ >= 10, @levels;
更容易猜出“avg”会对某些循环产生什么影响,并且你不会错过第二版中的过滤器。
顺便说一句,即使你只调用一次代码,这个子代码对于很小的代码也是有用的,并且使用subs实际上可以占用更少的代码!在这种情况下,减少两个非空行。
sub avg {
my $acc;
$acc += $_ for @_;
return $acc / @_;
}
PS - 除了初始化代码之外,我避免将代码置于顶层。我将顶级代码放在块中以限制词法的范围并分离关注点。
{
my ($num_one, $num_two) = (1, 2);
add($num_one, $num_two);
subtract($num_one, $num_two);
}
答案 2 :(得分:2)
作为一般规则,如果您要多次重复一系列代码,请使用sub。随着您的脚本或应用程序的复杂性增加,您将在重构逻辑组织和可读性方面采取各种措施。精炼,精炼,精炼。 :)
答案 3 :(得分:2)
是的,即使子程序只调用一次,将程序分解为子程序也是良好做法。因为它提高了可读性。 想象一下,你有一个'for'循环或'if'语句,代码里面超过三页或更多......逻辑流程变得更难理解。 但是如果你有子程序(调用其他子程序) - 你可以轻松地将主循环或主程序放在一个页面上 - 更容易阅读,更容易维护。
还要考虑今天该代码只被调用一次,但是在6个月的时间内你可能会看到需要重用它 - 在这种情况下你可以简单地解除子程序。
所以,如果可能的话,总是使用子程序。