Є кілька причин, чому мені не подобається автоматичне використання для загального користування:
- Ви можете рефакторний код, не змінюючи його. Так, це одна з речей, які часто перераховуються як переваги використання авто. Просто змініть тип повернення функції, і якщо весь код, який викликає її, використовує автоматичне, додаткові зусилля не потрібно! Ви натискаєте компіляцію, вона створює - 0 попереджень, 0 помилок - і ви просто продовжуєте перевіряти свій код, не маючи справу з безладом перегляду та потенційним зміненням 80 місць використання функції.
Але зачекайте, це справді гарна ідея? Що робити, якщо тип мав значення в півдюжини цих випадків використання, а тепер цей код насправді веде себе інакше? Це також може неявно порушити інкапсуляцію, змінивши не просто вхідні значення, а й саму поведінку приватної реалізації інших класів, які викликають функцію.
1а. Я вірую в поняття «код, що самодокументує». Обґрунтуванням коду самодокументування є те, що коментарі, як правило, застарівають, більше не відображаючи, що робить код, тоді як сам код - якщо він написаний явно - є зрозумілим, завжди залишається актуальним з його наміром, і не залишить вас плутати з несвіжими коментарями. Якщо типи можна змінити без необхідності змінювати сам код, тоді код / змінні можуть стати несвіжими. Наприклад:
auto bThreadOK = CheckThreadHealth ();
За винятком проблеми, що CheckThreadHealth () в якийсь момент був відновлений, щоб повернути значення перерахунку, що вказує на стан помилки, якщо такий є, замість bool. Але особа, яка внесла ці зміни, пропустила перевірку цього конкретного рядка коду, і компілятор не допоміг, оскільки він склав без попереджень і помилок.
- Ви ніколи не знаєте, що таке фактичні типи. Це також часто вказано як основну "перевагу" авто. Навіщо вчитися, яку функцію дає тобі, коли ти можеш просто сказати: "Кому все одно?
Це, мабуть, навіть працює. Я кажу, що це працює, тому що, хоча ви створюєте копію 500-байтної структури для кожної ітерації циклу, щоб ви могли перевірити на ній одне значення, код все ще є повністю функціональним. Тож навіть ваші тестові одиниці не допоможуть вам зрозуміти, що за цим простим і невинним виглядом авто ховається поганий код. Більшість інших людей, що сканують файл, також не помітять його з першого погляду.
Це також може бути гіршим, якщо ви не знаєте, що це за тип, але ви вибираєте ім'я змінної, яка робить неправильне припущення про те, що це таке, фактично досягаючи того ж результату, що і в 1а, але з самого початку, а не пострефактор.
- Введення коду при первинному написанні не є найбільш трудомісткою частиною програмування. Так, автоматично спочатку записується якийсь код. Як відмова, я набираю> 100 WPM, тому, можливо, це мене не так сильно, як інші. Але якби я весь день писав новий код, я був би щасливим відпочивачем. Найбільш трудомісткою частиною програмування є діагностування важко відтворюваних, кращих помилок у коді, які часто є наслідком тонких не очевидних проблем - таких, як вигляд надмірного використання авто (можливо, буде введено посилання на копію, підписано проти неподписаного, float vs. int, bool vs. pointer тощо).
Мені здається очевидним, що авто було введено головним чином як вирішення жахливого синтаксису зі стандартними типами шаблонів бібліотеки. Замість того, щоб спробувати виправити синтаксис шаблону, який люди вже знайомі - що також може бути майже неможливо зробити через увесь існуючий код, який він може зламати - додайте до ключового слова, яке в основному приховує проблему. По суті те, що ви можете назвати "хаком".
Я фактично не маю розбіжностей щодо використання автоматичного режиму зі стандартними бібліотечними контейнерами. Очевидно, для чого було створено ключове слово, і функції в стандартній бібліотеці, ймовірно, кардинально не змінять призначення (або тип для цього питання), роблячи автоматичне відносно безпечним у використанні. Але я дуже обережно ставлюся до цього з використанням власного коду та інтерфейсів, які можуть бути набагато більш мінливими та потенційно можуть зазнати більш фундаментальних змін.
Ще одне корисне застосування авто, що розширює можливості мови, - це створення часописів для макросів типу агностики. Це те, чого ви раніше не могли зробити, але ви можете це зробити зараз.
auto
часто може ускладнювати читання, коли вони вже важко читати, тобто функції занадто довгі, неправильно названі змінні тощо. Що стосується коротких функцій із гідно названими змінними, знаючи, що типи повинні бути одним з легких або №2 не мають значення.