主要与子程序中的代码

时间:2012-06-14 15:08:51

标签: perl

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

谢谢!

4 个答案:

答案 0 :(得分:4)

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

  1. 如果您的子程序写得很好(我的意思是他们不使用全局变量,他们有明确定义的返回点,它们很小 - 当然只不过是一个充满代码的屏幕)然后你可以处理子程序中的代码而不关心其余的代码。这使您的代码更易于维护。
  2. 命名良好的子程序使您的代码更容易理解。如果你的主要执行线程只调用了六个名字很好的子程序,那么你的程序会立即显而易见。
  3. 子程序中的代码比子程序之外的代码更容易测试。如果你的子程序在一个单独的库中,那就更好了。测试套件只需加载库并依次尝试每个子程序,检查它是否具有正确的效果。
  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个月的时间内你可能会看到需要重用它 - 在这种情况下你可以简单地解除子程序。

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