Инструмент для анализа и сравнения логики подобных функций? - PullRequest
8 голосов
/ 14 февраля 2012

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

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

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

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

Это звучит как сложный приказ, но кто-то пришелсреди инструментов, которые пытаются сделать что-то из этого?

Редактировать

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

Ответы [ 4 ]

6 голосов
/ 17 февраля 2012

Если вы загружаете предварительный просмотр для разработчика Visual Studio vNext Ultimate, он включает новую функцию обнаружения клонов кода: http://msdn.microsoft.com/en-us/library/hh205279(v=vs.110).aspx

http://blogs.msdn.com/b/zainnab/archive/2011/12/13/visual-studio-11-developer-preview-code-clone-detection-aka-code-clone-analysis.aspx

Ссылка для загрузки предварительного просмотра разработчика VisualСтудия: http://www.microsoft.com/download/en/details.aspx?id=27543

5 голосов
/ 20 февраля 2012

Если у вас есть ReSharper, то есть плагин ReSharper Agent Ralf .

Цитата на домашней странице агента Ральфа:

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

1 голос
/ 17 февраля 2012

В CodeRush есть функция обнаружения и консолидации дубликатов. (http://devexpress.com/Products/Visual_Studio_Add-in/Coding_Assistance/duplicate_code.xml)

Эта функция обнаружила повторяющийся код. я не уверен, что он способен обнаруживать / сравнивать логику подобных функций.

Надеюсь, что это поможет.

0 голосов
/ 23 февраля 2012

Вы всегда можете написать свой собственный код. Это подпадает под надлежащее модульное тестирование.

ЕСЛИ ваши аналогичные функции изменяют некоторый экземпляр / класс состояния, ТО затем используйте отражение, чтобы проверить, равны ли значения свойств результирующих классов.

Если ваши аналогичные функции изменяют базу данных, ТОГДА сделайте копию базы данных, запустите каждую функцию для копии и сравните.

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

Другой вариант - получить фактические требования к тому, что делают код / ​​функции. Изучение того, что ваша система на самом деле пытается выполнить, значительно упрощает рефакторинг старого или повторяющегося кода.


Инструменты, которые проверяют дублирование логики, приведут вас к тому, насколько вы готовы работать. Если вы говорите, что текущие инструменты не учитывают вложенные функции или функции, которые вызывают другие функции, то почему бы не изменить код, чтобы встроить эти вызываемые функции, чтобы ваш инструмент работал? Вы просто ищете панацею, если вы даже не хотите рефакторизовать метод A (который вызывает методы B, C, D) в метод AA, который включает код из B, C, D.

КОРОТКО с некоторой «работой» вы можете заставить текущие инструменты работать на вас. Возможно, вы захотите внести свой вклад в инструменты с открытым исходным кодом, чтобы компенсировать упомянутые вами ошибки.

...