La deprecazione è considerata dannosa? [chiuso]

27

Ho appena compilato parte del mio codice con il -std=c++0x flag in GCC, perché voglio tenere il passo con quello che stanno facendo tutti i giovani (purché rimangano nel mio prato), e ho finito con un carico di avvertimenti su auto_ptr deprecato. Naturalmente sapevo che auto_ptr era deprecato in C ++ 0x, ma ...

La deprecazione non è uno spreco di tempo e fatica? Motivi per non deprecare (con auto_ptr come esempio):

  • c'è un oceano di codice là fuori che deve ancora essere supportato, producendo milioni di avvertimenti che invogliano solo le persone a disattivare gli avvisi.

  • auto_ptr è un bit naff, ma in realtà fa quello che dice sullo stagno.

  • se vogliamo davvero deprecare le cose, nomino printf() . Ma immagina solo gli strilli che ne conseguirebbero. auto_ptr non ha troppi amici, ma almeno il mio codice C ++ è usato più di printf , che non viene usato affatto.

  • il comitato ha una brutta esperienza nel fare questo - hanno deprecato l'static nello scope namespace, e ora sembra essersi sottostimato - non sarei sorpreso se auto_ptr facesse un simile ritorno

  • infine, qualunque cosa il comitato dica, gli implementatori di compilatori li ignorano - semplicemente non possono rischiare di rompere il codice dei loro clienti, tutto ciò che possono fare è emettere avvisi irritanti.

Quindi la mia domanda - consideri la deprecazione (di qualsiasi cosa, non solo auto_ptrs, e non solo in C ++) una buona idea, e se sì, perché?

    
posta Neil Butterworth 11.06.2011 - 20:58
fonte

8 risposte

31

