É uma prática recomendada não excluir arquivos redundantes imediatamente do VCS, mas marcá-los como "A serem excluídos" com comentários primeiro?


53

Eu queria saber se a maneira como lido com os arquivos de origem que precisam ser excluídos do controle de versão pode ser considerada uma má prática.

Quero explicar para você com base nesse exemplo:

Recentemente, fiquei muito zangado porque tive que classificar tediosamente as classes Java em um programa que era basicamente código morto, mas ele não foi documentado em nenhum lugar e também não foi comentado nessas classes Java. É claro que eles precisavam ser excluídos, mas antes que eu exclua essas coisas redundantes, tenho um hábito - alguns podem dizer estranho -:

Eu não excluo esses arquivos redundantes imediatamente via SVN-> Delete (substitua pelo comando delete do seu sistema de controle de versão de sua escolha), mas em vez disso, coloco comentários nesses arquivos (refiro-me à cabeça e ao rodapé) que eles irão ser excluído + meu nome + a data e também - o mais importante - POR QUE SÃO EXCLUÍDOS (no meu caso, porque estavam mortos, código confuso). Em seguida, eu os salvo e os comprometo com o controle de versão. Da próxima vez que eu tiver que confirmar / fazer o check-in de algo no projeto para o controle de versão, pressione SVN-> Delete e eles serão excluídos no Controle de Versão - ainda é claro que podem ser restaurados por meio de revisões, e é por isso que adotei esse hábito.

Por que fazer isso em vez de excluí-los imediatamente?

Minha razão é que eu quero ter marcadores explícitos pelo menos na última revisão em que esses arquivos redundantes existiam, por que eles mereciam ser excluídos. Se eu excluí-los imediatamente, eles serão excluídos, mas não há nenhum documento sobre por que foram excluídos. Eu quero evitar um cenário típico como este:

"Hmm ... por que esses arquivos foram excluídos? Eu trabalhei bem antes." (Pressiona 'reverter' -> o sujeito que reverteu desapareceu para sempre ou não está disponível nas próximas semanas e o próximo responsável deve descobrir tediosamente como eu sobre o que são esses arquivos)

Mas você não percebe por que esses arquivos foram excluídos nas mensagens de confirmação?

Claro que sim, mas às vezes uma mensagem de confirmação não é lida pelos colegas. Não é uma situação típica que, quando você tenta entender o código (no meu caso, morto), verifique primeiro o log de controle de versão com todas as mensagens de confirmação associadas. Em vez de rastrear o log, um colega pode ver imediatamente que esse arquivo é inútil. Isso economiza seu tempo e ela sabe que esse arquivo provavelmente foi restaurado com defeito (ou pelo menos levanta uma questão).


120
Você está essencialmente tentando replicar o trabalho do seu sistema de controle de versão diretamente no arquivo. Fazer isso definitivamente levantaria uma bandeira na minha cabeça. Se seus colegas não leem as mensagens de confirmação e ressuscitam um arquivo que foi excluído por direito e passa na revisão de código, definitivamente há algo errado em sua equipe e é uma ótima oportunidade para ensiná-los melhor.
Vincent Savard

6
@GregBurghardt Parece uma boa pergunta sobre uma má ideia. Talvez as pessoas votem negativamente com base na segunda parte disso (quando, na IMO, deveriam votar na primeira)?
precisa

13
"Da próxima vez que precisar confirmar / fazer o check-in de algo no projeto para o controle de versão, pressione SVN-> Excluir" Você está dizendo que os exclui de um commit (potencialmente) totalmente não relacionado?
Kevin

21
Claro que sim, mas às vezes uma mensagem de confirmação não é lida pelos colegas. - se eles não estiverem verificando a mensagem de confirmação, é seguro assumir que eles não estão interessados ​​no motivo pelo qual o arquivo foi removido ... caso contrário, eles devem verificar a mensagem de confirmação.
Ant P

