Устранение дублирования кода в единственном файле

К сожалению, проект, что я продолжал работать в последнее время, имеет большой объем кода копии-и-вставки, даже в единственных файлах. Есть ли какие-либо инструменты или методы, которые могут обнаружить дублирование или почти дублирование в единственном файле? Я имею Вне всякого сравнения 3, и это работает хорошо на сравнение отдельных файлов, но я в замешательстве для сравнения единственных файлов.

Заранее спасибо.

Править:

Спасибо за все большие инструменты! Я определенно проверю их.

Этот проект является проектом ASP.NET/C#, но я работаю со множеством языков включая Java; я интересуюсь тем, какие инструменты являются лучшими (для любого языка) для удаления дублирования.

10
задан Jon Onstott 2 February 2010 в 20:30
поделиться

8 ответов

Проверьте Атомик. Найдется дубликат кода, который является основным для извлечения в одном месте.

http://www.getatomiq.com/

4
ответ дан 4 December 2019 в 02:26
поделиться

Вот метод, который, я думаю, вам нужен:

[x_p, y_p] = find (points); 

% convert the subscripts to indicies, but transposed into a row vector
a = sub2ind(size(im), x_p, y_p)';

% assign all the values in the image that correspond to the points to a value of zero
im([a]) = 0; 

% show the new image
imshow(im) 
-121--2938745-

вы можете заставить mysqli создать постоянное соединение, предваряя p: к имени хоста, согласно php doc:

Однако подготовленные инструкции всегда закрыты между загрузками страниц, как обсуждалось здесь:

Извините, это не может быть сделано Подготовленные инструкции предназначены для загрузки одной страницы.

-121--2404229-

При использовании Eclipse можно использовать детектор копировальной пасты (CPD) https://olex.openlogic.com/packages/cpd .

2
ответ дан 4 December 2019 в 02:26
поделиться

Вот метод, который, я думаю, вам нужен:

[x_p, y_p] = find (points); 

% convert the subscripts to indicies, but transposed into a row vector
a = sub2ind(size(im), x_p, y_p)';

% assign all the values in the image that correspond to the points to a value of zero
im([a]) = 0; 

% show the new image
imshow(im) 
-121--2938745-

Используйте батут:

(declare f)

(defn h [n]
   (println "(h " n ")")
   #(f (+ n 1)))

(defn g [n]
   (println "(g " n ")")
   #(h n))

(defn f [n]
   (println "(f " n ")")
   #(g n))

Запустите его с помощью:

(trampoline f 0)

Этот код был запущен на моем компьютере в фоновом режиме в течение около 5 часов, и использование памяти плоское.

-121--2321920-

Решарпер делает это автоматически - он предлагает, когда он считает, что код должен быть извлечен в метод, и сделает извлечение для вас

0
ответ дан 4 December 2019 в 02:26
поделиться

См. SD CloneDR , инструмент для обнаружения кода копирования-вставки-редактирования внутри и между несколькими файлами. Он обнаруживает точные копии, копии, которые были переформатированы, и почти пропавшие копии с разными идентификаторами, литералами и даже разными последовательностями операторов.

CloneDR поддерживает множество языков, включая Java (1.4, 1.5, 1.6) и C #, особенно до C # 4.0. Вы можете увидеть образцы отчетов об обнаружении клонов на веб-сайте, в том числе отчет для C #.

1
ответ дан 4 December 2019 в 02:26
поделиться

Вы не говорите, какой язык вы используете, это повлияет на то, какие инструменты вы можете использовать.

Для Python существует CloneDigger . Он также поддерживает Java, но я этого не пробовал. Он может найти дублирование кода как в одном файле, так и между файлами, и выдает результат в виде отчета в формате HTML.

1
ответ дан 4 December 2019 в 02:26
поделиться

Вы можете косвенно перегружать echo () с помощью _ _ toString () магического метода так же, как

<?php
class CleanOutput
{
    public $content;

    public function __construct($c) {
        $this->content= $c;
    }

    public function __toString() {
        return $this->content . '\r\n';
    }
}

$text= new CleanOutput('Hello world!');
echo $text;
?>

Выше будет выводиться "Hello world!" с новой строкой и возвратом каретки в конце. Есть способы инкапсулировать это дальше, но они выходят за рамки моего ответа.

Отредактировать :
Как было отмечено, вышеуказанный раствор является медленным/неуклюжим. Вот более элегантное решение, использующее буферизацию выходных данных :

<?
function clean_up($foo) {
   return $foo . '\r\n';
}
ob_start('clean_up');
ob_implicit_flush(true);
echo "Hello world!";
?>

Это быстрее и чище (хотя технически это не "переопределяет" эхо).

-121--2478555-

"Доступ"? Это зависит от того, что вы имеете в виду под этим термином. Я предполагаю, что когда вы говорите "статическая функция", вы говорите об автономной функции, объявленной статической (т.е. объявленной с внутренней связью), в отличие от статической функции члена класса в C++, так как последняя очевидна и легко доступна из любого места.

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

Однако, если другие единицы перевода каким-то образом получают указатель на эту функцию (т.е. если вы каким-то образом допускаете, чтобы этот указатель "просочился" в внешний мир), то любой человек все равно может вызвать эту функцию, сделав идиотский вызов и, таким образом, "получить доступ" к ней. Например, если вы объявите

static void foo_static(void) {
}

extern void (*foo_ptr)(void) = foo_static;

, то в любом другом блоке перевода пользователь сможет сделать

extern void (*foo_ptr)(void);
foo_ptr();

и вызов перейдет к вашей функции foo _ static . Я не знаю, квалифицируется ли такой доступ как "доступ" в вашем вопросе.

-121--1871116-

Проверьте PMD , после того, как вы настроили его (что не так просто), можно запустить детектор копирования и вставки , чтобы найти дубликат кода.

0
ответ дан 4 December 2019 в 02:26
поделиться

Человек с некоторыми навыками работы с Office может выполнить следующую последовательность за 1 минуту:

  • использовать обычное средство форматирования для унификации стиля кода, желательно без переноса строк
  • загрузите текст кода в Microsoft Excel в виде одного столбца
  • найдите и замените все двойные пробелы одним и сделайте другие замены
  • сортируйте столбец

На этом этапе ключевые слова для дубликатов уже будут хорошо определены. Но чтобы пойти дальше

  • добавьте формулу компаратора во 2-й столбец и противодействуйте 3-му столбцу
  • , снова скопируйте и вставьте значения, отсортируйте и увидите наиболее повторяющиеся строки
0
ответ дан 4 December 2019 в 02:26
поделиться

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

0
ответ дан 4 December 2019 в 02:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: