Verfall als schädlich? [geschlossen]

27

Ich habe gerade einen Teil meines eigenen Codes mit der -std=c++0xFlagge in GCC kompiliert , da ich vage auf dem Laufenden halten möchte, was alle jungen Leute tun (vorausgesetzt, sie bleiben auf meinem Rasen), und am Ende habe ich eine Menge Warnungen erhalten über auto_ptrveraltet zu sein. Natürlich wusste ich, dass auto_ptrdas in C ++ 0x veraltet war, aber ...

Ist Abschreibung nicht eine Verschwendung von Zeit und Mühe? Gründe für die Nichtbeachtung (am Beispiel von auto_ptr):

  • Es gibt eine Vielzahl von Codes, die noch unterstützt werden müssen. Millionen von Warnungen werden nur dazu verleiten, Warnungen auszuschalten.

  • auto_ptr ist ein bisschen naff, aber es macht tatsächlich das, was es verspricht.

  • Wenn wir wirklich Dinge missbilligen wollen, nominiere ich printf(). Aber stellen Sie sich nur das Quietschen vor, das folgen würde. auto_ptrhat nicht zu viele Freunde, aber in meinem C ++ - Code wird es mehr als verwendet printf, was überhaupt nicht verwendet wird.

  • hat der Ausschuß eine schlechte Bilanz dieses Recht zu bekommen - sie statisch auf Namespacebereich ist veraltet, und jetzt scheint es undeprecated worden zu sein - ich würde nicht überrascht sein , wenn auto_ptrein ähnlichen Come-back gemacht

  • Was auch immer das Komitee sagt, die Compiler-Implementierer ignorieren sie - sie können es einfach nicht riskieren, ihren Kundencode zu brechen, sie können nur irritierende Warnungen ausgeben.

Also meine Frage - halten Sie Verfall (von irgendetwas, nicht nur auto_ptrs und nicht nur in C ++) für eine gute Idee, und wenn ja, warum?

Neil Butterworth
quelle
2
@TheLQ - Ich las es als "warum etwas abschreiben", aber auto_ptrals Beispiel.
ChrisF
4
steht auf der Dose "wird dir das Herz brechen, wenn du es in Behältern fast aller Art verwendest"? Nutzen unique_ptrund glücklicher sein.
Kate Gregory
13
@Neil - Ihre Sprache ist ein wenig aufrührerisch und (nachdenklich) eher ein Scherz als eine ernste Frage. Wenn Sie möchten, dass es offen bleibt, können Sie es "abschwächen".
ChrisF
4
@Neil - Ich weiß es zu schätzen, dass du es so humorvoll gemeint hast, aber wie gesagt, beim Nachdenken kam es über mehr "Garantie", als ich denke, dass du beabsichtigt hast.
ChrisF
10
Wenn Sie jemals vorhaben, die Abwertung loszuwerden, sollten Sie sie zuerst wirklich ablehnen. Viele existierende Sprachen / APIs würden sonst kaputt gehen. Mit Verfall könntest du ihnen etwas Zeit geben, um ihre verfallenen Verfälle loszuwerden.
Joachim Sauer

Antworten:

32

Gründe für die Abwertung (allgemein):

  • Es zeigt den Menschen deutlich an, dass etwas falsch ist (und schlägt hoffentlich eine Alternative vor).
  • Der Verfallszeitraum gibt Benutzern die Möglichkeit, ihren Code zu ändern, bevor der Compiler ihn endgültig entfernt.

Ich bin mir auch nicht einig über den letzten Punkt. Compiler ignorieren das Komitee nicht und entfernen schließlich Dinge, die veraltet sind (z. B. >?=und <?=in GCC - sie wurden veraltet und dann entfernt *).

Ich denke, der wichtige Punkt ist: Einige Dinge sollten aus verschiedenen Gründen entfernt werden, und ich denke, dass Ablehnung der einzig vernünftige Weg ist, dies zu tun. In diesem speziellen Fall auto_ptrsollte entfernt werden, da es durch ersetzt wurde unique_ptr. Das Umrüsten ist einfach genug und die Leute werden viel Zeit dazu haben.

(*) Ja, ich weiß, dass es sich um Erweiterungen und nicht um Standard handelt, aber der Punkt ist, dass Compiler-Anbieter eventuell Dinge entfernen, sobald sie Verfallsdatum eingeben, unabhängig davon, ob der Code noch auf ihnen basiert oder nicht.

Peter Alexander
quelle
6
Entschuldigung für das offtopic, aber ich kann nicht widerstehen: Was waren das >?=und <?=Operatoren?
Brandizzi
7
Im alten GCC konnte man schreiben, a >?= b;wofür if (a > b) a = b;und für was <?=.
Peter Alexander
2
Ugh ... Ich kann verstehen, warum sie es hinzugefügt haben. Und warum haben sie es dann entfernt? Eine Abschreibung kann für die "ordentlichen" Funktionen erforderlich sein, die erst dann aufzeigen, wie problematisch sie sind, nachdem sie für die Öffentlichkeit freigegeben wurden.
Phil
25

