如何识别和删除Perl中的冗余代码?
我有一个Perl代码库,并且有很多冗余功能,它们分布在很多文件中。如何识别和删除Perl中的冗余代码?
有没有一种方便的方法来识别代码库中的冗余功能? 是否有任何简单的工具可以验证我的代码库?
它可能不方便,但最好的工具是你的大脑。浏览所有代码并理解其相互关系。尝试看看常见的模式。然后,重构!
我用“refactoring”标记了您的问题。你可能会在这个主题下找到一些有趣的材料。
我喜欢库房风格的重构。 1.检查代码到git中。 2.确保你有很多测试。 3.将整个模块重新命名为不可用的东西。 4.创建一个空的。 5.将功能复制回去,随时重构它们,直到测试再次通过。 6.在不需要复制旧模块的功能一个月后,将其删除。 – 2009-10-28 07:18:57
@Ether:你对重构是正确的...但首先我需要找到函数.. :) – someguy 2009-10-28 08:10:41
如果您在Linux上,您可以使用grep
来帮助您列出代码库中的所有功能。你可能需要做Ether建议的内容,并且如果你还没有完全理解它,那么你可以通过代码去理解它。
这里是一个过于简单的例子:
grep -r "sub " codebase/* > function_list
你可以找出重复的也是这样的。如果你使用Perl的OOP功能,这个想法可能不太有效。
它也许值得一提的代码文档工具NaturalDocs。这会帮助你前进。
如果你使用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;
}
}
}
我不完全确定你说“多余”时的意思。你是否在谈论所有做同样工作的多个潜艇?或者关于从未被调用的潜艇?或两者? – innaM 2009-10-28 09:13:01