Ich habe mich kürzlich durch eine große Codebasis gearbeitet, Refactoring und allgemeine Verbesserung des Designs, um die Abdeckung zu erhöhen. Außerdem habe ich in einigen Dateien überflüssige using-Anweisungen entfernt, Methoden so verschoben, dass ähnliche Funktionen nahe beieinander liegen, Regionen hinzugefügt usw., aber die Funktionalität des Codes in der Datei nicht wirklich geändert.
In der Zwischenzeit sind andere Entwickler im Team damit beschäftigt, Fehler zu beheben und hier und da Codezeilen zu ändern. Bei der Zusammenführung kann dies natürlich ein Problem darstellen, da die Zeilennummern nicht mehr übereinstimmen und die Methoden möglicherweise verschoben wurden.
Ich weiß, dass es in einer quellenkontrollierten Umgebung gefährlich sein kann, Methoden zu verschieben, aber wir haben beschlossen, dass der Nutzen die Kosten überwiegt. Was ich jedoch nicht verstehe, ist, warum das so sein sollte.
Nehmen wir an, meine ursprüngliche Datei war ein einfacher Taschenrechner:
public class Calculator
{
public int Subtract(int a, int b)
{
return a + b;
}
public int Add(int a, int b)
{
return a + b;
}
}
Und ich habe beschlossen, dass die Methoden alphabetisch geordnet sein sollen:
public class Calculator
{
public int Add(int a, int b)
{
return a + b;
}
public int Subtract(int a, int b)
{
return a + b;
}
}
Während ein anderer Entwickler den Fehler in der Subtraktionsmethode behoben hat
public class Calculator
{
public int Subtract(int a, int b)
{
return a - b;
}
public int Add(int a, int b)
{
return a + b;
}
}
Mit einem Standard-Zusammenführungswerkzeug müssten Sie diese beiden Dateien wahrscheinlich manuell zusammenführen, aber ein Werkzeug, das die Funktionalität des Codes könnten diese beiden Änderungen leicht miteinander in Einklang bringen. Das Gleiche gilt für das Entfernen oder Hinzufügen anderer Methoden, Kommentare, Regionen oder using-Anweisungen.
Um also (endlich!) zur Frage zu kommen: Gibt es irgendwelche Merge-Tools, die ein intelligentes Verständnis für die Funktionalität von Code haben und die beiden obigen Dateien ohne menschliches Zutun zusammenführen könnten? Wenn nicht, warum nicht? Gibt es irgendwelche Komplikationen, die dies zu einem unlösbaren Problem machen (natürlich verstehe ich, dass es nicht so einfach ist, wie ich annehme - aber ist es aus irgendeinem Grund unmöglich, den ich nicht erkennen kann)?
Ich benutze C# in meinem Quellcode und würde gerne etwas haben, das damit funktioniert, aber ich bin daran interessiert, ob es das irgendwo in der Welt der Programmierung gibt...
Ich bin schon sehr besorgt über die Länge dieser Frage, aber ich habe sie bearbeitet, um hinzuzufügen, wie ich mir die Funktionsweise des intelligenten Quellensystems vorstellen würde:
Beim Einchecken der ursprünglichen Calculator-Datei würde das System die Datei analysieren und eine Hierarchie der Klasse erstellen:
File: Calculator.cs
|
|--Class[0]: Calculator
|
|--Method[0]: Subtract
|
|--Line[0]: return a + b;
|
|--Method[1]: Add
|
|--Line[0]: return a +b;
(Mit zusätzlichen Zeilen für die Klammern usw...)
Wenn ich meinen Code einprüfe (und die Methoden alphabetisch ordne), wird die Hierarchie oben aktualisiert, so dass Subtract zu Method[1] und Add zu Method[0] wird.
Der zweite Entwickler checkt seinen Code ein (von dem das Versionskontrollsystem natürlich weiß, dass er auf dem Original basiert) und bemerkt die Änderung der ersten Zeile in subtract. Anstatt die Zeile anhand der Zeilennummer in der Gesamtdatei zu finden, weiß er nun, dass er sie in Calculator.cs/Calculator/Subtract/0 finden kann, und die Tatsache, dass die Methode den Ort gewechselt hat, spielt keine Rolle, er kann die Zusammenführung immer noch durchführen.