Existe-t-il des outils de fusion pour le contrôle de source qui comprennent le code?

StackOverflow https://stackoverflow.com/questions/802504

  •  03-07-2019
  •  | 
  •  

Question

J'ai récemment travaillé sur une base de code volumineuse, la refactorisation et l'amélioration générale de la conception pour augmenter la couverture. De plus, dans un certain nombre de fichiers, j'ai supprimé les excès à l'aide d'instructions, déplacé des méthodes de manière à rapprocher les fonctionnalités similaires, ajouté des régions, etc., sans pour autant modifier la fonctionnalité du code dans le fichier.

Pendant ce temps, ailleurs dans l'équipe, d'autres développeurs corrigent des bugs et modifient des lignes de code ici et là. Évidemment, en ce qui concerne la fusion, cela peut poser problème, car les numéros de ligne ne correspondent plus et les méthodes peuvent avoir été déplacées.

Maintenant, je comprends la règle générale selon laquelle dans un environnement contrôlé par une source, il peut être dangereux de déplacer des méthodes, et nous avons décidé que les avantages l'emportaient sur les coûts. Ce que je ne comprends pas, c’est pourquoi cela devrait se passer ainsi.

Dites que mon fichier initial était une simple calculatrice:

public class Calculator
{
    public int Subtract(int a, int b)
    {
        return a + b;
    }

    public int Add(int a, int b)
    {
        return a + b;
    }
}

Et j'ai décidé que je voulais que les méthodes soient alphabétiques:

public class Calculator
{
    public int Add(int a, int b)
    {
        return a + b;
    }

    public int Subtract(int a, int b)
    {
        return a + b;
    }        
}

Tandis qu'un autre développeur corrigeait le bogue de la méthode de soustraction

public class Calculator
{
    public int Subtract(int a, int b)
    {
        return a - b;
    }

    public int Add(int a, int b)
    {
        return a + b;
    }
}

Un outil de fusion standard nécessiterait probablement la fusion manuelle de ces deux fichiers, mais un outil qui comprend la fonctionnalité du code pourra facilement réconcilier ces deux modifications. Il en va de même pour supprimer ou ajouter d'autres méthodes, commentaires, régions ou utiliser des instructions.

Donc, pour (enfin!) répondre à la question: existe-t-il des outils de fusion qui comprennent intelligemment les fonctionnalités du code et peuvent fusionner les deux fichiers ci-dessus sans aucune intervention humaine? Si non pourquoi pas Y a-t-il des complications qui rendent ce problème insoluble (bien sûr, comprenez que ce n’est pas aussi simple que je le suppose, mais est-il impossible pour une raison que je ne vois pas?)

J'utilise C # dans mon code source et j'adorerais quelque chose qui fonctionne avec cela, mais cela m'intéresse si cela existe n'importe où dans le monde de la programmation ...

Je suis déjà très préoccupé par la longueur de cette question, mais je l'ai modifié pour ajouter comment je m'attendrais à ce que le système source intelligent fonctionne:

Lorsque le fichier initial de la calculatrice a été vérifié, le système l'analysera et créera une hiérarchie de la classe:

File: Calculator.cs
|
|--Class[0]: Calculator
    |
    |--Method[0]: Subtract
         |
         |--Line[0]: return a + b;
    |
    |--Method[1]: Add
         |
         |--Line[0]: return a +b;

(avec des lignes supplémentaires pour les accolades, etc.)

Lorsque je contrôle mon code (en rendant les méthodes alphabétiques), il met à jour la hiérarchie ci-dessus afin que Subtract devienne la méthode [1] et que Add devienne la méthode [0].

Le deuxième développeur enregistre son code (ce que le système de contrôle de code sait évidemment était basé sur le code d'origine) et remarque le changement de la première ligne de soustraction. Maintenant, plutôt que de trouver cette ligne par numéro de ligne dans l'ensemble du fichier, il sait qu'il peut trouver un fichier Calculator.cs / Calculator / Subtract / 0 et que le fait que la méthode ait changé d'emplacement n'a pas d'importance. fusionner le travail.

Était-ce utile?

La solution

Je pense que le le code source de la base de données est une réponse possible à votre question. L'idée générale est que vous ne modifiez pas les fichiers de version, mais les blocs de code de version. Le système de gestion des versions connaît le code DOM et vous permet d'interroger celui-ci afin de vérifier les fonctions, les classes, ce que vous avez, pour le modifier, le compiler, etc.

Etant donné que l'ordre des méthodes n'a pas nécessairement d'importance, elles ne sont pas stockées dans la base de données avec un ordre en tête. Lorsque vous extrayez la classe, vous pouvez spécifier l'ordre que vous préférez (alphabétique, public / protégé / privé, etc.). Les seuls changements qui importent sont ceux qui permettent de changer le + en - . Vous n'aurez pas de conflit en raison de la réorganisation des méthodes.

Malheureusement, SCID est encore TRÈS jeune et il n’ya pas beaucoup d’outils disponibles pour cela. Cependant, c’est une évolution assez intéressante dans la façon dont on voit et édite le code.

Modifier: Voici une autre référence pour SCID

Autres conseils

Notre approche avec Plastic SCM est encore loin d’être "complète", mais elle est déjà publiée et peut aider dans ce type de situation. Jetez un coup d’œil sur Xmerge . Bien entendu, les commentaires seront les bienvenus et accorderont des licences gratuites; -)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top