Недавно я работал с большой базой кода, рефакторингом и, как правило, улучшал дизайн, чтобы увеличить охват. Кроме того, в целом ряде файлов я удалял избыток с помощью операторов, перемещал методы, чтобы аналогичные функции были близки друг к другу, добавляли регионы и т.д., Но фактически не изменяли функциональность кода в файле.
Между тем, в других местах команды другие разработчики исправляют ошибки и меняют строки кода здесь и там. Очевидно, что когда дело доходит до слияния, это может быть проблемой, поскольку номера строк больше не совпадают, и методы могут перемещаться.
Теперь я понимаю общее правило, что в среде с контролируемым источником может быть опасно перемещать методы, и мы решили, что это преимущество перевешивает стоимость. Однако я не понимаю, почему так должно быть.
Скажем, что мой начальный файл был простым калькулятором:
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;
}
}
Стандартный инструмент слияния, вероятно, потребует, чтобы вы вручную объединили эти два файла, но тот, который понимал функциональность кода, мог бы легко согласовать эти два изменения. То же самое относится к удалению или добавлению других методов, комментариев, регионов или использованию операторов.
Итак, чтобы (наконец!) дошли до вопроса: есть ли какие-либо инструменты для слияния, которые имеют разумное понимание функциональности кода и могут объединить эти два файла выше, без какого-либо вмешательства человека? Если нет, почему бы и нет? Существуют ли какие-либо осложнения, которые делают эту проблему неразрешимой (конечно, понять, что это не так просто, как я подразумеваю), но почему-то невозможно понять, что я не вижу?)
Я использую С# в своем исходном коде и буду любить что-то, что сработало с этим, но меня интересует, существует ли это где-нибудь в мире программирования...
Я уже очень беспокоюсь о длине этого вопроса, но отредактировал, чтобы добавить, как я ожидаю, что интеллектуальная исходная система будет работать:
Когда исходный файл калькулятора был проверен в системе, он будет разбирать файл и создавать иерархию класса:
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, а тот факт, что метод изменил местоположение, не имеет значения, он все равно может сделать слияние.