Motivi della deprecazione (in generale):

  • Indica chiaramente alle persone che qualcosa è una cattiva pratica (e si spera suggerisca un'alternativa).
  • Il periodo di deprecazione offre alle persone la possibilità di cambiare il codice prima che il compilatore lo rimuova completamente.

Inoltre non sono d'accordo sull'ultimo punto. I compilatori non ignorano il comitato e alla fine rimuovono cose deprecate (ad esempio >?= e <?= in GCC - sono state deprecate e poi rimosse *).

Penso che il punto importante sia: alcune cose dovrebbero essere rimosse, per vari motivi, e penso che la deprecazione sia l'unico modo per farlo. In questo caso specifico, auto_ptr deve essere rimosso poiché è stato sostituito da unique_ptr . Cambiare è abbastanza facile, e le persone avranno tutto il tempo per farlo.

(*) Sì, so che sono estensioni e non standard, ma il punto è che i produttori di compilatori alla fine rimuovono le cose una volta che entrano nella deprecazione, se il codice si basa ancora su di loro o meno.

    
risposta data 11.06.2011 - 21:22
fonte
23

Qualunque API sufficientemente complicata avrà probabilmente difetti che non vengono scoperti fino a dopo che sono stati utilizzati per un po 'di tempo. Le nostre opzioni:

  • Lascia le cose come sono. Ciò significa che l'API continuerà a raccogliere sempre più cruft mentre si evolve nel tempo. Anche se vengono aggiunte versioni nuove e migliorate, anche quelle vecchie devono essere mantenute.
  • Rimuovilo senza preavviso. È probabile che si rompa molto codice.
  • Deprecati e rimuovili in una versione successiva. Questo dà il tempo di correggere il codice esistente, assicurando al contempo che la quantità di cruft rimanga limitata.

La deprecazione è la più sicura di queste alternative.

    
risposta data 11.06.2011 - 23:22
fonte
11

Nah. La deprecazione può essere davvero una buona cosa. Impedisce alle tecnologie di rimanere bloccati con il vecchio bagaglio inutile.

Solo nell'arena C ++, ricordo la "caratteristica" di Microsoft di non supportare correttamente la dichiarazione delle variabili all'interno di una dichiarazione for. Ciò è andato avanti per circa un decennio e ha reso molto codice non portatile. Questa è una "caratteristica" che mi fa piacere che sia deprecato.

Più in generale, Apple ha avuto l'abitudine fin dagli anni '80 di contrassegnare le vecchie e grezze API come "deprecate" per 5-7 anni prima di strattonarle. Stavo solo parlando con un ingegnere Apple al WWDC sulla deprecazione di alcune delle antiche API QuickTime C, ed è stato davvero un piacere sapere che lo stavano facendo, perché il continuo supporto per un modello sviluppato intorno al 1990 stava ostruendo completamente ciò che ci si aspetterebbe di essere in grado fare su moderne CPU multicore a 64 bit.

In pratica, gli scrittori di compilatori impiegheranno molto tempo per scaricare auto_ptr e probabilmente supporteranno alcune modalità di retrocompatibilità per un decennio o due, ma è una buona cosa imo.

    
risposta data 11.06.2011 - 21:23
fonte
10

if we really want to deprecate things, I nominate printf()

printf è una funzione utile. Permette di formattare le cose in modo più breve degli iostreams. Ed è una funzione C. La ragione per cui C ++ esiste e viene usata è perché è compatibile con C. Quindi deprecating printf sembra meno utile.

So, anyone else up for an anti-deprecation crusade?

Il comitato è a conoscenza di alcuni dei problemi dell'attuale presunto significato di deprecazione. Vedi il significato della deprecazione .

    
risposta data 11.06.2011 - 23:13
fonte
4

Lingue e API devono andare avanti. Anche se ci potrebbe essere una tonnellata di codice a seconda di alcune vecchie funzionalità, potrebbe esserci un modo nuovo e migliore per fare qualcosa e il costo di supportare la vecchia funzionalità è davvero troppo.

La deprecazione indica anche che in futuro la funzionalità verrà rimossa. Questo dà agli sviluppatori il tempo di aggiornare il loro codice se stanno tenendo il passo con la nuova API. Questo è molto meglio dell'alternativa: rimozione definitiva. Ricorda che l'ammortamento è un avvertimento, non un errore.

E se questo è un vecchio programma che non vuoi aggiornare, niente ti impedisce di usare la vecchia API (o in questo caso il compilatore).

    
risposta data 11.06.2011 - 21:25
fonte
1

Allo stato attuale, la deprecazione ha almeno due significati.

  • Sarà rimosso in una versione futura
  • Abbiamo creato alternative migliori e ora la funzione è ridondante (ma non del tutto inutile). I nuovi arrivati farebbero meglio a saltare questo mentre imparano la lingua; tuttavia, non verrà rimosso in qualsiasi momento presto.

Penso che la static cada nella seconda categoria, ma solo il tempo dirà se auto_ptr merita davvero di essere rimosso o se è meglio tenerlo nella lingua.

    
risposta data 22.12.2011 - 15:52
fonte
0

La deprecazione non è dannosa se lo spostamento verso un'alternativa può essere fatto in 1 giorno lavorativo: es. semplice ricerca / sostituzione della vecchia funzione con la nuova, o un livello di compatibilità è facile da configurare.

Se hai bisogno di riscrivere grandi parti del software a causa della deprecazione, allora è dannoso.

Un buon esempio potrebbe essere probabilmente l'API mysql di PHP, in pratica è sufficiente sostituire tutto mysql_ * con mysqli_ * e fornire un id di collegamento per loro ed è fatto.

Un cattivo esempio è la deprecazione e la rimozione di glBegin, glEnd e tutto il materiale di calcolo a matrice da OpenGL, se vuoi che il tuo codice funzioni su OpenGL3 o superiore, dovrai riscrivere l'intero codice di rendering per utilizzare i buffer dei vertici.

    
risposta data 03.12.2013 - 14:15
fonte
-1

Penso che sia un buon modo per far sapere alla gente che esiste un modo migliore. Preferisco di gran lunga una bella deprecazione piuttosto che una funzione che sta scomparendo.

    
risposta data 16.06.2011 - 01:05
fonte

Leggi altre domande sui tag