如何识别和删除Perl中的冗余代码?

问题描述:

我有一个Perl代码库,并且有很多冗余功能,它们分布在很多文件中。如何识别和删除Perl中的冗余代码?

有没有一种方便的方法来识别代码库中的冗余功能? 是否有任何简单的工具可以验证我的代码库?

+1

我不完全确定你说“多余”时的意思。你是否在谈论所有做同样工作的多个潜艇?或者关于从未被调用的潜艇?或两者? – innaM 2009-10-28 09:13:01

您可以使用B::Xref模块生成交叉引用报告。

+0

我正在寻找这样的东西... – someguy 2009-10-28 08:09:13

它可能不方便,但最好的工具是你的大脑。浏览所有代码并理解其相互关系。尝试看看常见的模式。然后,重构!

我用“refactoring”标记了您的问题。你可能会在这个主题下找到一些有趣的材料。

+5

我喜欢库房风格的重构。 1.检查代码到git中。 2.确保你有很多测试。 3.将整个模块重新命名为不可用的东西。 4.创建一个空的。 5.将功能复制回去,随时重构它们,直到测试再次通过。 6.在不需要复制旧模块的功能一个月后,将其删除。 – 2009-10-28 07:18:57

+0

@Ether:你对重构是正确的...但首先我需要找到函数.. :) – someguy 2009-10-28 08:10:41

如果您在Linux上,您可以使用grep来帮助您列出代码库中的所有功能。你可能需要做Ether建议的内容,并且如果你还没有完全理解它,那么你可以通过代码去理解它。

这里是一个过于简单的例子:

grep -r "sub " codebase/* > function_list 

你可以找出重复的也是这样的。如果你使用Perl的OOP功能,这个想法可能不太有效。

它也许值得一提的代码文档工具NaturalDocs。这会帮助你前进。

+10

如果你使用Perl,考虑使用'ack',一个纯Perl版本的'grep'利用Perl更强大的正则表达式支持。 – 2009-10-28 05:58:37

我以前遇到过这个问题。我打了一个使用PPI查找子程序的快速小程序。它将代码标准化了一点(空白标准化,注释被移除)并报告任何重复。工作得很好。 PPI完成所有繁重工作。

通过将每个例程中的所有变量名归一化为$ a,$ b,$ c,并且可能为字符串做类似的操作,可以使规范化变得更加智能。取决于你想成为多么积极。

#!perl 

use strict; 
use warnings; 

use PPI; 

my %Seen; 

for my $file (@ARGV) { 
    my $doc = PPI::Document->new($file); 
    $doc->prune("PPI::Token::Comment");   # strip comments 

    my $subs = $doc->find('PPI::Statement::Sub'); 
    for my $sub (@$subs) { 
     my $code = $sub->block; 
     $code =~ s/\s+/ /;      # normalize whitespace 
     next if $code =~ /^{\s*}$/;    # ignore empty routines 

     if($Seen{$code}) { 
      printf "%s in $file is a duplicate of $Seen{$code}\n", $sub->name; 
     } 
     else { 
      $Seen{$code} = sprintf "%s in $file", $sub->name; 
     } 
    } 
} 
+0

不错!但为什么你需要忽略空的例程? – innaM 2009-10-28 09:11:38

+1

目的不仅仅是为了找到多余的代码,而是帮助删除它。运行过程中很明显,报告空白的例程很混乱。 'sub foo {}'没有错。当你考虑替代'* foo = \&DO_NOTHING'时,这与'my $ foo = $ EMPTY_STRING'一样愚蠢,应该都是有道理的。 – Schwern 2009-10-28 22:53:20