Impedir a compilação de código descontinuado após atingir um prazo [fechado]


68

Em minha equipe, limpamos muitas coisas antigas em um grande projeto monolítico (classes inteiras, métodos etc.).

Durante as tarefas de limpeza, fiquei pensando se existe algum tipo de anotação ou biblioteca mais sofisticada do que o habitual @Deprecated. Isso @FancyDeprecateddeve impedir que a compilação do projeto seja bem-sucedida se você não tiver limpado o código antigo não utilizado após uma data específica.

Estive pesquisando na Internet e não encontrei nada com os recursos descritos abaixo:

  • deve ser uma anotação ou algo semelhante para colocar no código que você deseja excluir antes de uma data específica
  • antes dessa data, o código será compilado e tudo funcionará normalmente
  • após essa data, o código não será compilado e receberá uma mensagem avisando sobre o problema

Acho que estou procurando um unicórnio ... Existe alguma tecnologia semelhante para qualquer linguagem de programa?

Como plano, estou pensando na possibilidade de fazer a mágica com alguns testes de unidade do código que se pretende remover que começam a falhar no "prazo". O que você pensa sobre isso? Alguma ideia melhor?


168
A descontinuação é feita para uma versão , não para uma data . Se você deseja que as pessoas parem de usar os recursos obsoletos, libere uma versão sem eles. Isso chamará a atenção deles, e eles sempre poderão reverter se ainda não puderem fazer isso. Muitas pessoas estão presas em versões antigas. Quebrar o programa deles não é o caminho a percorrer.
Isanae 8/03

4
O plano B parece sólido. Com as vantagens adicionais que você pode colocar um comentário no teste de unidade, por que ele foi descontinuado. Adicionando o comentário ao código-fonte não ajudaria a legibilidade em um grande monolito
Dwana

53
Isso soa como um unicórnio realmente malvado. Você tem um pouco de software que compila bem, passa em todos os testes e o enviou a um cliente. Então, um dia, você fará o check-out do software novamente e ele não será construído, mesmo na mesma plataforma de desenvolvimento. Agora você é forçado a modificar o código que passou anteriormente nos testes formais ou fazer ataques maliciosos como reverter o relógio do computador.
Simon B

6
Crie @ Deprecated_RemoveMe_2018_06_01 e, em 01/06/2018, exclua a anotação em si. Voila, todo o seu código usando a anotação não será mais compilado! (porque a anotação não foi encontrada)
user253751

65
Anos no futuro, um desenvolvedor recém-contratado perguntará: por que o tempo no servidor de compilação foi definido para janeiro de 2016? E o cara que está lá por 10 anos dirá a ele que é necessário ou que a construção é interrompida em lugares aleatórios. Suspiro.
217 Wilbert #

Respostas:


62

Eu não acho que isso seria um recurso útil quando realmente proíbe a compilação. Quando em 01/06/2018 grandes partes do código não serão compiladas no dia anterior, sua equipe removerá rapidamente essa anotação novamente, com o código limpo ou não.

No entanto, você pode adicionar uma anotação personalizada ao código, como

@Deprecated_after_2018_07_31

e crie uma pequena ferramenta para procurar essas anotações. (Um liner simples no grep fará isso, se você não quiser utilizar a reflexão). Em outras linguagens que não Java, um comentário padronizado adequado para "grepping" ou uma definição de pré-processador pode ser usada.

Em seguida, execute a ferramenta pouco antes ou depois da data específica e, se ela ainda encontrar essa anotação, lembre a equipe de limpar essas partes do código urgentemente.


9
@ Bergi: ei, este é apenas um exemplo, o OP pode usar versões ou tags de data, o que eles preferirem em seu controle.
Doc Brown

4
Não vejo nenhuma vantagem em fazer isso apenas usando os recursos normais de descontinuação e observando a saída do compilador na data específica. Parece um mau uso do tempo do desenvolvedor para reimplementar algo que praticamente já existe. Mesmo que você já tenha uma tonelada de avisos (o que valeria a pena limpar), certamente você pode fazer com que o compilador cuspa todos os avisos em um arquivo de texto e depois o grep ou pesquise.
precisa saber é

