Применение методов поиска дублирующегося кода в процессе разработки программного обеспечения

Причины, которые значительно усложняют поддержку и развитие крупных программных продуктов. Определение схожести фрагментов кода. Процесс поиска клонов. Основные операции во время кодирования. Нативный алгоритм сравнения. Способы оптимизации алгоритма.

Рубрика Программирование, компьютеры и кибернетика
Вид статья
Язык русский
Дата добавления 10.08.2018
Размер файла 19,6 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Вологодский государственный университет

Применение методов поиска дублирующегося кода в процессе разработки программного обеспечения

Вахрушев Иван Николаевич, аспирант

Дублирование исходного кода - это одна из причин, которые значительно усложняют поддержку и развитие крупных программных продуктов. Со временем дублирующийся код появляется практически в любой системе независимо от того, насколько хорошо и качественно она была спроектирована и реализована изначально.

Дубликаты (клоны) - это фрагменты кода, которые полностью идентичны другим фрагментам кода или похожи на них (то есть совпадают за исключением некоторых параметров, например, имён переменных).

Для определения схожести фрагментов кода введём функцию S, множество допустимых значений которой лежит на отрезке [0, 1], т.е.

S(F1,F2) ? [0,1], ? F1,F2

где F1 и F2 - фрагменты кода.

Функция S обладает следующими свойствами:

S(F1,F2) == 1, если F1 == F2 (фрагменты полностью идентичны);

S(F1,F2) == 0, если F1? F2 , если (фрагменты полностью различны);

S(F1,F2) ? (0,1), если F1? F2 , если (фрагменты частично совпадают).

Конкретная реализация функции S может основываться, например, на расстоянии редактирования.

В общем случае алгоритм сравнения двух фрагментов кода должен использовать анализ строк (string matching) и возвращать логическое значение «истина», если фрагменты совпадают, или «ложь» в противном случае. Под алгоритмом сравнения мы будем понимать некоторую функцию A такую, что для любой пары одинаковых фрагментов кода F1и F2. Используя (1),расширим определение функции A, введя некоторое пороговое значение схожести фрагментов кода у:

A(F1,F2,у) ? true, ? F1,F2 , таких что, S(F1,F2) ? у

Изменяя значение у, можно управлять количеством обнаруживаемых клонов.

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

Согласно [1] процесс поиска клонов всегда включает два основных этапа: трансформацию кода и дальнейшее сравнение этого кода.

На этапе трансформации необходимо решить как минимум две проблемы: характер преобразования кода и минимальный размер фрагмента, который будет рассматриваться в качестве единицы кода. В дальнейшем алгоритм сравнения (2) будет оперировать этими самыми единицами.

В качестве подобного фрагмента целесообразно рассматривать отдельную строку кода. Это объясняется с одной стороны тем, что все основные операции во время кодирования, включая копирование и вставку, выполняются над одной или несколькими строками, а с другой стороны позволяет упростить предварительную обработку кода.

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

Характер преобразования кода определяет глубину и объём изменений. Для того чтобы обеспечить независимость от конкретного языка программирования, все операции на данном этапе должны быть сведены к манипуляциям над символьными строками. В качестве инструментария чаще всего используются абстрактные синтаксические деревья [2] или параметризированные строки [3], которые требуют как минимум реализации лексического анализатора для каждого поддерживаемого языка программирования.

Минимальное преобразование кода требует удаления всей незначащей информации: комментариев, пустых строк и лишних пробелов. Пример такой операции приведен на рис. 1.

До

int edit_blncC ( int /*iCurr*/)

{

return __TScrollBA< BALANCE >::editBalance( BALANCE_DB_BC, 1);

}

После

int edit_blncC(int)

{

Return __TScrollBA<BALANCE>::editBalance(BALANCE_DB_BC,1);

}

Рис. 1. Пример трансформации кода

Преобразование кода сокращает первоначальный исходный файл до упорядоченной коллекции «полезных» строк, с которой будет работать алгоритм сравнения (2). Полученный результат сохраняется в матрице совпадений с использованием координат сравниваемых сущностей, получаемых на основе их расположения в упорядоченной коллекции единиц кода.

