Esistono diversi motivi per cui non mi piace l'auto per uso generale:
- Puoi refactificare il codice senza modificarlo. Sì, questa è una delle cose spesso elencate come un vantaggio dell'uso di auto. Basta cambiare il tipo di ritorno di una funzione e se tutto il codice che la chiama utilizza auto, non è richiesto alcuno sforzo aggiuntivo! Fai clic su compila, crea - 0 avvisi, 0 errori - e vai avanti e controlla il tuo codice senza dover affrontare il disordine di guardare attraverso e modificare potenzialmente gli 80 luoghi in cui viene utilizzata la funzione.
Ma aspetta, è davvero una buona idea? E se il tipo avesse importanza in una mezza dozzina di quei casi d'uso, e ora quel codice si comporta effettivamente diversamente? Anche questo può implicitamente interrompere 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 sostenitore del concetto di "codice auto-documentante". Il ragionamento alla base del codice auto-documentante è 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 sul suo intento e non ti lascerà confuso con i commenti non aggiornati. Se i tipi possono essere cambiati senza la necessità di modificare il codice stesso, allora il codice / le variabili stesse possono diventare obsoleti. Per esempio:
auto bThreadOK = CheckThreadHealth ();
Tranne il problema è che CheckThreadHealth () ad un certo punto è stato refactored per restituire un valore enum che indica lo stato dell'errore, se presente, invece di un bool. Ma la persona che ha apportato tale modifica ha perso l'ispezione di questa particolare riga di codice e il compilatore non è stato di alcun aiuto poiché è stato compilato senza avvisi o errori.
- Potresti non sapere mai quali sono i tipi reali. Questo è anche spesso elencato come un "vantaggio" primario di auto. Perché imparare quale funzione ti sta dando, quando puoi semplicemente dire "A chi importa? Si compila!"
Funziona anche in qualche modo, probabilmente. Dico un po 'di lavori, perché anche se stai facendo una copia di una struttura di 500 byte per ogni iterazione di loop, in modo da poter ispezionare un singolo valore su di esso, il codice è ancora completamente funzionale. Quindi anche i test unitari non ti aiutano a capire che un codice errato si nasconde dietro quell'auto semplice e dall'aspetto innocente. La maggior parte delle altre persone che eseguono la scansione del file non lo noteranno a prima vista.
Ciò può anche peggiorare se non si conosce il tipo, ma si sceglie un nome di variabile che fa un'ipotesi errata su ciò che è, ottenendo in effetti lo stesso risultato di 1a, ma dall'inizio piuttosto che post-refactoring.
- Digitare il codice durante la scrittura iniziale non è la parte più lunga della programmazione. Sì, inizialmente la scrittura automatica rende più veloce il codice. Come disclaimer, digito> 100 WPM, quindi forse non mi disturba tanto quanto gli altri. Ma se tutto ciò che dovevo fare era scrivere un nuovo codice tutto il giorno, sarei un campeggiatore felice. La parte della programmazione che richiede più tempo è la diagnosi di bug nel codice difficili da riprodurre, che spesso derivano da problemi non ovvi e sottili, come è probabile che venga introdotto il tipo di uso eccessivo di auto (riferimento vs. copia, firmato vs. non firmato, float vs. int, bool vs. pointer, ecc.).
Mi sembra ovvio che auto sia stata introdotta principalmente come soluzione per terribile sintassi con tipi di template di libreria standard. Invece di provare a correggere la sintassi del modello con cui le persone hanno già familiarità - che potrebbe anche essere quasi impossibile da fare a causa di tutto il codice esistente che potrebbe rompere - aggiungere una parola chiave che sostanzialmente nasconde il problema. In sostanza quello che potresti chiamare un "hack".
In realtà non ho alcun disaccordo con l'uso dell'auto con i contenitori standard delle librerie. È ovviamente ciò per cui è stata creata la parola chiave e le funzioni nella libreria standard non cambieranno sostanzialmente lo scopo (o il tipo per quella materia), rendendo l'auto relativamente sicura da usare. Ma sarei molto cauto nell'usarlo con il tuo codice e 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 provvisori in macro di tipo agnostico. Questo è qualcosa che non potevi davvero fare prima, ma puoi farlo ora.
auto
spesso rende le cose più difficili da leggere quando sono già difficili da leggere, cioè funzioni troppo lunghe, variabili con un nome mediocre, ecc. Nelle funzioni brevi con variabili con un nome decente, sapere che i tipi dovrebbero essere uno dei n. 1 facili o n. 2 irrilevanti.