Предотвращение компиляции устаревшего кода после достижения крайнего срока [закрыто]


68

В моей команде мы убирали много старых вещей в большом монолитном проекте (целые классы, методы и т. Д.).

Во время этих задач по очистке мне было интересно, есть ли какая-нибудь аннотация или библиотека более привлекательная, чем обычно @Deprecated. Это @FancyDeprecatedдолжно помешать успешной сборке проекта, если вы не очистили старый неиспользуемый код после истечения определенной даты.

Я искал в Интернете и не нашел ничего, что имеет описанные ниже возможности:

  • должна быть аннотация или что-то подобное для размещения в коде, который вы собираетесь удалить до определенной даты
  • до этой даты код скомпилируется и все будет работать нормально
  • после этой даты код не будет скомпилирован, и он сообщит вам о проблеме

Я думаю, что я ищу единорога ... Есть ли подобная технология для какого-либо языка программирования?

В качестве плана BI я думаю о возможности создания магии с помощью некоторых модульных тестов кода, который должен быть удален и который начинает проваливаться в «крайний срок». Что Вы думаете об этом? Есть идея получше?


168
Устаревание сделано для версии , а не для даты . Если вы хотите, чтобы люди прекратили использовать устаревшие функции, выпустите версию без них. Это привлечет их внимание, и они всегда могут откатиться, если пока не могут этого сделать. Множество людей застряли на старых версиях. Разорвать их программу не путь.
Исана

4
План Б звучит солидно. С дополнительными преимуществами, которые вы можете добавить в модульный тест, чтобы объяснить, почему он устарел. Добавление комментария к исходному коду не помогло бы читабельности в большом монолите
dwana

53
Это звучит как действительно злой единорог. У вас есть немного программного обеспечения, которое прекрасно компилируется, проходит все тесты, и вы отправили его клиенту. Затем, однажды, вы снова проверяете программное обеспечение, и оно не будет собираться даже на той же платформе разработки. Теперь вы вынуждены изменять код, который ранее проходил формальное тестирование, или совершать злые хакерские атаки, такие как откат часов компьютера.
Симон Б

6
Сделайте это @ Deprecated_RemoveMe_2018_06_01, а затем 2018-06-01 удалите саму аннотацию. Вуаля, весь ваш код с аннотацией больше не будет компилироваться! (потому что аннотация не найдена)
user253751

65
Через несколько лет вновь нанятый разработчик спросит: почему время на сервере сборки установлено на январь 2016 года? И парень, который находится там в течение 10 лет, скажет ему, что это необходимо, или сборка обрывается в случайных местах. Вздох.
Уилберт

Ответы:


62

Я не думаю, что это будет полезной функцией, когда она действительно запрещает компиляцию. Когда в 01/06/2018 большие части кода, которые были скомпилированы днем ​​ранее, не будут компилироваться, ваша команда снова быстро удалит эту аннотацию, очищенный код или нет.

Тем не менее, вы можете добавить некоторые пользовательские аннотации к коду, как

@Deprecated_after_2018_07_31

и создайте небольшой инструмент для сканирования этих аннотаций. (Простой вкладыш в grep сделает это, если вы не хотите использовать отражение). На других языках, кроме Java, можно использовать стандартизированный комментарий, подходящий для «grepping», или определение препроцессора.

Затем запустите этот инструмент незадолго до или после определенной даты, и, если он все еще обнаружит эту аннотацию, напомните команде о необходимости срочно очистить эти части кода.


9
@Bergi: эй, это всего лишь пример, OP может использовать версии или теги даты, что бы они ни предпочитали в своем контроле.
Док Браун

4
Я не вижу никакого преимущества в том, чтобы делать это по сравнению с обычными функциями устаревания и смотреть на выходные данные компилятора на конкретную дату. Кажется, что плохое использование времени разработчика, чтобы повторно реализовать то, что в значительной степени уже существует. Даже если у вас уже есть масса предупреждений (которые стоило бы потратить время на их очистку), вы наверняка можете заставить компилятор выложить все предупреждения в текстовый файл, а затем выполнить grep или выполнить поиск.
jpmc26

4
@jpaugh Я рекомендую не тратить часы (заметьте, время = деньги) на создание новых инструментов для выполнения задач, которые вы уже можете эффективно выполнять с помощью существующих инструментов, какими бы они ни были.
jpmc26

3
@ jpmc26: я вижу два (небольших) преимущества: не получать тонны предупреждений об устаревании (что может привести к упуску из виду более важных) и возможность введения различных критериев устаревания (даты, версии и т. д.) для разных разделов кода. Более того, ФП прямо попросил связать амортизацию с датой.
Док Браун

7
Я бы +1, если бы вы просто использовали порядок YYYY-MM-DD для даты в вашем примере, потому что я только когда-либо видел неоднозначный порядок ?? - ?? - YYYY, вызывающий боль и недопонимание.
mtraceur

284

Это будет особенность, известная как бомба замедленного действия . НЕ СОЗДАЙТЕ ВРЕМЕННЫЕ БОМБЫ.

Код, независимо от того , насколько хорошо вы структурировать и документировать его, не превратится в плохо понимал почти мифический черный ящик , если он живет за пределами определенного возраста. Последнее, что кому-то понадобится в будущем, - это еще один странный режим отказа, который застает их врасплох, в самое неподходящее время и без очевидных средств защиты. Нет абсолютно никакого оправдания для преднамеренного создания такой проблемы.

Посмотрите на это следующим образом: если вы организованы и в курсе вашего кода достаточно базы , что вы заботитесь о устаревания и следовать по нему, то вам не нужен механизм в коде , чтобы напомнить вам. Если вы этого не сделаете, есть вероятность, что вы также не в курсе других аспектов кодовой базы и, вероятно, не сможете своевременно и правильно реагировать на сигнал тревоги. Другими словами, бомбы замедленного действия никому не нужны. Просто сказать нет!


74
+1 Это тебя укусит. Месяцы спустя. В пятницу, когда вы пытаетесь выполнить экстренное развертывание. И это долгие выходные, поэтому все люди, которые что-то знают об этом, находятся вне офиса. Не делай этого.
Роджер Липскомб