Необходимо учитывать, что после процедуры сравнения матрица будет содержать только совпадения отдельных строк, а не целых последовательностей. Для получения более крупных фрагментов дублирующегося кода, необходимо произвести дополнительный анализ матрицы совпадений. В связи с этим целесообразно инкапсулировать конкретную реализацию матрицы в классе, и определить минимальный размер Nmin фрагментов-клонов. Введение параметра Nmin позволит сократить количество «неинформативных» результатов, то есть небольших дубликатов, которые вряд ли будут подвергнуты рефакторингу.

Нативный алгоритм сравнения имеет временную и пространственную сложность O(n2), где n - количество единиц кода. Квадратичная сложность делает его неприемлемым для использования на реальных программных продуктах, в которых количество строк кода может достигать нескольких миллионов.

Одним из возможных способов оптимизации данного алгоритма является использование ещё одного этапа предварительной обработки кода, требующего O(n) времени, на котором всё входное множество единиц кода разбивается на блоки с помощью хэширования [2]. Одинаковые строки имеют одинаковые хэш-значения, и будут помещены в один и тот же хэш-блок. Затем алгоритм сравнения будет оперировать этими хэш-блоками, число которых B в большинстве случаев будет меньше числа строк n на входе, однако временная сложность по-прежнему остаётся квадратичной от B.

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

она не должна зависеть от реализации конкретного алгоритма;

должна обеспечивать лёгкую и быструю смену используемых алгоритмов;

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

Список литературы

программный кодирование клон

1. Ducasse, S. A language independent approach for detecting duplicate code / S. Ducasse, M. Reiger, S. Demeyer. // In ICSM'99: Proceedings of the International Conference on Software Maintenance. - UK, Oxford, England. - 1999. - p. 109-118.

2. Baxter, I. Clone detection using abstract syntax trees / I. Baxter, A. Yahin, L. Moura. // In ICSM'98: Proceedings of the International Conference on Software Maintenance. - USA, Bethesda, Maryland. - 1998. - p. 368-377.

3. Baker, B. A program for identifying duplicated code / B. Baker // Computing Science and Statistics. - 1992. - № 24. - p. 49-57.

Размещено на Allbest.ru

...

