我有一个Perl代码库,并且有很多冗余功能,它们分布在许多文件中。
是否有方便的方法来识别代码库中的冗余功能? 有没有可以验证我的代码库的简单工具?
答案 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。这将有助于您前进。