К сожалению, проект, что я продолжал работать в последнее время, имеет большой объем кода копии-и-вставки, даже в единственных файлах. Есть ли какие-либо инструменты или методы, которые могут обнаружить дублирование или почти дублирование в единственном файле? Я имею Вне всякого сравнения 3, и это работает хорошо на сравнение отдельных файлов, но я в замешательстве для сравнения единственных файлов.
Заранее спасибо.
Править:
Спасибо за все большие инструменты! Я определенно проверю их.
Этот проект является проектом ASP.NET/C#, но я работаю со множеством языков включая Java; я интересуюсь тем, какие инструменты являются лучшими (для любого языка) для удаления дублирования.
Проверьте Атомик. Найдется дубликат кода, который является основным для извлечения в одном месте.
Вот метод, который, я думаю, вам нужен:
[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 .
Вот метод, который, я думаю, вам нужен:
[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-Решарпер делает это автоматически - он предлагает, когда он считает, что код должен быть извлечен в метод, и сделает извлечение для вас
См. SD CloneDR , инструмент для обнаружения кода копирования-вставки-редактирования внутри и между несколькими файлами. Он обнаруживает точные копии, копии, которые были переформатированы, и почти пропавшие копии с разными идентификаторами, литералами и даже разными последовательностями операторов.
CloneDR поддерживает множество языков, включая Java (1.4, 1.5, 1.6) и C #, особенно до C # 4.0. Вы можете увидеть образцы отчетов об обнаружении клонов на веб-сайте, в том числе отчет для C #.
Вы не говорите, какой язык вы используете, это повлияет на то, какие инструменты вы можете использовать.
Для Python существует CloneDigger . Он также поддерживает Java, но я этого не пробовал. Он может найти дублирование кода как в одном файле, так и между файлами, и выдает результат в виде отчета в формате HTML.
Вы можете косвенно перегружать 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
. Я не знаю, квалифицируется ли такой доступ как "доступ" в вашем вопросе.
Проверьте PMD , после того, как вы настроили его (что не так просто), можно запустить детектор копирования и вставки , чтобы найти дубликат кода.
Человек с некоторыми навыками работы с Office может выполнить следующую последовательность за 1 минуту:
На этом этапе ключевые слова для дубликатов уже будут хорошо определены. Но чтобы пойти дальше
Есть инструмент анализа под названием Simian , который я еще не пробовал. Предположительно, он может работать с любым текстом и указывать на повторяющиеся элементы. Его можно использовать через интерфейс командной строки.