Jede ausreichend komplizierte API weist wahrscheinlich Fehler auf, die erst entdeckt werden, nachdem sie für eine Weile verwendet wurden. Unsere Möglichkeiten:

  • Lass die Dinge so wie sie sind. Dies bedeutet, dass die API im Laufe der Zeit immer mehr Menschen anzieht. Auch wenn neue und verbesserte Versionen hinzugefügt werden, müssen die alten ebenfalls gewartet werden.
  • Entfernen Sie es ohne Vorwarnung. Dies wird wahrscheinlich eine Menge Code brechen.
  • Veralten Sie es und entfernen Sie es in einer späteren Version. Dies gibt Zeit, um vorhandenen Code zu reparieren und gleichzeitig sicherzustellen, dass die Cruft-Menge begrenzt bleibt.

Abschreibung ist die vernünftigste dieser Alternativen.

Hammar
quelle
12

Nein. Abwertung kann eine wirklich gute Sache sein. Es verhindert, dass Technologien mit altem, unbrauchbarem Gepäck in Kontakt kommen.

Gerade in der C ++ - Arena erinnere ich mich an das "Feature" von Microsoft, die Variablendeklaration in einer for-Anweisung nicht korrekt zu unterstützen. Das dauerte ungefähr ein Jahrzehnt und machte eine Menge Code nicht portierbar. Das ist ein "Feature", ich bin froh, dass es veraltet war.

Im Allgemeinen hat Apple seit den 80er Jahren die Angewohnheit, klobige alte APIs 5-7 Jahre lang als "veraltet" zu markieren, bevor sie herausgezogen werden. Ich habe gerade mit einem Apple-Ingenieur bei WWDC darüber gesprochen, einige der alten QuickTime C-APIs zu verwerfen, und es hat mich sehr gefreut, dass sie dies tun, da die fortgesetzte Unterstützung für ein um 1990 entwickeltes Modell die erwarteten Möglichkeiten völlig einschränkte auf modernen 64-Bit-Multicore-CPUs zu tun.

In der Praxis wird es lange dauern, bis Compiler-Writer auto_ptr sichern, und sie werden wahrscheinlich für ein oder zwei Jahrzehnte einen Abwärtskompatibilitätsmodus unterstützen, aber es ist eine gute Sache, imo.

Bob Murphy
quelle
11

Wenn wir die Dinge wirklich ablehnen wollen, nenne ich printf ().

printfist eine nützliche Funktion. Es ermöglicht das Formatieren von Dingen, die kürzer sind als iostreams. Und es ist eine C-Funktion. Der eigentliche Grund, warum C ++ existiert und verwendet wird, ist, dass es mit C kompatibel ist printf.

Also, noch jemand, der sich für einen Kreuzzug gegen die Missbilligung einsetzt?

Das Komitee ist sich einiger Probleme der gegenwärtig angenommenen Bedeutung von Abwertung bewusst. Siehe die Bedeutung von Verfall .

Johannes Schaub - litb
quelle
5

Sprachen und APIs müssen vorankommen. Auch wenn es je nach altem Feature eine Menge Code gibt, gibt es möglicherweise eine neue und bessere Möglichkeit, etwas zu tun, und die Kosten für die Unterstützung des alten Features sind einfach zu hoch.

Die Nichtbeachtung warnt auch davor, dass das Feature in Zukunft entfernt wird. Dies gibt Entwicklern Zeit, ihren Code zu aktualisieren, wenn sie mit der neuen API Schritt halten. Das ist viel besser als die Alternative: die vollständige Entfernung. Denken Sie daran, dass die Abschreibung eine Warnung und kein Fehler ist.

Und wenn dies ein altes Programm ist, das Sie nicht aktualisieren möchten, hindert nichts Sie daran, die alte API (oder in diesem Fall den Compiler) zu verwenden.

TheLQ
quelle
1

In der jetzigen Form hat die Abwertung mindestens zwei Bedeutungen.

  • Es wird in einer zukünftigen Version entfernt
  • Wir haben bessere Alternativen geschaffen und jetzt ist die Funktion überflüssig (aber nicht völlig nutzlos). Neuankömmlinge sollten dies überspringen, während sie die Sprache lernen. Es wird jedoch in Kürze nicht mehr entfernt.

Ich denke, statisch fällt in die letztere Kategorie, aber nur die Zeit wird zeigen, ob auto_ptr es wirklich verdient, entfernt zu werden, oder ob es besser ist, es in der Sprache zu belassen.

marcus
quelle
0

Eine Abschreibung ist nicht schädlich, wenn der Wechsel zu einer Alternative innerhalb eines Arbeitstages erfolgen kann: z. Einfaches Suchen / Ersetzen der alten Funktion durch die neue oder ein Kompatibilitätslayer ist einfach einzurichten.

Wenn Sie große Teile der Software aufgrund der veralteten Software neu schreiben müssen, ist dies schädlich.

Ein gutes Beispiel wäre wahrscheinlich die mysql-API von PHP. Im Grunde müssen Sie lediglich alle mysql_ * durch mysqli_ * ersetzen und eine Link-ID angeben, und fertig.

Ein schlechtes Beispiel ist das Veralten und Entfernen von glBegin, glEnd und allen Matrixberechnungs-Inhalten aus OpenGL. Wenn Ihr Code mit OpenGL3 oder höher arbeiten soll, müssen Sie den gesamten Rendering-Code neu schreiben, um Vertex-Puffer zu verwenden.

Calmarius
quelle
-1

Ich denke, es ist eine gute Möglichkeit, die Leute wissen zu lassen, dass es einen besseren Weg gibt. Ich bevorzuge lieber eine nette Abwertung als eine Funktion, die einfach verschwindet.

Jeff
quelle