11 Stimmen

Gibt es Merge-Tools für die Versionskontrolle, die Code verstehen?

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.

4voto

pablo Punkte 6312

Unser Ansatz mit Plastic SCM ist noch weit davon entfernt, "vollständig" zu sein, aber er ist bereits freigegeben und kann in dieser Art von Situationen helfen. Werfen Sie einen Blick auf Xmerge . Natürlich ist Feedback mehr als willkommen und wird einige kostenlose Lizenzen gewähren ;-)

3voto

dustyburwell Punkte 5705

Ich denke, dass Quellcode in der Datenbank ist eine mögliche Antwort auf Ihre Frage. Die allgemeine Idee ist, dass man nicht Dateien, sondern Codeblöcke versioniert. Das Versionierungssystem kennt das Code-DOM und lässt Sie das Code-DOM abfragen, um Funktionen, Klassen usw. zum Bearbeiten, Kompilieren usw. auszuchecken.

Da die Reihenfolge der Methoden nicht unbedingt von Bedeutung ist, werden sie in der Datenbank nicht in einer bestimmten Reihenfolge gespeichert. Wenn Sie die Klasse auschecken, können Sie die Reihenfolge angeben, die Ihnen am besten gefällt (alphabetisch, öffentlich/geschützt/privat, usw.). Die einzigen Änderungen, die von Bedeutung sind, sind die, bei denen Sie die + zu einer - . Sie werden keinen Konflikt durch die Neuanordnung der Methoden haben.

Leider ist SCID noch SEHR jung, und es gibt noch nicht viele Hilfsmittel dafür. Es ist jedoch eine recht interessante Entwicklung in der Art und Weise, wie man Code betrachtet und bearbeitet.

Bearbeiten: Hier ist eine weitere Referenz für SCID

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X