Existem ferramentas de mesclagem para controle de origem que entendem o código?
-
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.
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.
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 ;-)