4
@jpaugh Estou recomendando não gastar horas (nota, tempo = dinheiro) na criação de novas ferramentas para executar tarefas que você já pode executar com eficiência com as ferramentas existentes, quaisquer que sejam essas ferramentas.
Jpmc26

3
@ jpmc26: Eu vejo duas (pequenas) vantagens: não receber toneladas de avisos de depreciação (o que introduziria um risco de negligenciar os mais importantes) e a possibilidade de introduzir diferentes critérios de depreciação (datas, versões, o que for) para diferentes seções de código. Além disso, o PO solicitou explicitamente o acoplamento da depreciação a uma data.
Doc Brown

7
Gostaria de marcar com +1 se você apenas usar a ordem AAAA-MM-DD para a data no seu exemplo, porque eu só vi a ordem ambígua ?? - ?? - AAAA causar dor e mal-entendidos.
Mtraceur

284

Isso constituiria um recurso conhecido como bomba-relógio . NÃO CRIE BOMBAS DE TEMPO.

O código, não importa quão bem você o estruture e documente, se transformará em uma caixa preta quase mítica, mal compreendida, se viver além de uma certa idade. A última coisa que alguém no futuro precisa é de outro modo de falha estranho que os pega totalmente de surpresa, no pior momento possível e sem um remédio óbvio. Não há desculpa para produzir intencionalmente esse problema.

Veja da seguinte maneira: se você está organizado e ciente de sua base de código o suficiente para se importar com a obsolescência e segui-la, não precisa de um mecanismo no código para lembrá-lo. Caso contrário, é provável que você também não esteja atualizado sobre outros aspectos da base de códigos e provavelmente não poderá responder ao alarme em tempo hábil e corretamente. Em outras palavras, as bombas-relógio não servem para ninguém. Apenas diga não!


74
+1 Isso vai te morder. Meses depois. Na sexta-feira, quando você está tentando fazer uma implantação de emergência. E é um fim de semana prolongado, para que todas as pessoas que sabem algo sobre isso fiquem fora do escritório. Não faça isso.
22416 Roger Lipscombe