3
Согласен. Устаревание - это организационная проблема, а не проблема кодирования. Я все еще могу подключить Apple] [и написать бейсик, ничто не останавливает меня. Но, я бы хочу , чтобы?

19
Правильное решение, в соответствии с вашим «организованным и осознанным» направлением, состоит в том, чтобы вызвать ошибку в вашей системе отслеживания ошибок, говоря «Удалить <такой-то и такой-то>», с предлагаемым периодом времени в комментариях. И затем через 6 месяцев, когда приходит обзор ошибок, чтобы выяснить, какие ошибки должны быть исправлены в следующем выпуске, если этот срок неизбежен, вы говорите: «пришло время сделать это». Это базовое управление проектом.
Легкость гонок с Моникой

1
На самом деле, если ваш график выпуска достаточно предсказуем, просто отметьте его сейчас.
Легкость гонок с Моникой

13
См комментарий isanae в альтернативу: « Если вы хотите , чтобы люди прекратить использование устаревших функций, выпустить версию без них это будет привлечь их внимание, и они всегда могут вернуться , если они не могут сделать это еще.. »
Stevoisiak

70

В C # вы должны использовать ObsoleteAttributeследующий способ:

  • В версии 1 вы отправляете функцию. Метод, класс, что угодно.
  • В версии 2 вы поставляете лучшую функцию, предназначенную для замены оригинальной функции. Вы помещаете атрибут «Устаревший» в функцию, устанавливаете для него «предупреждение» и отправляете ему сообщение «Эта функция устарела. Вместо этого используйте лучшую функцию. В версии 3 этой библиотеки, которая будет выпущена на том-то и том-то». дата, использование этой функции будет ошибкой ". Теперь пользователи этой функции все еще могут ее использовать, но у них есть время обновить свой код, чтобы использовать новую функцию.
  • В версии 3 вы обновляете атрибут как ошибку, а не как предупреждение, и обновляете сообщение, чтобы сказать «Эта функция устарела. Вместо этого используйте лучшую функцию. В версии 4 этой библиотеки, которая будет выпущена в том или ином виде». дата, эта функция будет выбрасывать. " Пользователи, которые не учли ваше предыдущее предупреждение, по-прежнему получают полезное сообщение, в котором говорится, как решить проблему, и они должны ее исправить, поскольку теперь их код не компилируется.
  • В версии 4 вы изменяете функцию так, чтобы она выдавала некое фатальное исключение, и изменяете сообщение, чтобы сказать, что функция будет полностью удалена в следующей версии.
  • В версии 5 вы полностью удаляете эту функцию, и если пользователи жалуются, ну, эй, вы дали им три цикла справедливого предупреждения о выпуске, и они всегда могут просто продолжать использовать версию 2, если они сильно к этому относятся.

Идея здесь состоит в том, чтобы сделать как можно более безболезненное изменение для затронутых пользователей и гарантировать, что они могут продолжать использовать эту функцию по крайней мере для одной версии библиотеки.


2
Я верю, что это правильный подход, но я бы изменил одну вещь: это поменялось бы «если пользователи жалуются» на «когда пользователи жалуются»
Liath

10
Удаление тела одновременно с переключением на ошибку кажется странным. Одним из преимуществ устаревшей версии ошибки является то, что она позволяет коду, созданному на основе предыдущих версий, продолжать функционировать, в то же время предотвращая его использование вновь скомпилированным кодом. Таким образом, вы остаетесь ABI-совместимым, сознательно нарушая API-совместимость. Конечно, в идеальном мире вы будете иметь версионное управление в стиле semver и т. Д., Так что вы никогда не будете запускать новый код с ранее скомпилированным приложением, но многие проекты никогда не достигнут этого идеала.
Кевин Кэткарт

@KevinCathcart: это хороший момент; может быть, другой этап там оправдан! Я обновлю текст.
Эрик Липперт

1
На самом деле, если вы используете SemVer, вы можете перейти от устаревшего в версии XY0 (любой устаревший выпуск должен быть второстепенным) к полностью удаленному в X + 1.0.0. Я бы сказал, что было бы неплохо подождать немного дальше (до X + 2.0.0?), Но этот пятиступенчатый процесс, вероятно, позолота лилии. Следующим шагом после «предупреждения» должна быть «фатальная ошибка» (поскольку устаревшая функция заменяется кодом, генерирующим ошибки). Поскольку libfoo.so.2и libfoo.so.3могут прекрасно сосуществовать друг с другом, ваш нисходящий поток может продолжать использовать старую библиотеку, пока они не переключатся.
Монти Хардер

@MontyHarder: Конечно. Точная последовательность событий может быть определена потребностями разработчика и его сообщества пользователей. Более важный момент заключается в том, что должна быть продуманная политика для решения таких проблем контроля версий, которая четко доводится до сведения заинтересованных сторон.
Эрик Липперт

24

Вы неправильно поняли, что значит «устарел». Устаревший означает:

быть пригодным для использования, но считаться устаревшим и лучше избегать, как правило, потому что он был заменен.

Оксфордские словари

По определению устаревшая функция все равно будет компилироваться.

Вы хотите удалить функцию на определенную дату. Все в порядке. То, как вы делаете это, вы удаляете это в тот же день .

До тех пор, пометьте как устаревший, устаревший, или как его называет ваш язык программирования. В сообщении укажите дату, когда оно будет удалено, и то, что его заменяет. Это будет генерировать предупреждения, указывающие, что другие разработчики должны избегать нового использования и должны заменять старое использование везде, где это возможно. Эти разработчики будут либо соблюдать, либо игнорировать его, и кому-то придется иметь дело с последствиями этого, когда он будет удален. (В зависимости от ситуации это может быть вы или разработчики, использующие его.)


Интересует то, с чем не согласен downvoter.
jpmc26

2
+1. Если вы используете JIRA для гибкой разработки, создайте задачу и поместите ее в будущий спринт; адаптироваться к любым другим инструментам и методологии управления проектами, которые вы используете. Это лучше всего решить нетехническими методами.
Мэтью Рид

1
А также убедитесь, что Class / Lib остается в документации как устаревшая и / или удаленная в версии Xx
Phil M

12

Не забывайте, что вам необходимо сохранить возможность создавать и отлаживать более старые версии кода, чтобы поддерживать уже выпущенные версии программного обеспечения. Саботаж сборки после определенной даты означает, что вы также рискуете помешать себе в будущем выполнять законные работы по обслуживанию и поддержке.

Кроме того, это кажется тривиальным обходным решением - вернуть часы моей машины за год или два до компиляции.

Помните, что «не рекомендуется» - это предупреждение о том, что что-то исчезнет в будущем. Если вы хотите принудительно запретить людям использовать этот API, просто удалите связанный код . Нет смысла оставлять код в базе кода, если какой-то механизм делает его непригодным для использования. Удаление кода дает вам проверки во время компиляции, которые вы ищете, и не имеет тривиального обходного пути.

Редактировать: я вижу, вы ссылаетесь на "старый неиспользуемый код" в вашем вопросе. Если код на самом деле не используется , нет смысла его оскорблять. Просто удали это.


Лучший ответ на данный момент, возможно, подчеркивает, что удаление кода - лучший способ решить проблему быстрее в вашем ответе. Это может быть легко прокрутить мимо стены текстовых ответов
Клинт

6

Я никогда раньше не видел такой возможности - аннотацию, которая начинает действовать после определенной даты.

Однако этого @Deprecatedможет быть достаточно. Поймать предупреждения в CI и заставить его отказаться от принятия сборки, если таковые имеются. Это переносит ответственность с компилятора на ваш конвейер сборки, но имеет то преимущество, что вы можете (полу) легко изменять конвейер сборки, добавляя дополнительные шаги.

Обратите внимание, что этот ответ не полностью решает вашу проблему (например, локальные сборки на машинах разработчиков все равно будут успешными, хотя и с предупреждениями) и предполагают, что у вас настроен и запущен конвейер CI.


4

Вы ищете календари или списки дел .

Другой альтернативой является использование пользовательских предупреждений компилятора или сообщений компилятора, если вам удастся иметь мало предупреждений в вашей кодовой базе. Если у вас слишком много предупреждений, вам придется потратить дополнительные усилия (около 15 минут?) И собрать предупреждение компилятора в отчете о сборке, который ваша непрерывная интеграция предоставляет для каждой сборки.

Напоминания о том, что код должен быть исправлен, хороши и необходимы. Иногда эти напоминания имеют строгие крайние сроки в реальном мире, поэтому может понадобиться поставить их на таймер.

Цель состоит в том, чтобы постоянно напоминать людям, что проблема существует и должна быть решена в течение определенного периода времени - функция, которая просто нарушает сборку в определенное время, не только не делает этого, но сама эта функция является проблемой, которая должна быть исправлено в течение определенного периода времени.


1
Согласен. Но если проблема существует и должна быть решена в течение определенного периода времени, то она должна стать чьим-то главным приоритетом в нужное время. Я помню, когда на собрании мой менеджер дал мне «высший приоритет», потом сказал: « Это ваш приоритет номер один» (что-то другое). Мой начальник сказал: «У него не может быть двух приоритетов номер один!» Менеджер был поражен. Я думаю, он думал, что ... я мог. Планирование того, что будет исправлено «в нужное время», означает, что время истекает.

3

Один из способов думать об этом - то, что вы подразумеваете под временем / датой ? Компьютеры не знают, что это за понятия: они должны быть каким-то образом запрограммированы. Распространено представлять время в формате UNIX «секунд с начала эпохи», и обычно вводить определенное значение в программу с помощью вызовов ОС. Однако, независимо от того, насколько распространено это использование, важно помнить, что это не «фактическое» время: это просто логическое представление.

Как уже отмечали другие, если вы установили «крайний срок», используя этот механизм, тривиально кормить в другое время и нарушать этот «крайний срок». То же самое касается более сложных механизмов, таких как запрос NTP-сервера (даже через «безопасное» соединение, поскольку мы можем заменять наши собственные сертификаты, центры сертификации или даже исправлять криптографические библиотеки). Сначала может показаться, что такие люди виноваты в работе вокруг вашего механизма, но может случиться так, что это делается автоматически и по уважительным причинам . Например, неплохо иметь воспроизводимые сборки , и инструменты, которые могут помочь в этом, могут автоматически сбрасывать / перехватывать такие недетерминированные системные вызовы. libfaketime делает именно это,устанавливает временные метки всех файлов, функция записи / воспроизведения1970-01-01 00:00:01 Qemu подделывает все аппаратное взаимодействие и т. д.

Это похоже на закон Гудхарта : если вы заставляете поведение программы зависеть от логического времени, то логическое время перестает быть хорошей мерой «фактического» времени. Другими словами, люди обычно не будут связываться с системными часами, но они будут, если вы дадите им причину.

Существуют и другие логические представления времени: одним из них является версия программного обеспечения (либо ваше приложение, либо некоторая зависимость). Это более желательное представление для «крайнего срока», чем, например, для времени UNIX, так как оно более специфично для того, что вас волнует (изменение наборов функций / API), и, следовательно, с меньшей вероятностью нарушит ортогональные задачи (например, возиться со временем UNIX до работа в установленные сроки может привести к повреждению файлов журналов, заданий cron, кешей и т. д.).

Как уже говорили другие, если вы управляете библиотекой и хотите «подтолкнуть» это изменение, вы можете нажать новую версию, которая устарела, и вызвать новые предупреждения, чтобы помочь пользователям найти и обновить их использование), а затем другую новую версию, которая удаляет Особенности полностью. Вы можете опубликовать их сразу после друг друга, если хотите, поскольку (опять же) версии являются просто логическим представлением времени, они не должны быть связаны с «фактическим» временем. Семантическая версия может помочь здесь.

