如何决定是将代码放在 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 minus 有更多代码),分组到子例程中是否有意义?
谢谢!
您已经指出,如果代码位于子例程中,则更容易重用。我认为使用子例程至少还有其他三个充分的理由。
这些点显然都是简化的。但它们在某种程度上解释了为什么我的绝大多数代码都在子例程中。
我想补充一点,使用 subs 添加了自我文档的元素。通过创建一个三行子,可以替换
my $sum;
my $count;
for (@levels) {
next if $_ >= 10;
++$count;
$sum += $_;
}
my $avg = $sum / $count;
与
my $avg = avg grep $_ >= 10, @levels;
猜测“avg”的作用比某些循环要容易得多,并且您不会错过第二个版本中的过滤器。
顺便说一下,即使是小段代码,sub 也很有用,并且使用 sub 实际上可以占用更少的代码,即使您只调用一次!在这种情况下,少两行非空行。
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);
}
作为一般规则,如果您要多次重复一系列代码,请使用 sub。随着您的脚本或应用程序变得越来越复杂,您将需要采取各种措施来重构它以实现逻辑组织和可读性。精炼,精炼,精炼。 :)
是的,将程序分解为子例程是好的做法,即使子例程仅被调用一次。因为它提高了可读性。 想象一下,您有一个“for”循环或一个“if”语句,其中的代码超过三页或更多……逻辑流程变得更难以理解。 但是如果你有子例程(调用其他子例程) - 你的主循环或 main if .. 可以很容易地放在一页上 - 更容易阅读,更容易维护。
还要考虑到今天该代码仅被调用一次,但在 6 个月后您可能会发现需要重用它 - 在这种情况下您可以简单地取消子例程。
所以,如果可能的话,总是使用子例程。