Подтвердить что ты не робот

Кто-нибудь знает о расширенном инструменте diff для С#?

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

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

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

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

4b9b3361

Ответ 1

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

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

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

ИЗМЕНИТЬ:
Это немного странно, но если бы вы чувствовали себя амбициозными, вы могли бы написать свои собственные портные для ваших конкретных потребностей.

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

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

Ответ 2

Ознакомьтесь с нашим инструментом Smart Differencer, в котором сравниваются абстрактные деревья синтаксиса, и сообщает о различиях в терминах нетерминалов ( "языковые конструкции" ) что АСТ представляют, и плавные действия редактирования (вставка, удаление, перемещение), а также обнаружение последовательного переименования.

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

EDIT 9/8/2009: С# SmartDifferencer теперь доступен для бета-тестеров.

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

EDIT Октябрь 2010: Доступны производственные версии. Eval downloads доступный на веб-сайте.

EDIT Май 2012. Вы можете увидеть пример С# на этой странице.

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

Ответ 3

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

Ответ 5

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

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

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

Ответ 6

Помимо сравнения Scooter Software скалы для этого, и это дешево ($ 30) тоже.

Ответ 7

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

Ответ 8

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

  • Прочитайте книгу о дизайне компилятора
  • Лекс/Разбор кода
  • Создание абстрактного дерева синтаксиса
  • Придумайте алгоритм для выполнения различий в дереве синтаксиса
  • Profit!

Ответ 9

Я использую KDiff и обнаруживаю, что он работает очень хорошо. И, конечно же, бесплатно.

Ответ 10

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

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

Ответ 11

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