Istnieje kilka powodów, dla których nie lubię auto do ogólnego użytku:
- Możesz refaktoryzować kod bez jego modyfikacji. Tak, jest to jedna z często wymienianych zalet korzystania z auto. Wystarczy zmienić typ zwracanej funkcji, a jeśli cały kod, który ją wywołuje, używa auto, nie jest wymagany żaden dodatkowy wysiłek! Uderzasz w kompilację, buduje - 0 ostrzeżeń, 0 błędów - i po prostu sprawdzasz kod bez konieczności zajmowania się bałaganem przeglądania i potencjalnej modyfikacji 80 miejsc, w których funkcja jest używana.
Ale czekaj, czy to naprawdę dobry pomysł? Co jeśli typ miał znaczenie w pół tuzinie przypadków użycia, a teraz ten kod zachowuje się inaczej? Może to również pośrednio przerwać enkapsulację, modyfikując nie tylko wartości wejściowe, ale także samo zachowanie prywatnej implementacji innych klas wywołujących funkcję.
1a. Jestem zwolennikiem koncepcji „samodokumentującego się kodu”. Kod samo-dokumentujący ma swoje uzasadnienie w tym, że komentarze stają się nieaktualne, nie odzwierciedlają już tego, co robi kod, podczas gdy sam kod - jeśli jest napisany w sposób jawny - jest zrozumiały, zawsze jest aktualny zgodnie z jego intencją i nie pozostawi cię mylonych ze starymi komentarzami. Jeśli typy można zmienić bez potrzeby modyfikowania samego kodu, wówczas sam kod / zmienne mogą stać się nieaktualne. Na przykład:
auto bThreadOK = CheckThreadHealth ();
Tyle tylko, że problem polega na tym, że CheckThreadHealth () w pewnym momencie został refaktoryzowany w celu zwrócenia wartości wyliczeniowej wskazującej ewentualny status błędu zamiast bool. Ale osoba, która wprowadziła tę zmianę, nie sprawdzała tego konkretnego wiersza kodu, a kompilator nie pomógł, ponieważ skompilował się bez ostrzeżeń i błędów.
- Możesz nigdy nie wiedzieć, jakie są rzeczywiste typy. Jest to często wymieniane jako podstawowa „korzyść” z auto. Po co uczyć się, co daje ci funkcja, kiedy możesz po prostu powiedzieć: „Kogo to obchodzi? To się kompiluje!”
Prawdopodobnie nawet działa. Mówię, że to działa, ponieważ chociaż tworzysz kopię struktury 500-bajtowej dla każdej iteracji pętli, więc możesz sprawdzić na niej jedną wartość, kod jest nadal w pełni funkcjonalny. Więc nawet testy jednostkowe nie pomagają zrozumieć, że za tym prostym i niewinnie wyglądającym auto kryje się zły kod. Większość innych osób skanujących plik również nie zauważy go na pierwszy rzut oka.
Można to również pogorszyć, jeśli nie wiesz, jaki jest typ, ale wybierasz nazwę zmiennej, która błędnie zakłada, co to jest, w efekcie osiągając taki sam wynik jak w 1a, ale od samego początku, a nie postfaktor.
- Wpisywanie kodu na początku nie jest najbardziej czasochłonnym etapem programowania. Tak, auto przyspiesza początkowo pisanie kodu. Jako zastrzeżenie, wpisuję> 100 WPM, więc może nie przeszkadza mi tak bardzo jak innym. Ale gdybym tylko musiał cały dzień pisać nowy kod, byłbym szczęśliwym obozowiczem. Najbardziej czasochłonną częścią programowania jest diagnozowanie trudnych do odtworzenia, niepoprawnych błędów w kodzie, które często wynikają z subtelnych, nieoczywistych problemów - takich jak nadużycie auto, które może się pojawić (odwołanie vs. kopiowanie, podpisane vs. niepodpisane, float vs. int, bool vs. wskaźnik itp.).
Wydaje mi się oczywiste, że auto zostało wprowadzone przede wszystkim jako obejście strasznej składni ze standardowymi typami szablonów bibliotek. Zamiast próbować naprawić składnię szablonu, którą ludzie już znają - co może być prawie niemożliwe do wykonania z powodu całego istniejącego kodu, który mógłby złamać - dodaj słowo kluczowe, które w zasadzie ukrywa problem. Zasadniczo to, co możesz nazwać „hack”.
Właściwie nie mam żadnych sporów z użyciem auto ze standardowymi kontenerami bibliotecznymi. Oczywiście dla tego słowa kluczowego zostało utworzone, a funkcje w standardowej bibliotece prawdopodobnie nie zmienią się zasadniczo w celu (lub typowaniu w tym zakresie), dzięki czemu korzystanie z auto jest względnie bezpieczne. Byłbym jednak bardzo ostrożny w używaniu go z własnym kodem i interfejsami, które mogą być znacznie bardziej zmienne i potencjalnie podlegać bardziej fundamentalnym zmianom.
Inną użyteczną aplikacją auto, która zwiększa możliwości języka, jest tworzenie tymczasowych makr typu agnostic. To było coś, czego tak naprawdę nie mogłeś zrobić wcześniej, ale możesz to zrobić teraz.
auto
często sprawia, że rzeczy są trudniejsze do odczytania, gdy są już trudne do odczytania, tj. funkcje zbyt długie, zmienne źle nazwane itp. W przypadku krótkich funkcji z odpowiednio nazwanymi zmiennymi znajomość typów powinna być jedną z 1 łatwych lub 2 nieistotnych.