Форум программистов, компьютерный форум, киберфорум
Бета-тестирование
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.53/30: Рейтинг темы: голосов - 30, средняя оценка - 4.53
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14

DuplicateFinder Preview 1.0

19.10.2020, 22:03. Показов 6602. Ответов 60
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как известно, самая главная проблема "грязного" кода - необходимость обновлять множество дубликатов одного и того же фрагмента. И бОльшая часть улучшений в хороших языках посвящены борьбе с дублированием. Но чтобы этими улучшениями воспользоваться, нужно сначала это дублирование найти. А при запросе в Google "поиск дублирования в коде программа" я не нашел ничего внятного. Большинство таких "программ" либо являются плагинами для конкретной IDE, либо их нельзя нормально установить, либо они содержат кучу ненужного функционала и стоят десятки, а то и сотни долларов. Поэтому я решил создать свою программу для поиска дублирования в коде, изолированную от IDE, запускаемую двойным кликом по исполняемому файлу в WinRAR и производящую только поиск дублирования и ничего другого.
Важно: я не собираюсь зарабатывать на этой программе. Она бесплатна, и создана для облегчения жизни программистам.
Преимущества:
1. Работает
2. Основана на самом известном алгоритме поиска повторов - Лемпеле-Зиве.
3. Обнаруживает только повторы длиной не меньше 6 лексем.
4. Длина словаря составляет 5000 лексем.
5. Обнаруживает даже частично повторяющиеся фрагменты!
6. Игнорирует тривиальные фрагменты, такие как одно свойство из нескольких лексем или вызов метода плюс-минус число.
7. Показывает, на каких строках и в каких позициях находятся дубликаты.
8. Показывает начало повторяющегося фрагмента кода и конкретные отличия.
9. Показывает текущую позицию в окне кода.
10. Остутствие привязки к ключевым словам конкретного языка. Работает для всех Си-подобных языков, а возможно, и для каких-то других.
11. Можно изменять размер окна.
12. Вычисления выполняются в отдельном потоке.
13. Минимум пересоздания строк вследствие конкатенации, что приводит к приемлемому времени работы даже на длинных кодах.
14. На случай длинного кода припасены полосы загрузки. Но, как правило, дубликаты находятся моментально.
15. Программа не содержит ненужного функционала, весит немного и не требует сложной настройки.
Недостатки:
1. Иногда сообщает о дублировании, которое нельзя устранить.
2. Вследствие приемущества 10, может посчитать последовательность ключевых слов как дубликат.
3. Обнаруживает только первую тривиальную длину. Если она маленькая, а есть больше, может ошибочно посчитать дубликат нетривиальным и выдать сообщение, что это проблема.
4. В выводимых фрагментах кода не сохраняет его пробельную структуру.
5. Не обнаруживает повторяющиеся комментарии.
6. Может включить в дубликат точку с запятой и перевод строки.
7. Не разбирается в том, класс это, функция, или что-либо другое.
8. Не показывает длину выделения в окне кода, только его начало.
9. Вероятно, потребляет больше памяти, чем можно было бы.
Ну как, нормально?
Вложения
Тип файла: rar DuplicateFinder Preview 1.0.rar (72.6 Кб, 25 просмотров)
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.10.2020, 22:03
Ответы с готовыми решениями:

preview - next
привет всем! Пытаюсь сделать ссылки предыдущ. и следущ. - никак не получается :wall: Беру из БД статьи и на странице отдельного...

Настройка preview
Гуру qt! Одно время очень хотел настроить комп для писания приложений на андроиде, даже скачал и установил нужные компоненты, но протом...

Taskbar Preview
Подскажите, пожалуйста, название компонента для работы с таскбаром?

60
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
20.10.2020, 12:55  [ТС]
Студворк — интернет-сервис помощи студентам
Билд пятый. Если не удалось распознать входной файл, программа выдает соответствующее сообщение.
Вложения
Тип файла: rar DuplicateFinder Preview 1.0.rar (73.3 Кб, 0 просмотров)
Тип файла: rar DuplicateFinder Preview 1.0 Autonomous.rar (23.22 Мб, 4 просмотров)
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
20.10.2020, 12:57  [ТС]
Цитата Сообщение от developer123 Посмотреть сообщение
Нужна папка. Вы же позиционируете программу как поиск повторяющихся кусков кода.
А как программа определит, какой файл с кодом, а какой с настройками проекта? Она же не знает, на каком это языке. Можно войти в папку, отфильтровать по расширению и перетащить. Поддерживается перетаскивание нескольких файлов.
0
107 / 65 / 0
Регистрация: 20.08.2013
Сообщений: 321
20.10.2020, 13:27
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
А как программа определит, какой файл с кодом, а какой с настройками проекта?
А ей не должно быть пофиг? Пусть делает то ради чего создавалась - ищет одинаковые части. Всякие бинарники можно и пропустить. Логику пропускания несложно набросать.
0
Эксперт .NET
 Аватар для Usaga
