Депресія вважається шкідливою? [зачинено]


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 неправильно підтримувати оголошення змінної всередині а для оператора. Це тривало близько десятиліття і зробило багато коду непереносним. Це одна "особливість", яку я радий, що вона застаріла.

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

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


11

якщо ми дійсно хочемо зневажити речі, я висуваю printf ()

printfє корисною функцією. Це дозволяє форматувати речі способами коротшими, ніж іострими. І це функція C. Сама причина C ++ існує і використовується в тому, що вона сумісна з C. Отже, депресація printfвидається менш корисною.

Отже, хтось ще підходив до антидепресаційного хрестового походу?

Комітет усвідомлює деякі проблеми поточного передбачуваного сенсу знецінення. Побачити сенс депресії .


5

Мови та API повинні рухатися вперед. Незважаючи на те, що може бути тонни коду залежно від якоїсь старої функції, може бути новий і кращий спосіб зробити щось, а вартість підтримки старої функції - занадто велика.

Депресія також попереджає, що в майбутньому функцію буде видалено. Це дає розробникам час на оновлення свого коду, якщо вони йдуть в ногу з новим API. Це набагато краще, ніж альтернатива: відверте видалення. Пам'ятайте, що амортизація - це попередження, а не помилка.

І якщо це стара програма, яку ви не хочете оновлювати, то ніщо не заважає вам використовувати старий API (або в цьому випадку компілятор).


1

На сьогоднішній день депресія має щонайменше два значення.

  • Він буде видалений у майбутній версії
  • Ми створили кращі альтернативи, і тепер ця функція є зайвою (але не зовсім марною). Новачки краще пропустити це під час вивчення мови; однак його скоро не збиратимуться видаляти

Я думаю, що статика потрапляє в останню категорію, але лише час покаже, чи дійсно заслуговує на вилучення auto_ptr або його краще зберегти в мові.


0

Депресія не шкідлива, якщо перехід на альтернативу може бути здійснений за 1 робочий день: наприклад. простий пошук / заміна старої функції новою, або шар сумісності легко налаштувати.

Якщо вам потрібно переписати велику частину програмного забезпечення через депресію, то це шкідливо.

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

Одним поганим прикладом є депрекація та видалення glBegin, glEnd та всіх матричних обчислень з OpenGL, якщо ви хочете, щоб ваш код працював на OpenGL3 або вище, вам потрібно буде переписати весь код візуалізації, щоб використовувати вершинні буфери.


-1

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.