Resolvendo conflitos de mesclagem devido à refatoração

13

Recentemente, participei de uma discussão sobre como lidar com a refatoração (que é um tópico interessante por si só). Eventualmente, a seguinte pergunta foi levantada:

Como lidar com conflitos de mesclagem que ocorreram devido a alguém refatorar uma parte do código, enquanto alguém estava trabalhando em um recurso para o mesmo trecho de código?

Basicamente, não tenho idéia de como lidar com isso de maneira eficiente. Existem práticas recomendadas a serem seguidas em relação a isso? Existe alguma diferença em como lidar com isso em um sistema com toneladas de código legado?

Andreas Johansson
fonte
Eu tenho uma pergunta semelhante, mas com requisitos diferentes, então eu adicionei outra pergunta. programmers.stackexchange.com/questions/109229/…
Roger CS Wernersson,

Respostas:

9

Boa pergunta. A melhor estratégia que consigo pensar é:

Prevenção

Uma combinação de integração contínua e pequenas refatorações (em vez de grandes refatorações ocasionais) ajudará bastante a minimizar o custo e a frequência desses conflitos.

Gyan tcp Gary Buyn
fonte
3

Penso que, para responder à sua pergunta, primeiro precisamos ver por que os conflitos acontecem e qual é o verdadeiro significado e processo de fusão?

Os conflitos ocorrem apenas quando dois ou mais desenvolvedores estão trabalhando no mesmo arquivo ao mesmo tempo e depois tentam fazer check-in. O primeiro desenvolvedor não terá nenhum conflito, é claro. Mas o segundo (terceiro, quarto e assim por diante) teria conflitos. Por que, porque ele tem algum código que é parcial ou totalmente diferente do código existente no servidor.

Isso por natureza significa que o segundo desenvolvedor tem algo em mente diferente do primeiro desenvolvedor. Essa diferença pode variar de estilo, como usar em new UserManager().GetUserName()vez do UserManager userManager = new UserManager(); userManager.GetUserName();nível mencionado, o que significa que os dois desenvolvedores tiveram idéias diferentes de como refatorar o código para melhorá-lo.

A fusão, por outro lado, não significa que os desenvolvedores possam fazer check-in de seu código sem considerar conflitos. Eles devem e devem resolver esses conflitos. Se os conflitos não forem importantes, eles poderão fazer check-in e substituir o código anterior. Mas quando virem algo completamente diferente, devem ligar para o desenvolvedor anterior e conversar com ele, para que ambos possam se coordenar juntos para verificar a melhor solução.

Por exemplo, se você pedir a dois desenvolvedores para melhorar a biblioteca de pagamentos on-line e o trabalho deles se sobrepor, isso significa que pelo menos em alguns lugares, existem 2 soluções diferentes. Portanto, uma dessas soluções deve ser mencionada e aceita, assim registrada, como a melhor solução.

Não concordo em impedir essas circunstâncias, pois devemos tender a ser mais reais do que teóricos. Às vezes, um cara é realmente bom em CSS, enquanto outro é realmente bom em marcação do ASP.NET. Mas o trabalho deles pode entrar em conflito quando ambos devem trabalhar na página de login para fazê-lo funcionar. Quero dizer, se pensamos real (não ideal), podemos ver que muitas vezes esse fenômeno (conflito) acontece.

Outro ponto que gostaria de mencionar é o uso de ferramentas para ajudá-lo no processo de check-in. Essas ferramentas geralmente visualizam a diferença entre o código do servidor e o código do desenvolvedor e ajudam muito na determinação de qual parte deve ser registrada.

Saeed Neamati
fonte
3

Se não houver gerenciamento ativo de tarefas, você terá conflitos.

Se, no entanto, você tiver uma reunião ou gerente geral , não poderá ter esse problema.

Converse (através de um stand-up diário) ou converse com um gerente.

Isso é trivialmente evitado ao se falar.

S.Lott
fonte
+1. Alguns desenvolvedores vêem os gerentes como um obstáculo. Mas os gerentes realmente existem para permitir que outras pessoas trabalhem , e este é um excelente exemplo de um problema com o qual eles podem ajudar.
MarkJ
@ MarkJ: Um gerente que é um obstáculo para mesclar conflitos não é uma coisa ruim. Ponto excelente.
S.Lott
+1 Eu estava prestes a adicionar algo assim à minha resposta, mas você acertou em cheio. Se você estiver usando um conflito para informar que outra pessoa estava trabalhando na mesma área, descobrirá muito tarde no jogo e precisará lidar com isso. O gerenciamento de tarefas e a comunicação podem permitir que os desenvolvedores que trabalham na mesma área trabalhem juntos desde o início .
Gyan aka Gary Buyn
1

Tenha um ramo comum separado para desenvolver um determinado recurso, mesclar / puxar / empurrar com frequência - é isso.

E se comunicar . Converse com outros desenvolvedores sobre código, mesmo no lançamento. Mesmo ao codificar)))

shabunc
fonte
1

Verifique se a mesclagem é o mais simples possível. A refatoração é geralmente um processo bastante mecânico que altera muitas linhas existentes : mova declarações de variáveis, alterações de espaço em branco, formatação, sequência de operações. A criação de recursos geralmente é um empreendimento muito mais criativo, geralmente resultando em novo código, além de alguns pequenos ajustes no código existente. Agora, se o desenvolvedor que faz a refatoração registra as etapas (por exemplo, como expressões regulares), pode ser muito mais fácil aplicá-las ao código com a funcionalidade extra do que o contrário. Com base nisso, eu diria que, como regra geral, você deve aplicar primeiro a alteração mais complexa, seguida por alterações progressivamente mais simples.

l0b0
fonte