Подобные документы

  • Теоретические сведения об алгоритмах поиска подстроки в строке. Глобализация информации в сети Internet. Интеллектуальный поиск. Алгоритм последовательного (прямого) поиска, Рабина и их применение. Анализ алгоритмов. Реализация программного кода.

    курсовая работа [230,8 K], добавлен 12.02.2009

  • Изучение возможностей среды программирования delphi при разработке приложения с визуальным интерфейсом. Отладка программных модулей с использованием специализированных средств. Способы работы с динамическими массивами. Оптимизация программного кода.

    курсовая работа [1,0 M], добавлен 23.12.2016

  • Описание и особенности некоторых алгоритмов архивации. Построение кода Хаффмана. Динамический алгоритм построения кода Хаффмана. Обратное восстановление текста. Способы двухступенчатого кодирования информации. Практическая реализация алгоритма LZ77.

    курсовая работа [51,7 K], добавлен 24.12.2012

  • Определение понятий кода, кодирования и декодирования, виды, правила и задачи кодирования. Применение теорем Шеннона в теории связи. Классификация, параметры и построение помехоустойчивых кодов. Методы передачи кодов. Пример построения кода Шеннона.

    курсовая работа [212,6 K], добавлен 25.02.2009

  • Исследование методов оптимизации программного кода на языке Си с помощью компилятора. Тестирование результатов утилитой optbench.c. Определение особенностей оптимизации компилятора на собственной программе. Удачные примеры быстроты и компактности кода.

    лабораторная работа [26,5 K], добавлен 17.12.2012

  • Анализ технических средств и современных технологий разработки программного обеспечения. Разработка программы для упрощения поиска студентов. Создание учетных записей администратора и обычного пользователя. Изучение правил построения программного кода.

    курсовая работа [1,9 M], добавлен 30.09.2016

  • Приложение для организации и контроля разработки программного обеспечения, сокращающее сроки проектирования программных продуктов и оптимизирующее данный процесс. Технологии создания приложений на платформе .NET. Алгоритм получения и обновления списка.

    дипломная работа [861,9 K], добавлен 27.11.2014

  • Понятие алгоритма как набора инструкций, описывающего порядок действий. Поиск в ширину - метод обхода графа и поиска пути в нем. Пример работы алгоритма поиска в ширину, его неформальное и формальное описание. Реализация с помощью структуры "очередь".

    курсовая работа [684,8 K], добавлен 05.04.2015

  • Возможности среды программирования delphi при разработке приложения с визуальным интерфейсом. Отладка программных модулей с использованием специализированных программных средств. Тестирование программного обеспечения. Оптимизация программного кода.

    курсовая работа [974,0 K], добавлен 21.12.2016

  • Двоичные деревья в теории информации. Двоичные кодовые деревья допускают интерпретацию в рамках теории поиска. Обоснование выбора, описание алгоритма и структур данных. Обоснование набора тестов. Построение оптимального кода. Сущность алгоритма Хаффмана.

    курсовая работа [241,6 K], добавлен 17.10.2008

  • Общие требования охраны труда во время работы, а также в аварийных ситуациях. Использование метрик программного продукта при ревьюировании. Проверка целостности программного кода и анализ потоков данных. Сценарии использования программного продукта.

    отчет по практике [2,0 M], добавлен 28.11.2022

  • Исследование проблемы сравнения звуковых файлов и определение степени их схожести. Сравнение файлов с использованием метода нечеткого поиска, основанного на метрике (расстоянии) Левенштейна. Сравнение MIDI-файлов и реализация алгоритмов считывания.

    курсовая работа [2,0 M], добавлен 14.07.2012

  • Обзор существующих технологий разработки программного обеспечения. Описание платформы NET Framework. Принцип работы платформы: компиляция исходного кода; процесс загрузки и исполнения кода; IL-код и верификация. Новые возможности платформы NET Framework.

    реферат [30,7 K], добавлен 01.03.2011

  • Обоснование выбора языка программирования. Описание разработки структуры программы. Спецификация переменных и процедур. Руководство оператора, словесный алгоритм. Состав информационной системы поиска квартир и характеристика её программных интерфейсов.

    отчет по практике [2,2 M], добавлен 15.09.2014

  • Выполнение отладки программных модулей с использованием специализированных программных средств. Тестирование, оптимизация кода модуля. Реализация базы данных в конкретной системе управления. Анализ проектной и технической документации на уровне компонент.

    дипломная работа [5,0 M], добавлен 08.06.2017

  • Рассмотрение свойств Web-ресурса, позволяющих решить выбранную задачу. Выбор графического режима Web-ресурса. Выбор программных продуктов для создания программного кода. Меры по защите пользователя от вредных воздействий, связанных с работой на ПК.

    дипломная работа [2,7 M], добавлен 07.07.2022

  • Описание алгоритма сортировки с двоичным включением, выбор структур данных. Пример сортировки массива, отсортированного случайным образом. Алгоритм покрытия по методу "Построение одного кратчайшего покрытия". Волновой алгоритм поиска длиннейшего пути.

    курсовая работа [78,2 K], добавлен 24.09.2010

  • Внешнее исследование программного продукта, анализ кода, блок-схемы алгоритма модуля. Оценка качества защиты программы средствами статического и динамического исследования. Осуществление "мягкого" и "жесткого" взлома. Пути оптимизации механизмов защиты.

    курсовая работа [1,3 M], добавлен 22.05.2016

  • Алгоритм обнаружения и расшифровки QR кода. Методы 3D реконструкции, стереозрение. Определение ориентации плоскости кода относительно камеры. Программное обеспечение для распознавания QR кода и определения его ориентации. Описание и тестирование продукта.

    дипломная работа [1,5 M], добавлен 15.05.2014

  • Исследование объектно-ориентированного подхода к проектированию программного обеспечения будильника. Модель программного обеспечения. Взаимодействие между пользователями и системой. Диаграммы и генерация программного кода при помощи средств Rational Rose.

    курсовая работа [355,8 K], добавлен 26.09.2014

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.