9
Se eu quiser saber por que um arquivo desapareceu do meu check-out do VCS, examinarei primeiro o histórico de alterações e, se isso não explicar as coisas, vou ler a discussão que aconteceu quando a exclusão foi revisada. (Se você não tiver um processo de revisão de código em que todas as alterações sejam executadas, você terá problemas maiores.) E se isso ainda não for esclarecedor, falarei com quem excluiu o arquivo. Eu posso olhar para o conteúdo anterior do arquivo para tentar descobrir o que costumava fazer, mas não para uma explicação sobre a exclusão.
Zwol

Respostas:


110

O problema de adicionar um comentário a um arquivo que deve ser excluído, em vez de excluí-lo no controle de origem e colocar a explicação, é o pressuposto de que, se os desenvolvedores não lerem mensagens de confirmação, eles certamente lerão comentários no código-fonte.

Da perspectiva de alguém de fora, essa metodologia parece estar enraizada em uma visão muito conservadora do controle de origem.

"E se eu excluir este arquivo não utilizado e alguém precisar dele?" alguém pode perguntar.

Você está usando o controle de origem. Reverta a alteração ou, melhor ainda, converse com a pessoa que excluiu o arquivo (comunique).

"E se eu excluir o arquivo morto, alguém começa a usá-lo novamente e faz alterações?" alguém pode perguntar.

Novamente, você está usando o controle de origem. Você terá um conflito de mesclagem que uma pessoa deve resolver. A resposta aqui, como na última pergunta, é se comunicar com seus colegas de equipe.

Se você realmente duvida que um arquivo deve ser removido, comunique-se antes de excluí-lo do controle de origem. Talvez tenha parado de ser usado recentemente, mas um recurso futuro pode exigir isso. Você não sabe disso, mas um dos outros desenvolvedores pode.

Se precisar removê-lo, remova-o. Corte a gordura da base de código.

Se você fez um "oopsie" e realmente precisa do arquivo, lembre-se de que está usando o controle de origem para recuperar o arquivo.

Vincent Savard, em um comentário sobre a questão, disse:

... Se seus colegas não leem as mensagens de confirmação e ressuscitam um arquivo que foi excluído por direito e passa na revisão de código, há definitivamente algo errado em sua equipe e é uma ótima oportunidade para ensiná-los melhor.

Este é um bom conselho. As revisões de código devem pegar esse tipo de coisa. Os desenvolvedores precisam consultar as mensagens de confirmação quando uma alteração inesperada é feita em um arquivo ou um arquivo é removido ou renomeado.

Se as mensagens de confirmação não contam a história, os desenvolvedores também precisam estar escrevendo mensagens de confirmação melhores.

Ter medo de excluir código ou excluir arquivos é indicativo de um problema sistêmico mais profundo com o processo:

  • Falta de análises precisas de código
  • Falta de entendimento sobre como o controle de origem funciona
  • Falta de comunicação da equipe
  • Mensagens de confirmação ruins por parte dos desenvolvedores

Esses são os problemas a serem resolvidos, para que você não sinta que está jogando pedras em uma casa de vidro ao excluir código ou arquivos.


3
"suposição de que, se os desenvolvedores não lerem mensagens de confirmação, certamente lerão comentários no código-fonte." Eu acho que essa é uma suposição bastante boa. Um desenvolvedor que altera um arquivo precisa realmente examinar o arquivo para realizar a tarefa, enquanto não há nada que o force a examinar o histórico de controle de origem.
AShelly

7
@ AShelly: uma tarefa de desenvolvedor raramente muda um comentário. As tarefas envolvem a alteração do código, que é o foco do desenvolvedor - não os comentários.
precisa

21
@ AShelly Só porque eles têm que abrir um arquivo não significa que eles lerão um comentário específico no topo. O público-alvo dessa mudança é o tipo mais inconsciente de desenvolvedor, o tipo que pensa que suas necessidades são as únicas e tudo deve girar em torno delas. É improvável que você leia seu comentário educado. Pior, é provável que eles o leiam e depois simplesmente voltem para a próxima versão mais antiga.
precisa