Альтернативная модель - «вытянуть» изменения. Это похоже на ваш «план Б»: добавьте тест в приложение-потребитель, которое проверяет, что версия этой зависимости, по крайней мере, является новым значением. Как обычно, красный / зеленый / рефакторинг для распространения этого изменения через кодовую базу. Это может быть более подходящим, если функциональность не является «плохой» или «неправильной», а просто «плохо подходит для этого варианта использования».

Важный вопрос с подходом «pull» заключается в том, считается ли версия зависимости «единицей» ( функциональности ) и, следовательно, заслуживает тестирования; или это просто «частная» деталь реализации, которая должна выполняться только как часть реальных модульных ( функциональных ) тестов. Я бы сказал: если различие между версиями зависимости действительно считается особенностью вашего приложения, тогда проведите тест (например, проверяя, что версия Python>> 3.x). Если нет, то недобавить тест (поскольку он будет хрупким, неинформативным и чрезмерно ограничительным); если вы управляете библиотекой, тогда идите по «push» маршруту. Если вы не управляете библиотекой, просто используйте ту версию, которая вам предоставлена: если ваши тесты пройдут, ограничивать себя не стоит; если они не пройдут, значит, это ваш «крайний срок»!

Существует другой подход, если вы хотите препятствовать определенному использованию функций зависимостей (например, вызывать определенные функции, которые плохо работают с остальным кодом), особенно если вы не контролируете зависимость: запретите свои стандарты кодирования / не поощряйте использование этих функций и добавляйте проверки для их линтера.

Каждый из них будет применим в разных обстоятельствах.


1

Вы управляете этим на уровне пакета или библиотеки. Вы контролируете пакет и контролируете его видимость. Вы можете отказаться от видимости. Я видел это внутри крупных компаний, и это имеет смысл только в культурах, которые уважают владение пакетами, даже если пакеты имеют открытый исходный код или бесплатны для использования.

Это всегда грязно, потому что команды клиентов просто не хотят ничего менять, поэтому вам часто нужно несколько раундов только для белого списка, когда вы работаете с конкретными клиентами, чтобы договориться о крайнем сроке миграции, возможно, предлагая им поддержку.


Мне нравится часть поддержки. Все изменения происходят плавнее, приятнее и, вероятно, с меньшими трудностями, если люди, которые их продвигают, предлагают поддержку. Это отчасти психологический эффект: хорошая поддержка - это сотрудничество; все это серьезно. Напротив, изменения, навязанные сверху без вовлечения заинтересованных сторон, заставляют их чувствовать себя проигнорированными и не желающими сотрудничать. (Хотя дружелюбие должно сочетаться с неослабевающим стремлением добиться изменений.)
Питер - восстановите Монику

1

Одним из требований является введение понятия времени в сборку. В C, C ++ или других языках систем , которые используют C-подобный препроцессор / построить 1 , можно было бы ввести метку времени через определяет для препроцессора во время сборки: CPPFLAGS=-DTIMESTAMP()=$(date '+%s'). Это может произойти в make-файле.

В коде можно сравнить этот токен и вызвать ошибку, если время истекло. Обратите внимание, что при использовании макроса функции обнаруживается случай, который кто-то не определил TIMESTAMP.

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

В качестве альтернативы можно просто «определить» рассматриваемый код, когда придет время. Это позволило бы программе компилироваться при условии, что никто ее не использует. Скажем, у нас есть заголовок, определяющий api, "api.h", и мы не разрешаем звонить old()через определенное время:

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

Подобная конструкция, вероятно, исключит old()тело функции из некоторого исходного файла.

Конечно, это не доказательство глупости; можно просто определить старый TIMESTAMPв случае аварийной сборки в пятницу вечером, упомянутой в другом месте. Но это, я думаю, довольно выгодно.

Это, очевидно, работает только тогда, когда библиотека перекомпилируется - после этого устаревший код просто больше не существует в библиотеке. Это не помешало бы ссылкам клиентского кода на устаревшие двоичные файлы.


1 C # поддерживает только простое определение символов препроцессора, а не числовые значения, что делает эту стратегию нежизнеспособной.


Также стоит отметить, что это определение препроцессора заставит весь код, который использует, TIMESTAMPперекомпилироваться при каждой сборке. Это также выведет из строя инструменты, такие как ccache. Это означает, что типичное время компиляции для инкрементных сборок значительно увеличится в зависимости от того, насколько сильно на кодовую базу влияют функции, которые устарели таким образом.
mindriot

@mindriot Это интересный аспект. Я предполагаю, что это верно для каждого метода, вводящего понятие времени в коде, хотя - ОП явно сказал «после того, как определенная дата прошла». Можно было бы обработать аспект времени в системе сборки и оставить код в покое, правда. Но ОП явно попросил «что-то вставить в код». Мое решение имеет преимущество в том, что он не зависит от какого-либо конкретного метода сборки. Это может быть изменено, но вы должны угодить этому так или иначе.
Питер - Восстановить Монику

Вы совершенно правы. Ваше решение здесь, по сути, единственное, которое обеспечивает практическое решение актуального вопроса ОП . Тем не менее я считаю важным указать на обратную сторону. Это будет до ОП, чтобы взвесить все за и против. Я думаю, что можно достичь здорового среднего уровня, скажем, путем деления TIMESTAMPзначения, скажем, на 86400, чтобы получить ежедневную детализацию и, следовательно, меньшее количество перекомпиляций.
mindriot

0

В Visual Studio вы можете настроить сценарий предварительной сборки, который выдает ошибку после определенной даты. Это предотвратит компиляцию. Вот сценарий, который выдает ошибку 12 марта 2018 года или после этой даты ( взято отсюда ):

@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.
)

Обязательно прочитайте другие ответы на этой странице, прежде чем использовать этот скрипт.


-1

Я понимаю цель того, что вы пытаетесь сделать. Но, как уже упоминали другие, сборочная система / компилятор, вероятно, не подходящее место для реализации этого. Я бы предложил более естественный уровень для реализации этой политики - это либо переменные SCM, либо переменные среды.

Если вы сделаете последнее, в основном добавьте флаг функции, который помечает прогон предварительного устаревания. Каждый раз, когда вы создаете устаревший класс или вызываете устаревший метод, проверяйте флаг функции. Просто определите одну статическую функцию assertPreDeprecated()и добавьте ее к каждому устаревшему пути кода. Если он установлен, игнорировать вызовы assert. Если это не бросить в исключение. Как только дата пройдет мимо, снимите флажок функции в среде выполнения. Любые устаревшие вызовы кода будут отображаться в журналах выполнения.

Для решения на основе SCM я предполагаю, что вы используете git и git-flow. (Если нет, логика легко адаптируется к другим VCS's). Создать новую ветку postDeprecated. В этой ветке удалите весь устаревший код и начните работу по удалению любых ссылок, пока он не скомпилируется. Любые нормальные изменения продолжают вносить в masterветку. Продолжайте объединять любые изменения кода, не осуждаемые как устаревшие, masterобратно, postDeprecatedчтобы минимизировать проблемы интеграции.

После окончания срока действия устаревшей создайте новую preDeprecatedветку из master. Затем postDeprecatedвернитесь в master. Предполагая, что ваш выпуск выходит из masterветки, теперь вы должны использовать пост-устаревшую ветку после даты. Если возникла чрезвычайная ситуация или вы не можете доставить результаты вовремя, вы всегда можете выполнить откат preDeprecatedи внести необходимые изменения в эту ветку.


7
Такой подход звучит как логистический кошмар. Если вы начнете поддерживать почти повторяющиеся параллельные ветви, вы в конечном итоге будете тратить на это все свое время. Всего отходов.
Легкость гонок с Моникой

6
Я не могу согласиться с тем, что поддержание параллельных ветвей, использование одной из которых просто для удаления устаревших функций за многие версии до того, как вы действительно захотите удалить их из продукта, в любом случае является «отраслевым стандартом». Какова цель этого? Да, VCS может автоматически выполнять некоторые слияния, но слияние должно выполняться глазами разработчика, чтобы разрешить логические конфликты (и что происходит, когда вы получаете конфликт, который невозможно даже лексически разрешить?). Иметь систему сборки произвольно объединять каждый день, потому что это просто ... бессмысленно. Удалить функцию, когда пришло время удалить ее.
Легкость гонки с Моникой

3
Потому что есть веская причина для поддержки веток релиза (бэкпорт важных патчей). Нет веских причин поддерживать ветку «что-то, что я мог бы сделать в будущем». Это накладные расходы, без пользы. Просто как тот.
Легкость гонки с Моникой

4
Где я это взял? Это буквально определение амортизации. Вы осуждаете что-то, что вы можете удалить в будущем. Таким образом, нет никакой хитрости, нет движения ворот и, конечно, нет выдумки, просто чтобы «выиграть спор». Это не «случай использования SCM в учебниках» ни в одной организации, в которой я хочу работать! Я думаю, мы должны согласиться не согласиться. Приятного вечера!
Легкость гонок с Моникой

2
@lightness - существует множество причин, по которым официально устаревший код - это не просто «то, что мы могли бы сделать, когда бы мы к нему ни подходили ». Может быть, устаревший код использует библиотеку, где прекращается официальная поддержка. Возможно, устаревшим кодом является IP, срок действия лицензии которого истекает после определенной даты. Может быть, после указанной даты, есть новые правила, и код не соответствует. Ваше решение все хорошо, если вы живете в башне из слоновой кости. Но реальные организации постоянно сталкиваются с подобными ситуациями. Программное обеспечение должно удовлетворять потребности бизнеса, а не наоборот.
user79126
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.