Устаревание считается вредным? [закрыто]


27

Я только что скомпилировал свой собственный код с -std=c++0xфлагом в GCC, так как я хочу смутно следить за тем, что делают все молодые люди (при условии, что они остаются на моей лужайке), и я получил массу предупреждений о том, auto_ptrчто не рекомендуется. Конечно, я знал, что auto_ptrэто устарело в C ++ 0x, но ...

Разве амортизация не является пустой тратой времени и усилий? Причины отказа от использования (например, с auto_ptr):

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

  • auto_ptr немного наф, но на самом деле он делает то, что говорит на жестяной банке.

  • если мы действительно хотим осудить вещи, я назначаю printf(). Но только представьте визги, которые будут следовать. auto_ptrу меня не так уж много друзей, но, по крайней мере, в моем C ++-коде он используется больше, чем printfвообще не используется.

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

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

Итак, мой вопрос - считаете ли вы устаревание (всего, не только auto_ptrs и не только в C ++) хорошей идеей, и если да, то почему?


2
@TheLQ - я читаю это как «зачем что-то обесценивать», но auto_ptrна примере.
— ChrisF

4
на банке написано "разбьется твое сердце, если его использовать в контейнерах практически любого типа"? Используйте unique_ptrи будьте счастливее.
— Кейт Грегори

13
@Neil - ваш язык немного подстрекательский и (если подумать) выглядит скорее как напыщенная речь, чем как серьезный вопрос. Если вы хотите, чтобы он оставался открытым, вы можете захотеть «уменьшить его».
— ChrisF

4
@Neil - Я ценю, что ты задумал это с юмором, но, как я уже сказал, после размышлений он оказался более «напыщенным», чем, я думаю, ты намеревался.
— ChrisF

10
Если вы когда-нибудь планируете избавиться от обесценивания, вам действительно следует сначала обесценить его. В противном случае многие существующие языки / API-интерфейсы сломаются. С амортизацией вы могли бы дать им некоторое время, чтобы избавиться от их устаревших устаревших.
— Йоахим Зауэр

Ответы:


32

Причины износа (в целом):

  • Это ясно показывает людям, что что-то является плохой практикой (и, надеюсь, предлагает альтернативу).
  • Период устаревания дает людям возможность изменить свой код до того, как компилятор полностью его удалит.

Я также не согласен с последним пунктом. Компиляторы не игнорируют комитет, и они в конечном итоге удаляют вещи, которые устарели (например, >?=и <?=в GCC - они устарели, а затем удалились *).

Я думаю, что важный момент: некоторые вещи должны быть удалены по разным причинам, и я думаю, что амортизация - единственный разумный способ сделать это. В этом конкретном случае auto_ptrследует удалить, поскольку он был заменен unique_ptr. Переключение достаточно легко, и у людей будет достаточно времени для этого.

(*) Да, я знаю, что они являются расширениями и не являются стандартными, но дело в том, что поставщики компиляторов в конечном итоге удаляют вещи после того, как они устаревают, независимо от того, полагается ли на них код или нет.


6
Извините за оффтоп, но я не могу удержаться: каковы были те , >?=и <?=операторы?
— brandizzi

7
В старом GCC вы могли написать, a >?= b;что было сокращением для, if (a > b) a = b;а также для <?=.
— Питер Александр

2
Тьфу ... Я понимаю, почему они добавили это. А потом почему они это убрали. Устаревание может быть необходимо для «аккуратных» функций, которые показывают, насколько они проблематичны после их публикации.
— Фил

25

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

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

Устаревание является самой разумной из этих альтернатив.


12

Неа. Устаревание может быть действительно хорошей вещью. Это предотвращает застревание технологий в старом бесполезном багаже.

Как раз на арене C ++ я помню «особенность» Microsoft - неправильно поддерживать объявление переменных внутри оператора for. Это продолжалось около десяти лет и сделало много кода непереносимым. Это одна "особенность", я рад, что она устарела.

В целом, с 80-х годов Apple имела привычку помечать неуклюжие старые API как «устаревшие» в течение 5-7 лет, прежде чем их дергать. Я только что говорил с инженером Apple на WWDC об устаревании некоторых из древних API-интерфейсов QuickTime C, и был очень рад услышать, что они делают это, потому что постоянная поддержка модели, разработанной в 1990 году, полностью препятствовала тому, что можно было ожидать. делать на современных 64-битных многоядерных процессорах.

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


11

если мы действительно хотим отказаться от вещей, я назначаю printf ()

printfэто полезная функция. Это позволяет форматировать вещи намного короче, чем iostreams. И это функция C. Причина, по которой C ++ существует и используется, заключается в том, что он совместим с C. Поэтому устаревание printfкажется менее полезным.

Итак, кто-нибудь еще готовится к крестовому походу против амортизации?

Комитет осведомлен о некоторых проблемах нынешнего предполагаемого значения амортизации. Увидеть значение амортизации .


5

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

Амортизация также дает предупреждение, что в будущем эта функция будет удалена. Это дает разработчикам время для обновления своего кода, если они идут в ногу с новым API. Это намного лучше, чем альтернатива: прямое удаление. Помните, что амортизация - это предупреждение, а не ошибка.

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


1

В нынешнем виде амортизация имеет как минимум два значения.

  • Это будет удалено в будущей версии
  • Мы создали лучшие альтернативы, и теперь эта функция избыточна (но не совсем бесполезна). Новичкам лучше пропустить это, изучая язык; однако, это не будет удалено в ближайшее время.

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


0

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

Если вам нужно переписать большие части программного обеспечения из-за устаревания, то это вредно.

Хорошим примером может быть PHP mysql API, в основном вам просто нужно заменить все mysql_ * на mysqli_ * и предоставить им идентификатор ссылки, и все готово.

Один плохой пример - устаревание и удаление glBegin, glEnd и всего, что связано с вычислениями матрицы из OpenGL. Если вы хотите, чтобы ваш код работал на OpenGL3 или выше, вам нужно переписать весь код рендеринга для использования вершинных буферов.


-1

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.