主程序与子程序中的代码

问题描述 投票:0回答:4

如何决定是将代码放在 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 有更多代码),分组到子例程中是否有意义?

谢谢!

perl
4个回答
5
投票

您已经指出,如果代码位于子例程中,则更容易重用。我认为使用子例程至少还有其他三个充分的理由。

  1. 如果你的子例程写得很好(我的意思是它们不使用全局变量,它们有明确定义的返回点,而且它们很小——当然不超过一个屏幕的代码),那么你可以继续工作子程序中的代码而不关心代码的其余部分。这使您的代码更易于维护。
  2. 命名良好的子例程使您的代码更易于理解。如果您的主执行线仅调用六个名称良好的子例程,那么您的程序的作用立即显而易见。
  3. 子例程中的代码比子例程外的代码更容易测试。如果您的子例程位于单独的库中,那就更好了。测试套件只需加载库并依次尝试每个子例程,检查其是否具有正确的效果。

这些点显然都是简化的。但它们在某种程度上解释了为什么我的绝大多数代码都在子例程中。


5
投票

我想补充一点,使用 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);
}

2
投票

作为一般规则,如果您要多次重复一系列代码,请使用 sub。随着您的脚本或应用程序变得越来越复杂,您将需要采取各种措施来重构它以实现逻辑组织和可读性。精炼,精炼,精炼。 :)


2
投票

是的,将程序分解为子例程是好的做法,即使子例程仅被调用一次。因为它提高了可读性。 想象一下,您有一个“for”循环或一个“if”语句,其中的代码超过三页或更多……逻辑流程变得更难以理解。 但是如果你有子例程(调用其他子例程) - 你的主循环或 main if .. 可以很容易地放在一页上 - 更容易阅读,更容易维护。

还要考虑到今天该代码仅被调用一次,但在 6 个月后您可能会发现需要重用它 - 在这种情况下您可以简单地取消子例程。

所以,如果可能的话,总是使用子例程。

© www.soinside.com 2019 - 2024. All rights reserved.