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

时间:2009-10-28 05:20:15

标签: perl refactoring

我有一个Perl代码库,并且有很多冗余功能,它们分布在许多文件中。

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

4 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:8)

我过去曾经遇到过这个问题。我打了一个快速的小程序,使用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;
        }
    }
}

答案 2 :(得分:3)

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

我用“refactoring”标记了您的问题。您可以在该网站上找到一些有趣的材料。

答案 3 :(得分:0)

如果您使用的是Linux,则可以使用grep来帮助您列出代码库中的所有功能。你可能需要做Ether建议的事情,如果你还没有,你可以通过代码来理解它。

这是一个过于简化的例子:

grep -r "sub " codebase/* > function_list 

您也可以通过这种方式查找重复项。如果您使用Perl的OOP功能,这个想法可能会失效。

也许值得一提的是代码文档工具NaturalDocs。这将有助于您前进。