Ci sono diversi motivi per cui non mi piace l'auto per uso generale:
- Puoi rifattorizzare il codice senza modificarlo. Sì, questa è una delle cose spesso elencate come un vantaggio dell'uso dell'auto. Basta cambiare il tipo di ritorno di una funzione, e se tutto il codice che la chiama usa auto, non è richiesto alcuno sforzo aggiuntivo! Ottieni la compilazione, genera - 0 avvisi, 0 errori - e vai avanti e controlla il tuo codice senza dover affrontare il caos di guardare attraverso e potenzialmente modificare gli 80 luoghi in cui viene utilizzata la funzione.
Ma aspetta, è davvero una buona idea? Cosa accadrebbe se il tipo fosse importante in una mezza dozzina di quei casi d'uso, e ora che il codice si comporta effettivamente in modo diverso? Questo può anche interrompere implicitamente l'incapsulamento, modificando non solo i valori di input, ma il comportamento stesso dell'implementazione privata di altre classi che chiamano la funzione.
1 bis. Sono un credente nel concetto di "codice di auto-documentazione". Il ragionamento dietro il codice di auto-documentazione è che i commenti tendono a diventare obsoleti, non riflettendo più ciò che il codice sta facendo, mentre il codice stesso - se scritto in modo esplicito - è autoesplicativo, rimane sempre aggiornato nel suo intento, e non ti lascerà confuso con commenti stantii. Se i tipi possono essere modificati senza la necessità di modificare il codice stesso, allora il codice / variabili stesse può diventare obsoleto. Ad esempio:
auto bThreadOK = CheckThreadHealth ();
Tranne che il problema è che CheckThreadHealth () a un certo punto è stato refactored per restituire un valore enum che indica lo stato di errore, se presente, invece di un bool. Ma la persona che ha apportato tale modifica ha mancato l'ispezione di questa particolare riga di codice e il compilatore non ha aiutato perché è stato compilato senza avvisi o errori.
- Potresti non sapere mai quali sono i tipi effettivi. Questo è anche spesso elencato come un "vantaggio" primario di auto. Perché imparare ciò che una funzione ti sta dando, quando puoi semplicemente dire: "A chi importa?
È anche un po 'come funziona, probabilmente. Dico un po 'di lavoro, perché anche se stai facendo una copia di una struttura di 500 byte per ogni iterazione del ciclo, così puoi controllare un singolo valore su di esso, il codice è ancora completamente funzionale. Quindi anche i tuoi test unitari non ti aiutano a capire che il cattivo codice si nasconde dietro quella auto semplice e dall'aria innocente. La maggior parte delle altre persone che scansionano il file non la noteranno nemmeno a prima vista.
Questo può anche peggiorare se non si conosce quale sia il tipo, ma si sceglie un nome di variabile che fa un'ipotesi errata su quello che è, in effetti ottenendo lo stesso risultato di 1a, ma proprio dal inizio piuttosto che post refactor.
- La digitazione del codice quando si scrive inizialmente non è la parte che richiede più tempo della programmazione. Sì, l'auto rende inizialmente la scrittura di un codice più veloce. Come disclaimer, digito > 100 WPM, quindi forse non mi infastidisce tanto quanto gli altri. Ma se tutto quello che dovevo fare era scrivere un nuovo codice tutto il giorno, sarei un campeggiatore felice. La parte più lunga che richiede tempo di programmazione è la diagnosi di errori nel codice, difficili da riprodurre, spesso derivati da sottili problemi non ovvi, come il probabile uso eccessivo di auto (riferimento e copia, firmato vs unsigned, float vs. int, bool vs. pointer, ecc.).
Mi sembra ovvio che l'auto sia stata introdotta principalmente come soluzione alternativa per una sintassi terribile con i tipi di modelli di libreria standard. Piuttosto che cercare di correggere la sintassi del modello con cui le persone hanno già familiarità - il che potrebbe anche essere quasi impossibile da fare a causa dell'intero codice esistente che potrebbe interrompersi - aggiungere una parola chiave che fondamentalmente nasconde il problema. Essenzialmente quello che potreste definire un "hack".
In realtà non ho alcun disaccordo con l'uso dell'auto con i contenitori di libreria standard. È ovvio per che cosa è stata creata la parola chiave, e le funzioni nella libreria standard non sono suscettibili di cambiare radicalmente lo scopo (o il tipo per quella materia), rendendo l'uso relativamente sicuro. Ma sarei molto cauto nell'usarlo con il tuo codice e le tue interfacce che potrebbero essere molto più volatili e potenzialmente soggetti a cambiamenti più fondamentali.
Un'altra utile applicazione di auto che migliora la capacità del linguaggio è la creazione di provini nei macro agnostici del tipo. Questo è qualcosa che non potevi fare prima, ma puoi farlo ora.