我最近一直在研究一个大型代码库,重构和总体上改进设计以增加覆盖率。另外,在相当多的文件中,我使用语句删除了多余的部分,移动了方法,以便相似的功能紧密结合在一起,添加了区域等,但实际上并没有改变文件中代码的功能。
同时,在团队的其他地方,其他开发人员正在修复bug,并在各处更改代码行。显然,当涉及到合并时,这可能是一个问题,因为行号不再匹配,方法可能已经移动。
现在,我理解了一个一般规则,在一个源代码控制的环境中,四处移动方法可能是一件危险的事情,并且我们决定利益大于成本。但我不明白的是为什么会这样。
假设我的初始文件是一个简单的计算器:
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;
}
}
另一个开发人员修复了Subtract方法中的错误
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成为方法[1],Add成为方法[0]。
第二个开发人员检查他的代码(显然源代码管理系统知道这是基于原始代码),并注意到减法中第一行的更改。现在,它知道它可以找到calculator.cs/calculator/subtract/0,而且方法改变了位置这一事实并不重要,它仍然可以使合并工作正常,而不是在整个文件中逐行查找该行号。