Existem ferramentas de mesclagem para controle de origem que entendem o código?

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

  •  03-07-2019
  •  | 
  •  

Pergunta

Recentemente, tenho trabalhado em uma grande base de código, refatorando e geralmente melhorando o design para aumentar a cobertura. Além disso, em alguns arquivos, removi em excesso usando instruções, os métodos movidos para que a funcionalidade semelhante seja próxima, regiões adicionadas etc., mas na verdade não alterou a funcionalidade do código no arquivo.

Enquanto isso, em outras partes da equipe, outros desenvolvedores estão consertando bugs e mudando as linhas de código aqui e ali. Obviamente, quando se trata de mesclar, isso pode ser um problema, pois os números de linha não correspondem mais e os métodos podem ter movido.

Agora, entendo a regra geral de que, em um ambiente controlado por fonte, pode ser uma coisa perigosa mover métodos e decidimos que o benefício superou o custo. O que eu não entendo, no entanto, é por que deve ser assim.

Diga que meu arquivo inicial foi uma calculadora simples:

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

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

E decidi que queria que os métodos fossem alfabéticos:

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

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

Enquanto outro desenvolvedor corrigiu o bug no método de subtração

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

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

Uma ferramenta de mesclagem padrão provavelmente exigiria que você mesclasse manualmente esses dois arquivos, mas um que entendeu o funcionalidade do código seria facilmente capaz de conciliar essas duas alterações. O mesmo se aplica à remoção ou adição de outros métodos, comentários, regiões ou usando instruções.

Então, para (finalmente!) Chegue à pergunta: existem ferramentas de mesclagem por aí que têm um entendimento inteligente da funcionalidade do código e podem mesclar os dois arquivos acima sem nenhuma intervenção humana? Se não, por que não? Existem complicações que tornam esse um problema insolúvel (é claro que não é tão simples quanto estou implicando - mas é impossível por algum motivo que não consigo ver?)

Eu uso C# no meu código -fonte e adoraria algo que funcionou com isso, mas estou interessado se isso existir em qualquer lugar do mundo da programação ...


Já estou realmente preocupado com a duração desta pergunta, mas editado para adicionar como eu esperaria que o sistema de origem inteligente funcionasse:

Quando o arquivo de calculadora inicial foi verificado no sistema analisava o arquivo e criava uma hierarquia da classe:

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

(Com linhas extras lá para aparelhos etc ...)

Quando eu verifico meu código (tornando os métodos alfabéticos), ele atualiza a hierarquia acima para que o subtração se torne o método [1] e add se torna método [0].

O segundo desenvolvedor verifica seu código (que obviamente o sistema de controle de origem sabe que foi baseado no original) e percebe a alteração na primeira linha em subtrair. Agora, em vez de encontrar esse número de linha por linha no arquivo geral, ele sabe que pode achar uma calculadora.cs/calculadora/subtração/0 e o fato de que o método mudou de localização não importa, ainda pode fazer o mesclar trabalho.

Foi útil?

Solução

eu penso isso Código -fonte no banco de dados é uma resposta potencial para sua pergunta. A idéia geral é que você não faça a versão de arquivos, seus blocos de versão do código. O sistema de versão conhece o código DOM e permite que você consulte o código DOM para verificar funções, aulas, o que você tem, para editar, compilar etc.

Como a ordem dos métodos não importa necessariamente, eles não são armazenados no banco de dados com qualquer ordem em mente. Ao conferir a aula, você pode especificar a ordem de que mais gosta (alfabético, público/protegido/privado, etc.). As únicas mudanças importantes são aquelas como onde você muda o + para um -. Você não terá um conflito devido a reordenar os métodos.

Infelizmente, o SCID ainda é muito jovem e não há muitas ferramentas por aí. No entanto, é uma evolução bastante interessante na maneira como se vê e edita o código.

Editar: Aqui está outra referência para o SCID

Outras dicas

Nossa abordagem com SCM de plástico ainda está longe de ser "completa", mas já foi lançada e pode ajudar nesse tipo de situações. Dar uma olhada em Xmerge. Obviamente, o feedback será mais do que bem-vindo e concederá algumas licenças gratuitas ;-)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top