Эпиграф
"Парад дурных запахов открывает дублирующийся код. Увидев одинаковые кодовые структуры в нескольких местах, можно быть уверенным, что если удастся их объединить, программа от этого только выиграет"
Кент Бек и Мартин Фаулер "Рефакторинг. Улучшение существующего кода"
Для чего нужно
Повторяющийся код - это плохо.
Повторяющийся код - это практически неизбежно.
Речь, конечно, идёт о проектах, объём исходного кода которых измеряется мегабайтами.
Цель данной разработки - помочь в поиске похожих блоков кода для дальнейшего выделения их в отдельные процедуры.
Умные слова
Блок кода - последовательность операторов, заключённая между двумя ключевыми словами языка 1С.
Лексема - минимальная значащая единица языка 1С. В этом смысле оператор "+" и строковая константа на 3 экрана равнозначны.
Сигнатура блока - строка, обобщённо описывающая блок кода. Может быть одинаковой для блоков, текст которых отличается.
Как работает
Для модуля строится синтаксическое дерево алгоритма, после чего каждой ветви дерева сопоставляется сигнутура.
При составлении сигнатуры предполагается, что значения имеют ключевые слова 1С, операторы, имена функций/методов и типы констант. Для единообразия сигнатуры операторов и методов выглядят одинаково.
Таким образом сигнатуры Сообщить("Привет, Мир!") и Сообщить("Мама мыла раму") будут одинаковыми, а Сообщить("Привет, Мир!") и Предупреждение("Привет, Мир!") - разными.
Результатом выполнения становятся ветви дерева, сгруппированные по сигнатурам и отфильтрованные от пересекающихся и вложенных блоков.
Предуведомление
Для создания вспомогательных структур данных обработка использует внешнюю компоненту, расположенную в макете обработки. На данный момент компонента может быть несовместима с платформой "1С: Предприятие 8.2".
Как с этим работать
В окне "Поиск и просмотр дублей" можно как запустить поиск дублей кода, просмотреть результаты сохранённого ранее поиска.
Параметры поиска:
Минимальная сигнатура - сигнатуры меньшей длины в результат поиска не включаются. Длина сигнатуры примерно в 2.5-3 раза больше количества лексем в блоке.
Минимальная подпоследовательность - количество строк кода, считающееся отдельным блоком. Если 0 - учитываются только блоки, заключённые между Цикл ... КонецЦикла, Тогда ... КонецЕсли и т.д.
Не учитывать тип констант - делает сигнатуры для кода переменная = 1, переменная = "1" и переменная = другаяПеременная идентичными.
Поиск:
Результаты поискка:
По окончании поиска или загрузки ранее сохранённого поиска в нижней части формы заполняются списки найденных блоков с одинаковой сигнатурой.
В левом списке перечисляются дубли в формате "{количество дублей}:{длина сигнатуры}"
При выборе одного из них в правом верхнем выводится список блоков в формате "[{начальная строка блока} .. {конечная строка блока} @ {имя файла модуля}] {первая строка блока}"
Ниже выводится сама сигнатура.
При выборе одного из блоков открывается окно с текстом его исходного кода.
Результаты поиска могут быть сохранены в файл для последующего анализа.