Недавно я работал над большой базой кода, проводил рефакторинг и вообще улучшал дизайн для увеличения охвата. Кроме того, во многих файлах я удалил лишние операторы использования, переместил методы, чтобы схожие функции были близки друг к другу, добавил области и т. Д., Но фактически не изменил функциональность кода в файле.
Между тем, в других местах команды другие разработчики исправляют ошибки и изменяют строки кода здесь и там. Очевидно, что когда дело доходит до слияния, это может быть проблемой, так как номера строк больше не совпадают, и методы могут быть перемещены.
Теперь я понимаю общее правило, что в среде, управляемой источником, может быть опасно перемещать методы, и мы решили, что выгода перевесила стоимость. Однако я не понимаю, почему так должно быть.
Скажите, что мой исходный файл был простым калькулятором:
public class Calculator
{
public int Subtract(int a, int b)
{
return a + b;
}
public int Add(int a, int b)
{
return a + b;
}
}
И я решил, что хочу, чтобы методы были в алфавитном порядке:
public class Calculator
{
public int Add(int a, int b)
{
return a + b;
}
public int Subtract(int a, int b)
{
return a + b;
}
}
В то время как другой разработчик исправил ошибку в методе вычитания
public class Calculator
{
public int Subtract(int a, int b)
{
return a - b;
}
public int Add(int a, int b)
{
return a + b;
}
}
Стандартный инструмент слияния, вероятно, потребует от вас объединения этих двух файлов вручную, но тот, который понимает функциональность кода, легко сможет согласовать эти два изменения. То же самое относится к удалению или добавлению других методов, комментариев, регионов или использования операторов.
Итак, чтобы (наконец-то!) Добраться до вопроса: существуют ли какие-либо инструменты слияния, которые имеют интеллектуальное понимание функциональности кода и могут объединить два файла выше без какого-либо вмешательства человека? Если нет, то почему? Существуют ли какие-либо осложнения, которые делают эту проблему неразрешимой (конечно, понять, что это не так просто, как я предполагаю, - но невозможно ли это по какой-то причине, которую я не вижу?)
Я использую C # в своем исходном коде и хотел бы что-то, что с этим работает, но меня интересует, существует ли это где-нибудь в мире программирования ...
Я уже очень обеспокоен продолжительностью этого вопроса, но отредактировал, чтобы добавить, как я ожидаю, что интеллектуальная исходная система будет работать:
Когда исходный файл калькулятора проверялся в системе, он анализировал файл и создавал иерархию класса:
File: Calculator.cs
|
|--Class[0]: Calculator
|
|--Method[0]: Subtract
|
|--Line[0]: return a + b;
|
|--Method[1]: Add
|
|--Line[0]: return a +b;
(с дополнительными строками для фигурных скобок и т. Д.)
Когда я проверяю свой код (делая методы алфавитными), он обновляет вышеприведенную иерархию, так что Subtract становится Method [1], а Add становится Method [0].
Второй разработчик проверяет свой код (который, очевидно, система управления исходным кодом знает на основе оригинала) и замечает изменение в первой строке вычитания. Теперь вместо того, чтобы находить этот номер за строкой в общем файле, он знает, что он может найти его Calculator.cs / Calculator / Subtract / 0, и тот факт, что метод изменил местоположение, не имеет значения, он все равно может сделать объединить работу.