3
Aceita. A obsolescência é uma questão organizacional, não uma questão de codificação. Eu ainda podia conectar uma Apple] [e escrever BASIC, nada me impedindo. Mas eu gostaria ?

19
A solução correta, seguindo sua direção "organizada e consciente", é gerar um erro no seu sistema de rastreamento de erros, dizendo "Remover <tal e tal>", com um prazo sugerido nos comentários. E, em 6 meses, quando a revisão de bugs surgir para descobrir quais bugs devem ser corrigidos na próxima versão, se esse prazo for iminente, você diz "é hora de fazer isso". É gerenciamento básico de projetos.
Lightness Races com Monica no dia

11
De fato, se o seu cronograma de lançamento for suficientemente previsível, basta marcá-lo agora.
Lightness Races com Monica no dia

13
Consulte o comentário de isanae para uma alternativa: " Se você deseja que as pessoas parem de usar recursos obsoletos, libere uma versão sem eles. Isso
chamará

70

Em C #, você usaria ObsoleteAttributeo seguinte:

  • Na versão 1, você envia o recurso. Um método, classe, qualquer que seja.
  • Na versão 2, você envia um recurso melhor destinado a substituir o recurso original. Coloque um atributo Obsoleto no recurso, defina-o como "aviso" e forneça uma mensagem dizendo "Este recurso está obsoleto. Use o melhor recurso. Na versão 3 desta biblioteca, que será lançada em tal e qual uma data, o uso desse recurso será um erro ". Agora, os usuários do recurso ainda podem usá-lo, mas têm tempo para atualizar seu código para usar o novo recurso.
  • Na versão 3, você atualiza o atributo para ser um erro e não um aviso e atualiza a mensagem para dizer "Este recurso está obsoleto. Use o melhor recurso. Na versão 4 desta biblioteca, que será lançada em tal e qual uma data, esse recurso será lançado ". Os usuários que não atenderam ao seu aviso anterior ainda recebem uma mensagem útil informando como corrigir o problema e devem corrigi-lo, porque agora o código não é compilado.
  • Na versão 4, você altera o recurso para lançar alguma exceção fatal e altera a mensagem para dizer que o recurso será removido inteiramente na próxima versão.
  • Na versão 5, você remove completamente o recurso e, se os usuários se queixam, bem, você deu a eles três ciclos de lançamento de aviso justo, e eles sempre podem continuar usando a versão 2 se sentirem muito a respeito.

A idéia aqui é fazer uma mudança de última hora o mais simples possível para os usuários afetados e garantir que eles possam continuar usando o recurso em pelo menos uma versão da biblioteca.


2
Eu acredito que esta é a abordagem correta, mas gostaria de mudar uma coisa ... que seria trocar "se os usuários queixam-se" para "quando os usuários se queixam"
Liath

10
Remover o corpo ao mesmo tempo que mudar para um erro parece estranho. Uma das vantagens da versão de erro de obsoleta é que ela permite que o código criado em relação às versões anteriores continue funcionando, impedindo o uso do código compilado recentemente. Assim, você permanece compatível com a ABI, enquanto quebra deliberadamente a compatibilidade da API. Obviamente, mundo perfeito, você teria versões no estilo semver, etc, para nunca executar o novo código com um aplicativo compilado anteriormente, mas muitos projetos nunca alcançam esse ideal.
21418 Kevin Kathcart

@ KevinCathcart: Esse é um bom ponto; talvez outro estágio seja necessário! Vou atualizar o texto.
22418 Eric Clippert

11
Na verdade, se você estiver usando o SemVer, poderá passar de reprovado na versão XY0 (qualquer depreciação deve ser uma versão menor) para completamente removido no X + 1.0.0. Eu diria que é bom adiar um pouco mais (para X + 2.0.0?), Mas esse processo de cinco etapas provavelmente está dourando o lírio. A próxima etapa após o "aviso" deve ser "erro fatal" (porque o recurso descontinuado foi substituído pelo código de geração de erros). Como libfoo.so.2e libfoo.so.3pode coexistir um com o outro, o seu downstream pode continuar usando a biblioteca antiga até que eles sejam trocados.
Monty Harder

@MontyHarder: Claro. A sequência exata de eventos pode ser determinada pelas necessidades do desenvolvedor e de sua comunidade de usuários. O ponto mais importante, porém, é que deve haver uma política ponderada para lidar com esses tipos de problemas de versão que são claramente comunicados às partes interessadas.
Eric Lippert

24

Você entendeu mal o que significa "obsoleto". Descontinuado significa:

ser utilizável, mas considerado obsoleto e melhor evitado, geralmente porque foi substituído.

Oxford Dictionaries

Por definição, um recurso descontinuado ainda será compilado.

Você está procurando remover o recurso em uma data específica. Isso é bom. O jeito que você faz isso é removê-lo nessa data .

Até lá, marque como obsoleto, obsoleto ou como sua linguagem de programação chamar. Na mensagem, inclua a data em que será removida e o que a substitui. Isso gerará avisos, indicando que outros desenvolvedores devem evitar novos usos e substituir os antigos sempre que possível. Esses desenvolvedores o cumprirão ou o ignorarão, e alguém terá que lidar com as consequências disso quando for removido. (Dependendo da situação, pode ser você ou os desenvolvedores que estão usando.)


Interessado no que o downvoter discorda.
precisa saber é

2
+1. Se você usar o JIRA para desenvolvimento ágil, crie uma tarefa e coloque-a em um sprint futuro; adapte-se a qualquer outra ferramenta e metodologia de gerenciamento de projetos que você siga. Isso é melhor resolvido com métodos não técnicos.
Mateus Leia

11
E também verifique se a Classe / Lib permanece na documentação como depreciada e / ou removida na versão Xx
Phil M

12

Não esqueça que você precisa manter a capacidade de criar e depurar versões mais antigas do código para oferecer suporte a versões do software que já foram lançadas. Sabotar uma construção depois de uma certa data significa que você também corre o risco de se impedir de realizar trabalhos de manutenção e suporte legítimos no futuro.

Além disso, parece uma solução trivial definir o relógio da minha máquina um ano ou dois antes de compilar.

Lembre-se de que "descontinuado" é um aviso de que algo vai desaparecer no futuro. Quando você deseja impedir com força as pessoas de usarem essa API, basta remover o código associado . Não faz sentido deixar o código na base de código se algum mecanismo o tornar inutilizável. A remoção do código fornece as verificações em tempo de compilação que você procura e não possui uma solução trivial.

Editar: vejo que você se refere ao "código antigo não utilizado" na sua pergunta. Se o código realmente não for usado , não há sentido em preteri-lo. Apenas apague.


A melhor resposta, de longe, talvez enfatize que a exclusão do código é a melhor maneira de resolver o problema mais rapidamente em sua resposta. Pode ser fácil rolar além das respostas de texto
Clint

6

Eu nunca vi esse recurso antes - uma anotação que começa a entrar em vigor após uma data específica.

O @Deprecatedpode ser suficiente, no entanto. Capture avisos no IC e recuse aceitar a compilação, se houver algum. Isso muda a responsabilidade do compilador para seu pipeline de construção, mas tem a vantagem de que você pode (semi) facilmente alterar o pipeline de construção adicionando etapas adicionais.

Observe que esta resposta não resolve completamente o seu problema (por exemplo, as compilações locais nas máquinas dos desenvolvedores ainda teriam êxito, embora com avisos) e pressupõe que você tenha um pipeline de CI configurado e em execução.


4

Você está procurando calendários ou listas de tarefas .

Outra alternativa é usar avisos personalizados do compilador ou mensagens do compilador, se você conseguir ter poucos ou nenhum aviso na sua base de código. Se você tiver muitos avisos, precisará de um esforço adicional (cerca de 15 minutos?) E precisará receber o aviso do compilador no relatório de compilação que sua integração contínua fornece em cada compilação.

Lembretes de que o código precisa ser corrigido são bons e necessários. Às vezes, esses lembretes têm prazos estritos no mundo real, portanto, também é necessário colocá-los em um cronômetro.

O objetivo é lembrar continuamente as pessoas de que o problema existe e precisa ser corrigido dentro de um determinado período de tempo - um recurso que simplesmente interrompe a construção em um horário específico, não apenas não faz isso, mas esse recurso é um problema que precisa ser resolvido. ser corrigido dentro de um determinado período.


11
Aceita. Mas se um problema existe e precisa ser corrigido dentro de um determinado período, ele precisa se tornar a principal prioridade de alguém no momento certo. Lembro-me de quando, em uma reunião, meu gerente me deu uma "prioridade máxima" e depois disse: " Esta é a sua prioridade número um" (algo diferente). Meu supervisor disse: "Ele não pode ter duas prioridades número um!" O gerente ficou assustado. Acho que ele pensou que ... eu poderia. Planejar algo a ser corrigido "no momento certo" está planejando ficar sem tempo.

3

Uma maneira de pensar sobre isso é o que você quer dizer com hora / data ? Os computadores não sabem quais são esses conceitos: eles precisam ser programados de alguma forma. É bastante comum representar tempos no formato UNIX de "segundos desde a época", e é comum alimentar um valor específico em um programa por meio de chamadas do SO. No entanto, não importa quão comum seja esse uso, é importante ter em mente que não é a hora "real": é apenas uma representação lógica.

Como outros já apontaram, se você fez um "prazo" usando esse mecanismo, é trivial alimentar um horário diferente e quebrar esse "prazo". O mesmo vale para mecanismos mais elaborados, como solicitar a um servidor NTP (mesmo em uma conexão "segura", pois podemos substituir nossos próprios certificados, autoridades de certificação ou até corrigir as bibliotecas de criptografia). A princípio, pode parecer que essas pessoas são as culpadas por contornar seu mecanismo, mas pode ser o caso de ser feito automaticamente e por boas razões . Por exemplo, é uma boa ideia ter construções reproduzíveis e ferramentas para ajudar a isso podem redefinir / interceptar automaticamente chamadas de sistema não determinísticas. libfaketime faz exatamente isso,define todos os carimbos de data e hora do arquivo 1970-01-01 00:00:01, o recurso de gravação / reprodução do Qemu falsifica toda a interação do hardware, etc.

Isso é semelhante à lei de Goodhart : se você faz o comportamento de um programa depender do tempo lógico, então o tempo lógico deixa de ser uma boa medida do tempo "real". Em outras palavras, as pessoas geralmente não mexem com o relógio do sistema, mas sim se você lhes der um motivo.

Existem outras representações lógicas do tempo: uma delas é a versão do software (seu aplicativo ou alguma dependência). Essa é uma representação mais desejável para um "prazo" do que, por exemplo, o horário do UNIX, já que é mais específica para o que lhe interessa (alteração de conjuntos de recursos / APIs) e, portanto, é menos provável que atropele preocupações ortogonais (por exemplo, mexendo no tempo do UNIX para contornar o prazo pode acabar quebrando arquivos de log, tarefas cron, caches, etc.).

Como já foi dito, se você controla a biblioteca e deseja "enviar" essa alteração, pode enviar uma nova versão que descontinua os recursos (causando avisos, para ajudar os consumidores a encontrar e atualizar seu uso) e, em seguida, outra nova versão que remove o apresenta inteiramente. Você pode publicá-las imediatamente uma após a outra, se quiser, uma vez que (novamente) as versões são meramente uma representação lógica do tempo, elas não precisam estar relacionadas ao tempo "real". O controle de versão semântico pode ajudar aqui.

O modelo alternativo é "puxar" a mudança. É como o seu "plano B": adicione um teste ao aplicativo consumidor, que verifica se a versão dessa dependência é pelo menos o novo valor. Como sempre, vermelho / verde / refatorar para propagar essa alteração pela base de código. Isso pode ser mais apropriado se a funcionalidade não for "ruim" ou "incorreta", mas apenas "inadequada para este caso de uso".

Uma questão importante com a abordagem "pull" é se a versão de dependência conta ou não como uma "unidade" ( de funcionalidade ) e, portanto, merece teste; ou se é apenas um detalhe de implementação "particular", que deve ser exercido apenas como parte dos testes reais de unidade ( de funcionalidade ). Eu diria: se a distinção entre as versões da dependência realmente conta como um recurso do seu aplicativo, faça o teste (por exemplo, verificando se a versão do Python é> = 3.x). Se não, então nãoadicione o teste (pois será quebradiço, pouco informativo e excessivamente restritivo); se você controlar a biblioteca, desça a rota "push". Se você não controla a biblioteca, basta usar a versão fornecida: se seus testes forem aprovados, não vale a pena se restringir; se eles não passarem, esse é o seu "prazo final" aí mesmo!

Existe outra abordagem, se você deseja desencorajar certos usos dos recursos de uma dependência (por exemplo, chamar determinadas funções que não funcionam bem com o restante do seu código), especialmente se você não controla a dependência: proibir seus padrões de codificação / desencoraje o uso desses recursos e adicione verificações ao seu linter.

Cada um deles será aplicável em diferentes circunstâncias.


1

Você gerencia isso no nível do pacote ou da biblioteca. Você controla um pacote e sua visibilidade. Você é livre para retirar a visibilidade. Eu já vi isso internamente em grandes empresas e isso só faz sentido em culturas que respeitam a propriedade de pacotes, mesmo que os pacotes sejam de código aberto ou de uso gratuito.

Isso é sempre confuso, porque as equipes do cliente simplesmente não querem mudar nada; portanto, muitas vezes você precisa de algumas rodadas de lista de permissões apenas enquanto trabalha com clientes específicos para acordar um prazo para migrar, possivelmente oferecendo suporte a eles.


Eu gosto da parte de suporte. Todas as mudanças acontecem de maneira mais suave, agradável e provavelmente com menos dificuldades se as pessoas que as promovem oferecerem apoio. Isso é parcialmente um efeito psicológico: um bom apoio é cooperativo; leva todos os envolvidos a sério. Por outro lado, as mudanças impostas de cima sem envolver os envolvidos os fazem se sentir ignorados e não cooperarem. (Embora a simpatia deve ser emparelhado com uma unidade implacável para obter as mudanças através de.)
Peter - Reintegrar Monica

1

Um requisito é introduzir uma noção de tempo na compilação. Em C, C ++, ou outros idiomas sistemas que utilizam um pré-processador C-like / construir uma , pode-se introduzir um carimbo de tempo através define para o pré-processador em tempo de compilação: CPPFLAGS=-DTIMESTAMP()=$(date '+%s'). Isso provavelmente aconteceria em um makefile.

No código, seria possível comparar esse token e causar um erro se o tempo acabar. Observe que o uso de uma macro de função captura o caso que alguém não definiu TIMESTAMP.

#if TIMESTAMP() == 0 || TIMESTAMP() > 1520616626
#   error "The time for this feature has run out, sorry"
#endif

Como alternativa, pode-se simplesmente "definir" o código em questão quando chegar a hora. Isso permitiria que o programa fosse compilado, desde que ninguém o usasse. Digamos, temos um cabeçalho que define uma API, "api.h" e não permitimos chamadas old()depois de um certo tempo:

//...
void new1();
void new2();
#if TIMESTAMP() < 1520616626
   void old();
#endif
//...

Uma construção semelhante provavelmente eliminaria old()o corpo da função de algum arquivo de origem.

Claro que isso não é à prova de idiotas; pode-se simplesmente definir um antigo TIMESTAMPno caso da construção de emergência de sexta à noite mencionada em outro lugar. Mas acho que isso é bastante vantajoso.

Obviamente, isso funciona apenas quando a biblioteca é recompilada - depois disso, o código obsoleto simplesmente não existe mais na biblioteca. Porém, isso não impediria que o código do cliente vinculasse a binários obsoletos.


1 C # suporta apenas a definição simples de símbolos de pré-processador, sem valores numéricos, o que torna essa estratégia inviável.


Também é importante notar que essa definição do pré-processador forçará todo o código usado TIMESTAMPa ser recompilado a cada compilação. Também incapacitará ferramentas como ccache. Isso significa que o tempo de compilação típico para compilações incrementais aumentará significativamente, dependendo de quanto da base de código é afetada pelos recursos preteridos dessa maneira.
mindriot

@mindriot Esse é um aspecto interessante. Suponho que isso seja verdade com todos os métodos que introduzem uma noção de tempo no código - o OP disse explicitamente "após uma data específica". Alguém poderia lidar com o aspecto do tempo no sistema de compilação e deixar o código em paz, é verdade. Mas o OP pediu explicitamente "algo inserido no código". Minha solução tem a vantagem de ser independente de qualquer método de compilação específico. Pode ser enganado, mas você deve atendê-lo de uma maneira ou de outra.
Peter - Restabelece Monica

Você está absolutamente correto. Sua solução aqui é essencialmente a única que fornece uma solução prática para a questão real do OP . No entanto, achei importante ressaltar a desvantagem. Caberá ao OP pesar os prós e os contras. Eu acho que um meio termo saudável poderia até ser alcançado, digamos, dividindo o TIMESTAMPvalor por, digamos, 86400, para obter uma granularidade diária e, portanto, menos recompilações.
mindriot

0

No Visual Studio, você pode configurar um script de pré-compilação que gera um erro após uma determinada data. Isso impedirá a compilação. Aqui está um script que lança um erro em ou após 12 de março de 2018 ( extraído daqui ):

@ECHO OFF

SET CutOffDate=2018-03-12

REM These indexes assume %DATE% is in format:
REM   Abr MM/DD/YYYY - ex. Sun 01/25/2015
SET TodayYear=%DATE:~10,4%
SET TodayMonth=%DATE:~4,2%
SET TodayDay=%DATE:~7,2%

REM Construct today's date to be in the same format as the CutOffDate.
REM Since the format is a comparable string, it will evaluate date orders.
IF %TodayYear%-%TodayMonth%-%TodayDay% GTR %CutOffDate% (
    ECHO Today is after the cut-off date.
    REM throw an error to prevent compilation
    EXIT /B 2
) ELSE (
    ECHO Today is on or before the cut-off date.
)

Certifique-se de ler as outras respostas nesta página antes de usar este script.


-1

Entendo o objetivo do que você está tentando fazer. Mas, como outros já mencionaram, o sistema de compilação / compilador provavelmente não é o lugar certo para aplicar isso. Eu sugiro que a camada mais natural para aplicar essa política seja o SCM ou as variáveis ​​de ambiente.

Se você fizer o último, adicione basicamente um sinalizador de recurso que marca uma execução de pré-reprovação. Toda vez que você constrói a classe reprovada ou chama um método obsoleto, verifique o sinalizador do recurso. Apenas defina uma única função estática assertPreDeprecated()e adicione-a a todo caminho de código obsoleto. Se estiver definido, ignore as chamadas de confirmação. Se não é uma exceção. Depois que a data passar, desmarque o sinalizador de recurso no ambiente de tempo de execução. Quaisquer chamadas obsoletas remanescentes para o código serão exibidas nos logs de tempo de execução.

Para uma solução baseada em SCM, presumo que você esteja usando git e git-flow. (Caso contrário, a lógica é facilmente adaptável a outros VCS). Crie uma nova ramificação postDeprecated. Nesse ramo, exclua todo o código descontinuado e comece a remover todas as referências até compilar. Quaisquer alterações normais continuam sendo feitas na masterramificação. Mantenha integrando quaisquer alterações não-obsoleto relacionados código na mastervolta para postDeprecatedminimizar os desafios de integração.

Após o término da data de descontinuação, crie uma nova preDeprecatedramificação a partir de master. Em seguida, mesclar postDeprecatednovamente master. Supondo que sua liberação saia da masterramificação, agora você deve usar a ramificação pós-obsoleta após a data. Se houver uma emergência ou você não conseguir fornecer resultados a tempo, sempre poderá reverter preDeprecatede fazer as alterações necessárias nessa ramificação.


7
Essa abordagem parece um pesadelo logístico. Se você começar a manter ramificações paralelas quase duplicadas, gastará todo o seu tempo fazendo isso. Resíduos totais.
Lightness Races com Monica no dia

6
Não posso concordar que a manutenção de ramificações paralelas, usando uma simplesmente para remover funções obsoletas muitas versões antes de você realmente deseja removê-las do produto, seja de qualquer forma "o padrão do setor". Qual é o propósito disso? Sim, um VCS pode executar automaticamente algumas mesclagens, mas uma mesclagem deve ser realizada com o olhar do desenvolvedor para resolver conflitos lógicos (e o que acontece quando você obtém um conflito que nem pode ser resolvido lexicamente?). Ter um sistema de compilação arbitrariamente mesclado todos os dias para isso é apenas ... inútil. Remova o recurso na hora de removê-lo.
Lightness Races com Monica no dia

3
Porque existe um bom motivo para manter ramificações de liberação (portando correções importantes). Não há boas razões para manter um ramo "algo que eu possa fazer no futuro". É sobrecarga, sem nenhum benefício. Simples assim.
Lightness Races com Monica no dia

4
Onde eu consegui isso? É literalmente a definição de depreciação. Você descontinuou algo que poderá remover no futuro. Portanto, não há falsidade, não há movimentação dos postes e, certamente, não há coisas que inventem apenas "para vencer a discussão". Este não é "um caso de uso de livro didático de ramificação do SCM" em qualquer organização em que eu queira trabalhar! Acho que teremos que concordar em discordar. Tenha uma boa noite!
Lightness Races com Monica no dia

2
@ lightness - Existem muitas razões pelas quais o código oficialmente obsoleto não é apenas uma "coisa que poderíamos fazer sempre que o abordássemos ". Talvez o código descontinuado use uma biblioteca, na qual o suporte oficial está sendo descartado. Talvez o código descontinuado seja o IP cuja licença está expirando após uma data fixa. Talvez após a data especificada, haja novos regulamentos e o código não seja compatível. Sua solução é ótima se você mora em uma torre de marfim. Mas as organizações do mundo real lidam com esse tipo de situação o tempo todo. O software precisa satisfazer as necessidades dos negócios, e não o contrário.
user79126
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.