14745 / 9519 / 1364
Регистрация: 21.01.2016
Сообщений: 35,914
20.10.2020, 14:19
Цитата Сообщение от developer123 Посмотреть сообщение
Вроде компиляторы так работаю.
Ни один компилятор так не работает.

Цитата Сообщение от developer123 Посмотреть сообщение
Как показывает практика всё красиво идёт до определённого момента когда прилетает задача сделать совершенно офигительную фичу для клиента конкретно для этого класса. И пофиг что она полностью ломает логику. Менеджерам насрать на код. Им важна прибыль. И потом ещё и ещё.
Ну так, а причём тут обсуждаемый вопрос?)
0
Эксперт .NET
 Аватар для Usaga
14745 / 9519 / 1364
Регистрация: 21.01.2016
Сообщений: 35,914
20.10.2020, 14:58
Цитата Сообщение от developer123 Посмотреть сообщение
Вот прям ни один - ни один?
C#, Java, C++ (MS VC++, GCC, LLVM) и Си так не делают точно.

Цитата Сообщение от developer123 Посмотреть сообщение
При том что практика показывает что никогда сразу не определишь стоит ли что то вычленять и делать общим или не стоит. Конечно с опытом можешь смотреть дальше, но всего не предугадаешь. И на очередном рефакторинге разделяешь эти общие классы - и появляется в них одинаковый код.
Ну, так рефакторинг можно продолжить и вынести общий код в другие классы. И общий код останется и копипасты не будет. А какие-то тривиальные вещи можно и в виде копий оставить.

Добавлено через 4 минуты
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
А как программа определит, какой файл с кодом, а какой с настройками проекта?
В идеале (я понимаю, что это дико сложно) ваша программа должна не текст анализировать, а строить AST из кода класса и кешировать, а потом сравнивать именно AST. Тогда ваша программа сможет находить сложные случаи копипасты, когда логика одна и та же, но имена переменных и полей различаются.

Вы, помнится, просили какую-нибудь сложную задачу для практики. Мне кажется, что это вполне можно рассмотреть как задачу. Особенно если учесть, что это дело очень сильно пересекается с вашими попытками наваять какой-то интерпретатор или что вы там пишете.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
20.10.2020, 15:00  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Тогда ваша программа сможет находить сложные случаи копипасты, когда логика одна и та же, но имена переменных и полей различаются.
А представьте себе, что моя программа и так находит слегка отличающиеся фрагменты!
Цитата Сообщение от Usaga Посмотреть сообщение
Мне кажется, что это вполне можно рассмотреть как задачу.
Интерпретатор Unnamed2 строит AST.
0
Эксперт .NET
 Аватар для Usaga
14745 / 9519 / 1364
Регистрация: 21.01.2016
Сообщений: 35,914
20.10.2020, 15:04
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
А представьте себе, что моя программа и так находит слегка отличающиеся фрагменты!
Ну и отлично)
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
20.10.2020, 15:10  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Ну и отлично)
Вам дух противоречия мешает скачать и проверить, а я не шучу. Я бы сказал, что программа даже слишком навязчиво ищет слегка отличающиеся фрагменты, и сообщает об отличающихся даже не слегка.

Добавлено через 1 минуту
Если быть точным, моя программа считает дубликатами фрагменты, где общие начиная от 60% лексем.
0
Эксперт .NET
 Аватар для Usaga
14745 / 9519 / 1364
Регистрация: 21.01.2016
Сообщений: 35,914
20.10.2020, 15:15
Etyuhibosecyu, мне дух противоречия не мешает. Мы с ним друзья.

Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Если быть точным, моя программа считает дубликатами фрагменты, где общие начиная от 60% лексем.
Так это совсем не то. Это вариант нечёткого поиска. Поди ещё и порядок лексем не проверяется?
0
Всегда онлайн
 Аватар для MrOnlineCoder
1084 / 788 / 295
Регистрация: 07.04.2013
Сообщений: 2,703
20.10.2020, 15:16
Etyuhibosecyu, решил протестировать программу.

Рекомендую как то улучшить вывод дубликатов, как то визуально их показывать прямо в исходнике, а то мне вывело все в одну строку с CRLF.

Но вот одна проблема:

в этом примере кода программа находит дубликаты:


C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
 
void very1() {
    for (int i = 0; i < 100; i++) {
       printf("%d\n", i);
    }
}
 
void very2() {
    for (int a = 0; a < 100; a++) {
        printf("%d\n", a);
    }
}
 
 
int main() {
        very1();
        very2();
    return 0;
}
А в этом уже нет (убрал табуляцию во второй функции):

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
void very1() {
    for (int i = 0; i < 100; i++) {
       printf("%d\n", i);
    }
}
 
void very2() {
    for (int a = 0; a < 100; a++) {printf("%d\n", a);}
}
 
 
int main() {
        very1();
        very2();
    return 0;
}
Т.е. если в проекте один человек напишет код с одной табуляцией, его не очень умный коллега скопирует код, но его редактор отформатирует код по другому, то ваша программа не сработает, хотя это прямая копипаста?
0
Эксперт .NET
 Аватар для Usaga
