Боюсь сказать, что не существует такой вещи, как алгоритм, который может проверить, что программа семантически идентична другой программе - это своего рода проблема остановки, и доказано, что она неразрешима.
Другим немного более автоматизированным методом будет сравнение результатов обеих программ. Тем не менее, это может быть сложно для любой большой программы, поскольку, вероятно, нет четко определенного диапазона ввода ...
возможно, пришло время написать модульные тесты, которых вам так не хватает?
edit: учитывая, что вы принимаете человеческие алгоритмы - это то, что я обычно делаю. Я хотел бы изучить код, который будет реорганизован, и понять его семантику. Напишите хотя бы модульный тест или какой-то автоматический тест для этой части базы кода. Выполните рефакторинг, затем посмотрите, прошел ли тест еще раз. Если это произойдет, у вас есть хороший шанс, что рефактор (*) ничего не сломал.
(*) здесь, я имею в виду, что рефакторинг изменяет реализацию / алгоритм и т. Д., А не просто переименовывает и перетасовывает код и превращает обычные строки кода в методы / базовые классы и т. Д. Те, которые вы можете увидеть практически при условии, что хорошее понимание кодовой базы.