Как я могу определить и удалить избыточный код в Perl? - PullRequest
7 голосов
/ 28 октября 2009

У меня есть кодовая база Perl, и есть много избыточных функций, и они распределены по многим файлам.

Есть ли удобный способ идентифицировать эти избыточные функции в базе кода? Есть ли какой-нибудь простой инструмент, который может проверить мою кодовую базу для этого?

Ответы [ 4 ]

10 голосов
/ 28 октября 2009

Вы можете использовать модуль B :: Xref для создания отчетов о перекрестных ссылках.

8 голосов
/ 28 октября 2009

Я сам сталкивался с этой проблемой в прошлом. Я собрал небольшую быструю программу, которая использует 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;
        }
    }
}
3 голосов
/ 28 октября 2009

Это может быть не удобно, но лучший инструмент для этого - ваш мозг. Пройдите весь код и получите представление о его взаимосвязях. Попробуйте увидеть общие закономерности. Тогда рефакторинг!

Я отметил ваш вопрос как " refactoring ". Вы можете найти некоторые интересные материалы на этом сайте, поданные по этой теме.

0 голосов
/ 28 октября 2009

Если вы работаете в Linux, вы можете использовать grep, чтобы составить список всех функций в вашей кодовой базе. Вам, вероятно, нужно сделать то, что предлагает Ether, и действительно пройти код, чтобы понять его, если вы этого еще не сделали.

Вот упрощенный пример:

grep -r "sub " codebase/* > function_list 

Точно так же вы можете искать дубликаты. Эта идея может быть менее эффективной, если вы используете возможность ООП в Perl.

Также стоит упомянуть NaturalDocs , инструмент для документирования кода. Это поможет вам двигаться вперед.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...