14745 / 9519 / 1364
Регистрация: 21.01.2016
Сообщений: 35,914
20.10.2020, 15:21
А ТС сказал, что его софтина оперирует лексемами...
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
20.10.2020, 15:23  [ТС]
Цитата Сообщение от MrOnlineCoder Посмотреть сообщение
если в проекте один человек напишет код с одной табуляцией, его не очень умный коллега скопирует код, но его редактор отформатирует код по другому, то ваша программа не сработает, хотя это прямая копипаста?
Если код будет немного длиннее, то сработает.
Цитата Сообщение от Usaga Посмотреть сообщение
А ТС сказал, что его софтина оперирует лексемами...
Перевод строки считается лексемой, только и всего.
0
Эксперт .NET
 Аватар для Usaga
14745 / 9519 / 1364
Регистрация: 21.01.2016
Сообщений: 35,914
20.10.2020, 15:25
Etyuhibosecyu, лексер выделяя лексемы отбрасывает все не имеющие значения вещи. А это отступы и пробелы.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
20.10.2020, 15:26  [ТС]
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Если код будет немного длиннее, то сработает.
Вот пример, все работает.
Миниатюры
DuplicateFinder Preview 1.0  
0
Эксперт .NET
 Аватар для Usaga
14745 / 9519 / 1364
Регистрация: 21.01.2016
Сообщений: 35,914
20.10.2020, 15:30
Etyuhibosecyu, а ваше приложение распознаёт табуляцию как Whitespace? Проблема наверняка именно в этом.
0
Всегда онлайн
 Аватар для MrOnlineCoder
1084 / 788 / 295
Регистрация: 07.04.2013
Сообщений: 2,703
20.10.2020, 15:34
Etyuhibosecyu, второй тест. Взял достаточно объемный файл из исходников сервера nginx. Программа выдала кучу фрагментов с дубликатами, хотя (возможно я ошибаюсь, глубоко тот код не смотрел) в таком проекте копипасты не должно быть (по крайней мере в пределах одного файла).

Вывод программы прикрепил файлом (в пост не могу вместить).

Вот исходный текст, который я вставил:

https://github.com/nginx/nginx... tp_parse.c
Вложения
Тип файла: zip output2.zip (8.7 Кб, 4 просмотров)
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
20.10.2020, 15:44  [ТС]
Цитата Сообщение от MrOnlineCoder Посмотреть сообщение
хотя (возможно я ошибаюсь, глубоко тот код не смотрел) в таком проекте копипасты не должно быть (по крайней мере в пределах одного файла).
Посмотрел файл. Как же там не копипаста, когда она в чистом виде? Посмотрите внимательнее. Одно и то же повторяется по много раз.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
20.10.2020, 16:04  [ТС]
Билд шестой. Увеличен минимальный процент общих лексем до 67%. Исправлена ошибка в начислении отличий. Теперь предложенный в #30 код определяется как дубликат.
Миниатюры
DuplicateFinder Preview 1.0  
Вложения
Тип файла: rar DuplicateFinder Preview 1.0.rar (73.2 Кб, 0 просмотров)
Тип файла: rar DuplicateFinder Preview 1.0 Autonomous.rar (23.22 Мб, 6 просмотров)
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
20.10.2020, 16:07  [ТС]
Работает даже так.
Миниатюры
DuplicateFinder Preview 1.0  
0
Всегда онлайн
 Аватар для MrOnlineCoder
1084 / 788 / 295
Регистрация: 07.04.2013
Сообщений: 2,703
20.10.2020, 16:28
Etyuhibosecyu, интересно получается, какой код реального проекта не возьму, всегда программа находит дубликаты. Я так понимаю, это доказательство того, что ничто не идеально?

https://github.com/torvalds/li... nit/main.c файл с точкой входа ядра Linux тоже полсотни дубликатов имеет (конечно не считая определенные места где без этого никак, по типу syscall0, syscall1 и т.д.)

А кстати, Вы прогоняли исходники самой же программы через нее же?

Просто я не могу понять - Ваша программа пытается действительно улучшить код и упростить рефакторинг, или это просто поиск разных текстовых фрагментов без контекста?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.10.2020, 16:28

Preview Panel
Всем привет. Сталкивался ли кто нибудь с задачей отображения странички как почта в толстом клиенте, с возможностью превью панели? Рылся...

Preview Pane
Коллеги! Подскажите имеется ли возможность узнать что документ просматривается в Preview Pane, нужно скрыть кнопки или выдать коварное...

Вывод preview
Здравствуйте. Имеется 2 странички. index.php и classes.php есть задание: Для всех типов статей добавить новый атрибут: $preview. В...

Ошибка FastReport Preview
Всем привет! Вобщем хочу я вывести отчет в FastReport но выдает ошибку. В чем дело не знаю работал с ним последний раз года 3 назад. А...

Получить preview картинок
Как получить preview картинки как в приложении? нашел только как получить иконку pictureBox1.Image =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru