Устаревшее программное обеспечение и код¶
Deprecated (от англ. deprecate — «осуждать», «не одобрять», в переносном смысле — «объявлять устаревшим») — в разработке программного обеспечения статус, присваиваемый компоненту (функции, методу, классу, библиотеке, протоколу или целому продукту), который формально всё ещё поддерживается и доступен для использования, но не рекомендуется к применению, поскольку для него существует более совершенная или безопасная альтернатива. Объявление компонента устаревшим (deprecation) является частью процесса управления жизненным циклом программного продукта и служит промежуточным этапом между полноценной поддержкой и полным удалением компонента из будущих версий.
¶Назначение и причины
Статус deprecated вводится для обеспечения плавной миграции пользователей и разработчиков на новые технологии. Основные цели объявления компонента устаревшим:
- Информирование сообщества о том, что компонент может быть удалён в будущих версиях, что позволяет заранее спланировать обновление кодовой базы.
- Снижение нагрузки на поддержку: разработчики перестают тратить ресурсы на исправление ошибок в устаревшем коде и сосредотачиваются на актуальных версиях.
- Стимулирование перехода на новые, более безопасные или производительные решения, особенно если в старом компоненте обнаружены уязвимости или архитектурные ограничения.
Причинами объявления устаревшим могут быть: наличие критических ошибок, которые невозможно исправить без нарушения обратной совместимости; появление более удачного API; изменение стандартов; переход на новую парадигму программирования; прекращение поддержки технологии-основы.
¶Способы обозначения
Практически во всех языках программирования и средах разработки существуют механизмы пометки кода как устаревшего. Такая пометка обычно сопровождается комментарием с указанием причины и альтернативы.
- Java: аннотация
@Deprecatedи Javadoc-тег@deprecated. Начиная с Java 9, аннотация позволяет указывать версию, с которой элемент устарел, и ссылку на замену (since,forRemoval). - Python: декоратор
@deprecatedиз модуляwarnings(или сторонних библиотек, напримерDeprecationWarning). Вызов устаревшей функции вызывает предупреждение в рантайме. - C#: атрибут
[Obsolete], который может выдавать предупреждение или ошибку компиляции при использовании помеченного члена. - JavaScript/TypeScript: JSDoc-тег
@deprecated; в TypeScript также возможно использование декораторов. - PHP: атрибут
#[Deprecated](с версии 8.0) и docblock-тег@deprecated. - C++: стандартного механизма нет, однако часто используется макрос
[[deprecated]](атрибут языка с C++14).
Интегрированные среды разработки (IDE) визуально выделяют устаревший код — например, перечёркивают имя функции или подсвечивают его предупреждением. Компиляторы и линтеры могут выдавать предупреждения при сборке проекта, использующего устаревшие вызовы.
¶Процесс вывода из эксплуатации
Жизненный цикл устаревшего компонента обычно включает несколько стадий:
- Объявление устаревшим: компонент помечается как deprecated в документации и коде. Он продолжает работать, но пользователей предупреждают о нежелательности его использования.
- Период предупреждения: может длиться от нескольких месяцев до нескольких лет. В течение этого времени разработчики ядра продукта поддерживают обратную совместимость и публикуют руководства по миграции.
- Ужесточение предупреждений: в некоторых случаях уровень предупреждения повышается (например, от предупреждения до ошибки компиляции) для принуждения к обновлению.
- Удаление: компонент полностью исключается из новой версии продукта. Попытка его использования приводит к ошибке компиляции или выполнения.
Не все устаревшие компоненты удаляются. Некоторые остаются в кодовой базе десятилетиями из-за огромного количества зависимого кода. Например, функция mysql_query в PHP была объявлена устаревшей в PHP 5.5 (2013 год) и удалена только в PHP 7.0 (2015 год). Некоторые функции Python, помеченные как deprecated, сохраняются в стандартной библиотеке на протяжении многих релизов.
¶Отличие от смежных понятий
Термин deprecated часто путают со смежными концепциями:
- Obsolete — компонент, который не просто не рекомендуется, а уже фактически заменён и не имеет смысла в современном контексте. В русскоязычной документации оба термина часто переводятся как «устаревший», но deprecated подразумевает формальный статус с предупреждением, а obsolete — фактическое состояние.
- Unsupported — компонент, который больше не получает обновлений и не поддерживается разработчиками, но может не иметь официального статуса deprecated.
- Legacy code — унаследованный код, который всё ещё используется в продакшене, но написан с применением старых подходов. Такой код может не иметь формального статуса deprecated, но считается устаревшим по духу.
¶Влияние на разработку
Пометка deprecated несёт важную коммуникационную функцию. Для разработчиков библиотек и фреймворков это способ управления ожиданиями пользователей. Для разработчиков приложений — сигнал о необходимости планирования технического долга. Игнорирование предупреждений об устаревании приводит к накоплению технического долга и усложняет будущие обновления зависимостей.
Существует практика «мягкого» устаревания, когда компонент не удаляется, но его использование явно не поощряется. Это позволяет сохранить обратную совместимость для проектов, которые не могут обновиться по объективным причинам (например, из-за отсутствия ресурсов или жёстких требований заказчика).
¶Критика подхода
Подход с объявлением устаревшим имеет недостатки. Критики отмечают, что длительное сохранение устаревших компонентов раздувает API и усложняет документацию. Новички могут случайно использовать deprecated-функции, не обращая внимания на предупреждения. Кроме того, слишком частое объявление компонентов устаревшими в быстро развивающихся фреймворках создаёт у разработчиков ощущение «гонки за обновлениями» и снижает доверие к стабильности платформы.
В ответ на это некоторые проекты (например, Angular) практикуют более жёсткую политику: компонент либо активно поддерживается, либо удаляется в течение одного-двух крупных релизов, без длительного промежуточного статуса.
¶Примеры известных устареваний
- В 2017 году компания Adobe объявила устаревшей технологию Flash Player, рекомендовав переход на HTML5. Поддержка полностью прекращена 31 декабря 2020 года.
- Функции
each()иlist()в PHP в различных контекстах объявлялись устаревшими и удалялись в PHP 8.0. - Метод
Date.parseв JavaScript имеет особенности, признанные устаревшими, но сохранённые для обратной совместимости. - В Python 3.9 объявлен устаревшим способ задания параметров через
@functools.lru_cache, что привело к появлению нового синтаксиса в Python 3.10.
¶Значение в документировании
Для технических писателей статус deprecated — важный элемент документации. Обычно устаревшие разделы помечаются специальными значками или плашками, переносятся в приложения или отдельные разделы, чтобы не вводить в заблуждение читателей актуальной документации. В справочниках по API устаревшие элементы часто выводятся в конец списка или скрываются по умолчанию.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →

