Clone Digger

 discovers duplicate code in Python and Java

Введение

Clone Digger - это средство, позволяющее находить клоны в исходных текстах программ на языках Python и Java.

Что такое клон?
Два фрагмента  программного кода называются клоном, если число отличий между ними невелико. Это означает, что один фрагмент может быть получен из другого при помощи нескольких небольших модификаций. Вполне возможно, что клон так и был получен: разработчик когда-то давно "скопипейстил" участок кода, потом оригинал изменил, а про копию забыл. Также клоны могут являться результатом не совсем удачного проектирования.

Чем плохо наличие клонов в программе?
Наличие в программе большого числа клонов затрудняет модификацию программы (добавлять новые возможности и исправлять ошибки). Надо помнить про все копии и при каждой модификации совершать множество однотипных действий. Хотите сделать сопровождение кода более лёгким? Найдите все клоны и произведите их рефакторинг.

Где я могу узнать про существующие средства и подходы?
Здесь. Clone Digger только-только появился на свет, поэтому в этом списке нет ни научной статьи, на которой он основан, ни его самого.

Чем средство Clone Digger лучше других средств?
Во-первых, Clone Digger - это единственное средство, поддерживающее язык Python (кроме совсем простых средств, которые не парсят программы, а работают с текстовым представлением исходных кодов).
Во-вторых, Clone Digger основан на новом алгоритме (описание), который позволяет находить клоны с достаточно сложными отличиями. В то же время используется информация о структуре операторов, что позволяет уменьшить количество ложных срабатываний.
В-третьих, это бесплатное средство (предоставляется под лицензией GPL)

Как им пользоваться?
Об этом можно прочитать здесь.
Стоит помнить, что поиск клонов похож на просеивание песка. Чтобы найти что-нибудь интересное, надо выбрать не слишком большой и не слишком маленький размер ячейки сита.
В Clone Digger есть два измерения ячейки: максимальное отличие между клонами (задается аргументом --distance-threshold) и минимальный размер клона (задается --length-threshold)

Удачных поисков!