5
@AShelly - como exemplo, eu geralmente abro arquivos para um local. No VS, posso abrir diretamente um método usando as listas suspensas na parte superior ou no menu de contexto "ir para a definição". Eu nunca veria o topo do arquivo. Também no texto sublime, eu frequentemente abro uma linha. Seu diálogo aberto users.rb: 123 abriria users.rb diretamente para a linha 123. Muitos editores de código têm opções muito semelhantes.
coteyr

2
Além do exposto, quanto mais complexo é executar tarefas de limpeza como essa, menor a probabilidade de as pessoas executá-las regularmente. Se você consegue fazê-lo de maneira mais simples, reduz a "energia de ativação" para você e todos os outros. Isso é especialmente importante se você estiver tentando incentivar uma mudança de prática para outros membros da equipe. Quanto mais complexo for o procedimento, mais difícil será obter a adesão.
Xdhmoore

105

Sim, é uma má prática.

Você deve colocar a explicação para a exclusão na mensagem de confirmação ao confirmar a exclusão dos arquivos.

Os comentários nos arquivos de origem devem explicar o código como está atualmente . As mensagens de confirmação devem explicar por que as alterações na confirmação foram feitas; portanto, o histórico de confirmação no arquivo explica seu histórico.

Escrever comentários explicando as mudanças diretamente na própria fonte apenas tornará o código muito mais difícil de seguir. Pense nisso: se você comentar no arquivo toda vez que alterar ou excluir o código, em breve os arquivos serão inundados com comentários sobre o histórico de alterações.


6
Talvez adicione a resposta à pergunta: É uma prática ruim? Sim, porque ...
Juan Carlos Coto

11
Às vezes, faço o mesmo (como OP) porque é mais fácil descomentar do que reverter. Em casos raros, mesmo que o código compile e passe no teste automático, há uma razão para a existência desse código que eu ignorei que o testador manual detectaria. Neste cenário raro, em vez de passar por grande dor ou reverter as coisas vários commits mais tarde, eu apenas descomente a volta de código (e revisitar como ela pode ser melhorada)
Andrew Savinykh

2
@AndrewSavinykh Isso é diferente, você está comentando o código que ainda não tem certeza de que deseja excluir.
Goyo

6
@AndrewSavinykh “grande dor ou reverter várias coisas depois” - imagino qual controle de versão você usa; isso não deve ser uma grande dor. Certamente não está no Git, pelo menos não depois que você o fez algumas vezes e aprendeu o que procurar ... e desde que sua história não seja repleta de compromissos desnecessários de vaivém que lhe dão conflita com todas as outras mesclagens. E commits que apenas comentário algo fora são bastante propensos a fazer isso ...
leftaroundabout

4
@AndrewSavinykh sim, e não é como se eu não tivesse passado por esses problemas - projetos cujos mantenedores nunca realmente trabalharam com o controle de versão e colocaram muitas informações em comentários que deveriam realmente ter sido confirmados, em vez disso, foi adicionado um novo manual-desfazer-confirma de reverter corretamente, etc. O estado resultante do repositório fez com que muitos conflitos se divertissem em todas as versões maiores ... Mas, e esse é o meu ponto, esses problemas geralmente são causados ​​em grande parte por soluções alternativas como a que você defende aqui.
leftaroundabout

15

Na minha opinião, ambas as suas opções não são práticas recomendadas , e não práticas ruins :

  1. A adição de comentários adiciona algum valor se alguém ler esses comentários.
  2. A simples exclusão do VCS (com um motivo na descrição da mudança) pode afetar um produto crítico e muitas pessoas não leem a descrição da mudança, especialmente quando estão sob pressão.

