Кто-нибудь знает о продвинутом инструменте сравнения для C #? - PullRequest
17 голосов
/ 21 июля 2009

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

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

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

У кого-нибудь есть такой инструмент?

Ответы [ 12 ]

22 голосов
/ 21 июля 2009

Я использую http://winmerge.org/

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

Даже если ваши функции будут переупорядочены, а функциональность исходного файла останется прежней, он все равно будет отображаться как разница из-за природы LCS.

РЕДАКТИРОВАТЬ:
Это немного надумано, но если вы чувствуете себя очень амбициозно, вы можете написать свой собственный, который будет соответствовать вашим конкретным потребностям.

вы могли бы использовать регулярные выражения для извлечения каждого метода в исходном файле и выполнять LCS diff для каждого метода в отдельности на основе его имени. Вы можете сохранить свой код в словаре (ключ, значение), чтобы ключ был именем метода, а значение - строкой функции. Затем вы просто переводите ваш dictionary_orig ['method'] с помощью dictionary_new ['method'].

Кроме этого, я не знаю, как бы вы достигли того, что искали.

9 голосов
/ 22 июля 2009

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

В настоящее время он обрабатывает только Java и COBOL, но основан на DMS, которая имеет парсеры для широкого спектра языков, включая C #.

РЕДАКТИРОВАНИЕ 08.09.2009: C # SmartDifferencer теперь доступен для бета-тестеров.

Инструмент уже обрабатывает согласованное переименование по всему файлу как семантически тривиальный (при условии, что ссылки на другие файлы соответственно переименованный символ), а также переименовывает в области видимости. Мы планируем учесть семантически тривиальные изменения, такие как как перемещение объявления метода в классе для Java и C #.

РЕДАКТИРОВАТЬ Октябрь 2010: Доступны производственные версии. Загрузка Eval доступно на сайте.

РЕДАКТИРОВАТЬ Май 2012 : Вы можете посмотреть пример C # на этой странице.

В настоящее время он не выполняет семантически нулевые правки. Частным примером является перетасовка методов в теле класса; мы все знаем, что это не влияет на семантику в C #. Наш инструмент сравнивает синтаксис (через AST), а не семантику, поэтому он не понимает этот конкретный нюанс и, следовательно, скажет пользователю, что «это было перемещено», а не молчит. Мы планируем обрабатывать подобные случаи когда-нибудь в будущем, но, эй, у каждого продукта должна быть версия 1: -} [В качестве тонкого замечания методы тасования в классе Java также семантически нулевые, но тасуют поля не связано с порядком оценки инициализаторов. Я не знаю, верно ли это и для C #, но меня это не удивит.]

6 голосов
/ 22 июля 2009

Хотели бы вы сделать сравнение на скомпилированных сборках? Если это так, .NET Reflector имеет доступную надстройку под названием Diff , которая позволяет сравнивать 2 сборки. Это определенно не заботится о том, где / как ваши объекты расположены внутри исходного файла.

3 голосов
/ 24 декабря 2010

Название этого инструмента - CodeCompare. Попробуйте - CodeCompare . Обязательная функция, называемая сравнение структур .

2 голосов
/ 26 июля 2016

Я считаю SemanticMerge очень полезным. Он отображает различия в наглядном виде и позволяет легко сравнивать сложный код C #.

2 голосов
/ 22 июля 2009

Beyond Сравнение Scooter Software стоит за это, и это дешево (30 долларов) тоже.

2 голосов
/ 22 июля 2009

Мне тоже интересно.Я не думаю, что он еще существует.Существуют «функциональные» (в отличие от просто текстовых) инструменты сравнения, доступные для других сценариев.Например, Microsoft Word интегрирует свою собственную функцию сравнения / слияния (которую можно создавать по сценарию, чтобы ее можно было интегрировать, например, с TortoiseSVN), а также есть несколько инструментов, доступных для XML, которые интерпретируют XML-файлы и не просто рассматривают их как текст.

Я не уверен, что дополнительная ценность такого инструмента по сравнению с хорошим текстовым инструментом diff / merge была бы достаточно убедительной, чтобы заслужить его разработку.ОТО, это может быть просто недостающее звено, решающее «боль слияния», которую мы все чувствуем, сталкиваясь со сложной ситуацией слияния.

Сложность, конечно, заключается в том, что вы должны интерпретировать код таким же образом, как компилятор C #делает.На данный момент самым близким инструментом, на мой взгляд, является NDepend. Этот пост в блоге объясняет некоторые его возможности в этом отношении.

1 голос
/ 22 июля 2009

Я знаю, что вы ищете инструмент.Но так как я ничего не знаю, вот как я мог бы сделать это:

  1. Прочитайте книгу по дизайну компилятора
  2. Lex / Разбор вашего кода
  3. Создать рефератДерево синтаксиса
  4. Изобретите алгоритм для выполнения различий в дереве синтаксиса
  5. Прибыль!
0 голосов
/ 26 октября 2015

Я думаю, что для сравнения файлов в Интернете вы должны использовать http://www.diffnow.com. Я использую эту опцию, имея возможность выбирать язык при сравнении, это очень приятно

0 голосов
/ 22 июля 2009

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

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

...