La dépréciation est-elle considérée comme nuisible? [fermé]

27

Je viens de compiler une partie de mon propre code avec le -std=c++0xdrapeau dans GCC, car je veux suivre vaguement ce que font tous les jeunes (à condition qu'ils restent de ma pelouse), et je me suis retrouvé avec une charge d'avertissements d' auto_ptrêtre obsolète. Bien sûr, je savais que auto_ptrc'était obsolète en C ++ 0x, mais ...

La dépréciation n'est-elle pas une perte de temps et d'efforts? Raisons de ne pas déprécier (avec auto_ptr comme exemple):

  • il y a un océan de code qui doit encore être pris en charge, produire des millions d'avertissements ne fera que tenter les gens de désactiver les avertissements.

  • auto_ptr est un peu désagréable, mais il fait vraiment ce qu'il dit sur l'étain.

  • si nous voulons vraiment déprécier les choses, je propose printf(). Mais imaginez les cris qui en résulteraient. auto_ptrn'a pas trop d'amis, mais dans au moins mon code C ++, il est utilisé plus que printf, ce qui n'est pas du tout utilisé.

  • le comité a un mauvais dossier pour obtenir ce droit - ils ont déprécié l'électricité statique au niveau de l'espace de noms, et maintenant il semble que ce soit déprécié - je ne serais pas surpris s'il auto_ptrfaisait un retour similaire

  • enfin, quoi qu'en dise le comité, les implémenteurs du compilateur les ignorent - ils ne peuvent tout simplement pas risquer de casser le code de leurs clients, tout ce qu'ils peuvent faire, c'est émettre des avertissements irritants.

Donc, ma question - considérez-vous la dépréciation (de quoi que ce soit, pas seulement auto_ptrs, et pas seulement en C ++) une bonne idée, et si oui, pourquoi?

Neil Butterworth
la source
2
@TheLQ - je l'ai lu comme "pourquoi déprécier quoi que ce soit" mais en utilisant auto_ptrcomme exemple.
ChrisF
4
est-ce que ça dit sur la boîte "vous brisera le cœur si vous l'utilisez dans des contenants de presque n'importe quelle sorte"? Utilisez unique_ptret soyez plus heureux.
Kate Gregory
13
@Neil - votre langage est un peu incendiaire et (à la réflexion), il apparaît plus comme une diatribe qu'une question sérieuse. Si vous voulez qu'il reste ouvert, vous voudrez peut-être "atténuer".
ChrisF
4
@Neil - J'apprécie que vous l'ayez voulu aussi humoristique, mais comme je l'ai dit, à la réflexion, il est apparu plus "délirant" que je ne le pensais.
ChrisF
10
Si jamais vous prévoyez de vous débarrasser de la dépréciation, vous devriez vraiment la déprécier en premier. Beaucoup de langues / API existantes se briseraient autrement. Avec la dépréciation, vous pourriez leur donner un peu de temps pour se débarrasser de leurs dépréciations dépréciées.
Joachim Sauer

Réponses:

32

Motifs de dépréciation (en général):

  • Cela indique clairement aux gens que quelque chose est une mauvaise pratique (et, espérons-le, suggère une alternative).
  • La période de dépréciation donne aux utilisateurs la possibilité de modifier leur code avant que le compilateur ne le supprime complètement.

Je suis également en désaccord sur le dernier point. Les compilateurs n'ignorent pas le comité, et ils finissent par supprimer les éléments obsolètes (par exemple, >?=et <?=dans GCC - ils ont été obsolètes puis supprimés *).

Je pense que le point important est: certaines choses devraient être supprimées, pour diverses raisons, et je pense que la dépréciation est la seule façon sensée de le faire. Dans ce cas spécifique, auto_ptrdoit être supprimé car il a été remplacé par unique_ptr. Le changement est assez facile et les gens auront amplement le temps de le faire.

(*) Oui, je sais que ce sont des extensions et non standard, mais le fait est que les éditeurs de compilateurs finissent par supprimer les éléments une fois qu'ils sont obsolètes, que le code y repose toujours ou non.

Peter Alexander
la source
6
Désolé pour l'offtopic, mais je ne peux pas résister: quels étaient ceux-ci >?=et les <?=opérateurs?
brandizzi
7
Dans l'ancien GCC, vous pouviez écrire a >?= b;ce qui était un raccourci pour if (a > b) a = b;et de même pour <?=.
Peter Alexander
2
Ugh ... Je peux voir pourquoi ils l'ont ajouté. Et puis pourquoi ils l'ont enlevé. La dépréciation peut être nécessaire pour les fonctionnalités "soignées" qui ne révèlent à quel point elles sont problématiques après leur publication au public.
Phil
25

Toute API suffisamment compliquée aura probablement des défauts qui ne seront découverts qu'après avoir été utilisés pendant un certain temps. Nos options:

  • Laissez les choses telles qu'elles sont. Cela signifie que l'API continuera de s'accumuler de plus en plus au fur et à mesure qu'elle évoluera avec le temps. Même si de nouvelles versions améliorées sont ajoutées, les anciennes devront également être conservées.
  • Retirez-le sans avertissement. Cela risque de casser beaucoup de code.
  • Dépréciez-le et supprimez-le dans une version ultérieure. Cela donne le temps de corriger le code existant, tout en garantissant que la quantité de cruft reste limitée.

La dépréciation est la plus saine de ces alternatives.

hammar
la source
12

Non. La dépréciation peut être une très bonne chose. Il empêche les technologies de se retrouver avec de vieux bagages inutiles.

Juste dans l'arène C ++, je me souviens de la "fonctionnalité" de Microsoft de ne pas supporter correctement la déclaration de variable dans une instruction for. Cela a duré environ une décennie et a rendu beaucoup de code non portable. C'est une "fonctionnalité" dont je suis heureux qu'elle ait été dépréciée.

Plus généralement, Apple a pris l'habitude depuis les années 80 de marquer les anciennes API maladroites comme «obsolètes» pendant 5-7 ans avant de les arracher. Je parlais avec un ingénieur d'Apple à la WWDC de la dépréciation de certaines des anciennes API QuickTime C, et j'étais vraiment ravi d'entendre qu'ils le faisaient, car la prise en charge continue d'un modèle développé vers 1990 entravait complètement ce que l'on s'attendrait à pouvoir à faire sur les processeurs multicœurs 64 bits modernes.

En pratique, les rédacteurs du compilateur mettront longtemps à vider auto_ptr, et ils prendront probablement en charge un mode de compatibilité descendante pendant une décennie ou deux, mais c'est une bonne chose imo.

Bob Murphy
la source
11

si nous voulons vraiment déprécier les choses, je nomme printf ()

printfest une fonction utile. Il permet de formater les choses de manière plus courte que les iostreams. Et c'est une fonction C. La raison même pour laquelle C ++ existe et est utilisé est parce qu'il est compatible avec C. Ainsi, la dépréciation printfsemble moins utile.

Alors, quelqu'un d'autre pour une croisade anti-dépréciation?

Le comité est conscient de certains des problèmes liés à la prétendue signification actuelle de la dépréciation. Voir le sens de la dépréciation .

Johannes Schaub - litb
la source
5

Les langages et les API doivent avancer. Même s'il peut y avoir une tonne de code en fonction d'une ancienne fonctionnalité, il peut y avoir une nouvelle et meilleure façon de faire quelque chose et le coût de la prise en charge de l'ancienne fonctionnalité est tout simplement trop élevé.

La dépréciation avertit également qu'à l'avenir, la fonctionnalité sera supprimée. Cela donne aux développeurs le temps de mettre à jour leur code s'ils suivent la nouvelle API. C'est bien mieux que l'alternative: la suppression pure et simple. N'oubliez pas que l'amortissement est un avertissement et non une erreur.

Et s'il s'agit d'un ancien programme que vous ne voulez pas mettre à jour, alors rien ne vous empêche d'utiliser l'ancienne API (ou dans ce cas le compilateur).

TheLQ
la source
1

À l'heure actuelle, la dépréciation a au moins deux significations.

  • Il va être supprimé dans une future version
  • Nous avons créé de meilleures alternatives et maintenant la fonctionnalité est redondante (mais pas entièrement inutile). Les nouveaux arrivants feraient mieux de sauter ceci tout en apprenant la langue; cependant, il ne sera pas supprimé de si tôt.

Je pense que l'électricité statique tombe dans cette dernière catégorie, mais seul le temps nous dira si auto_ptr mérite vraiment d'être supprimé ou s'il vaut mieux le conserver dans la langue.

marcus
la source
0

La dépréciation n'est pas nocive si le passage à une alternative peut être effectué en une journée de travail: par exemple simple recherche / remplacement de l'ancienne fonction par la nouvelle, ou une couche de compatibilité est facile à mettre en place.

Si vous avez besoin de réécrire de grandes parties du logiciel à cause de la dépréciation, c'est dangereux.

Un bon exemple serait probablement l'API mysql de PHP, il vous suffit simplement de remplacer tous mysql_ * par mysqli_ * et de leur fournir un identifiant de lien et c'est fait.

Un mauvais exemple est la dépréciation et la suppression de glBegin, glEnd et de tout le matériel de calcul matriciel d'OpenGL, si vous voulez que votre code fonctionne sur OpenGL3 ou supérieur, vous devrez réécrire tout le code de rendu pour utiliser des tampons de vertex.

Calmarius
la source
-1

Je pense que c'est un bon moyen de faire savoir aux gens qu'il existe un meilleur moyen. Je préfère de loin une belle dépréciation plutôt qu'une fonction qui vient de disparaître.

Jeff
la source