Minha prática preferida - principalmente por ter sido mordida várias vezes ao longo dos anos, tendo em mente que você nem sempre sabe onde ou por quem seu código está sendo usado - é:

  1. Adicione um comentário afirmando que é um candidato para exclusão e descontinuação #warning ou similar (a maioria das linguagens possui algum tipo de mecanismo, por exemplo, em Java , no pior caso, uma printdeclaração ou similar será suficiente), idealmente com algum tipo de escala de tempo e com detalhes de contato. Isso alertará qualquer pessoa que ainda esteja usando o código. Esses avisos normalmente estão dentro de cada função ou classe, se essas coisas existirem .
  2. Depois de algum tempo, atualize o aviso para um escopo de arquivo padrão #warning(algumas pessoas ignoram os avisos de descontinuação e algumas cadeias de ferramentas não exibem esses avisos por padrão).
  3. Posteriormente, substitua o escopo do arquivo #warningpor um #errorou equivalente - isso interromperá o código no momento da criação, mas poderá, se for absolutamente necessário, ser removido, mas a pessoa que o remover não poderá ignorá-lo. (Alguns desenvolvedores não leem ou endereçam avisos ou têm tantos que não conseguem separar os importantes).
  4. Por fim, marque o (s) arquivo (s), (na ou após a data de vencimento), como excluídos no VCS.
  5. Se excluir um pacote / biblioteca / etc inteiro no estágio de aviso, eu adicionaria um README.txt ou README.html ou similar com as informações de quando e por que está planejado se livrar do pacote e deixar apenas esse arquivo, com um altere para dizer quando foi excluído, como o único conteúdo do pacote por algum tempo após a remoção do restante.

Uma vantagem dessa abordagem é que alguns sistemas de controle de versão (CVS, PVCS etc.) não removerão um arquivo existente no checkout, se ele tiver sido excluído no VCS. Também oferece aos desenvolvedores conscientes, aqueles que corrigem todos os seus avisos, muito tempo para resolver o problema ou apelar para a exclusão. Também força os desenvolvedores restantes a olhar pelo menos o aviso de exclusão e reclamar muito .

Observe que #warning/ #erroré um mecanismo C / C ++ que causa um aviso / erro seguido pelo texto fornecido quando o compilador encontra esse código, java / java-doc possui @Deprecatedanotação para emitir um aviso de uso e @deprecatedfornecer algumas informações, etc. receitas para fazer similar em python e eu já vi assertusadas para fornecer informações semelhantes às #errordo mundo real.


7
Em particular, como essa pergunta menciona Java, use o @deprecatedcomentário JavaDoc e a @Deprecatedanotação .
200_success

8
Isso parece mais apropriado quando você deseja se livrar de algo ainda em uso. O aviso pode permanecer até que todos os usos acabem, mas uma vez que o código está morto, ele deve ser excluído imediatamente.
Andy

6
@ Andy Um dos problemas com o código de tipo de biblioteca, especialmente em código aberto ou em grandes organizações, é que você pode pensar que o código está inoperante, mas pode estar em uso ativo em um ou mais lugares que você nunca imaginou pessoalmente que ele estava em uso. Às vezes, o código precisa ser eliminado, porque é muito ruim ou inclui riscos à segurança, mas você simplesmente não sabe se e onde está sendo usado.
Steve Barnes

11
@ 200_success thanks - meu histórico em C / C ++ mostrando - adicionado à resposta.
Steve Barnes

11
@SteveBarnes Talvez, mas não é sobre isso que o OP está perguntando. Ele verificou que o código está morto.
Andy

3

Sim, eu diria que é uma má prática, mas não porque está nos arquivos versus na mensagem de confirmação. O problema é que você está tentando fazer uma alteração sem se comunicar com sua equipe.

Sempre que você fizer alguma alteração no tronco - adicionando, excluindo ou modificando arquivos de qualquer maneira - você deve, antes de se comprometer com o tronco, conversar sobre essas alterações diretamente com um membro (ou membros) da equipe que seria diretamente conhecedor deles (essencialmente, discuta o que você colocaria nesses cabeçalhos diretamente com seus colegas de equipe). Isso garantirá que (1) o código que você está excluindo realmente precise ser excluído e (2) sua equipe tenha muito mais chances de saber que o código foi excluído e, portanto, não tente reverter suas exclusões. Sem mencionar que você também terá detecção de bugs e similares para o código que você adicionar.

Obviamente, quando você muda coisas importantes, também deve colocá-las na mensagem de confirmação, mas como já discutiu, não precisa ser a fonte de anúncios importantes. A resposta de Steve Barnes também aborda algumas boas estratégias a serem usadas se o grupo potencial de usuários para o seu código for muito grande (por exemplo, usando os marcadores obsoletos do seu idioma em vez de excluir os arquivos primeiro).

Se você não deseja demorar tanto sem confirmar (ou seja, sua alteração faz mais sentido em várias revisões), é uma boa idéia criar uma ramificação a partir do tronco e confirmar com a ramificação, depois mesclar a ramificação novamente no tronco quando o mudança está pronta. Dessa forma, o VCS ainda está fazendo backup do arquivo para você, mas suas alterações não estão afetando o tronco de forma alguma.


1

Um problema relacionado a projetos criados em várias plataformas e configurações. Só porque eu determino que ele está morto não significa que é uma determinação correta. Observe que o uso inativo ainda pode significar dependência vestigial que ainda precisa ser eliminada, e alguns podem ter sido perdidos.

Então (em um projeto C ++) eu adicionei

#error this is not as dead as I thought it was

E fez o check-in. Aguarde o processo de reconstrução de todas as plataformas normais e ninguém reclame. Se alguém o encontrasse, seria fácil remover uma linha, em vez de ficar perplexo com um arquivo ausente.

Concordo em princípio que os comentários mencionados estão duplicando o recurso que deve ser feito no sistema de gerenciamento de versões . Mas, você pode ter razões específicas para complementar isso. Não conhecer a ferramenta VCS não é um deles.


-1

No continuum de más práticas, isso é bem menor. Farei isso de vez em quando, quando quiser verificar uma ramificação e poder ver o código antigo. Isso pode facilitar a comparação com o código de substituição. Normalmente, recebo um comentário de revisão de código "cruft". Com uma pequena explicação, passo na revisão de código.

Mas esse código não deve durar muito. Geralmente, eu apago no início do próximo sprint.

Se você tem colegas de trabalho que não leem mensagens de confirmação ou não perguntam por que você deixou o código no projeto, seu problema não é de estilo ruim de codificação. Você tem um problema diferente.


este não parece oferecer nada substancial sobre pontos feitos e explicado em anteriores 6 respostas
mosquito

-3

você também pode refatorar a classe e renomeá-la com um prefixo para UNUSED_Classname antes de executar seu truque. Então você também deve confirmar diretamente a operação de exclusão

  • Etapa 1: renomear classe, adicionar seu comentário, confirmar
  • Etapa 2: excluir arquivo e confirmar

Se for um código morto, exclua-o. Qualquer um que precisar, pode voltar, mas a etapa de renomeação os impedirá de usá-lo diretamente, sem pensar.

Também ensine às pessoas como examinar todas as mensagens de confirmação de um arquivo, algumas pessoas nem sabem que isso é possível.


6
"Refatoração" não significa realmente o que você acha que ele faz
Nik Kyriakides

6
Não há necessidade de renomear a classe / método para garantir que não seja utilizado, excluindo-o também funciona. Em vez disso, o procedimento é o mesmo de qualquer outra alteração: 1) exclua o código morto , 2) execute os testes , 3) se eles forem aprovados, confirme com comentários .
Schwern

11
@ user275398 Eu também acho que renomear os arquivos é realmente demais. E também do ponto de vista tecnológico, o SVN trata a renomeação como o arquivo seria excluído e criado com um novo nome; portanto, você terá uma quebra na história. Se você restaurar o arquivo renomeado e procurar no log SVN dele, o histórico anterior à renomeação não estará disponível. Para isso, você deve reverter o arquivo com o nome antigo. A refatoração é, a propósito, outra coisa, a refatoração está organizando o código existente em uma nova estrutura.
Bruder Lustig

@BruderLustig: Um bom software certamente não fará isso. O Git possui git mv, que rastreia a história. Mercurial também tem hg mv. Parece que também svn movedeve funcionar para o SVN?
wchargin

@wchargin Não, git mvapenas move o arquivo e monitora a exclusão e a criação do arquivo. Todo o rastreamento de movimentação acontece quando você executa git log --followe similares. gitnão tem como rastrear renomeações; na verdade, não rastreia as alterações ; em vez disso, rastreia os estados no momento da confirmação e descobre o que mudou no momento em que você inspeciona o histórico.
Maaartinus 18/06/19
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.