Ada beberapa alasan mengapa saya tidak suka otomatis untuk penggunaan umum:
- Anda dapat memperbaiki kode tanpa mengubahnya. Ya, ini adalah salah satu hal yang sering didaftar sebagai manfaat menggunakan otomatis. Ubah saja tipe fungsi yang dikembalikan, dan jika semua kode yang memanggilnya menggunakan otomatis, tidak diperlukan upaya tambahan! Anda menekan kompilasi, itu membangun - 0 peringatan, 0 kesalahan - dan Anda hanya melanjutkan dan memeriksa kode Anda tanpa harus berurusan dengan kekacauan melihat-lihat dan berpotensi memodifikasi 80 tempat fungsi digunakan.
Tapi tunggu, apakah itu ide yang bagus? Bagaimana jika jenisnya penting dalam setengah lusin kasus penggunaan tersebut, dan sekarang kode itu benar-benar berperilaku berbeda? Ini juga secara implisit dapat memecahkan enkapsulasi, dengan memodifikasi tidak hanya nilai input, tetapi perilaku itu sendiri dari implementasi privat dari kelas lain yang memanggil fungsi.
1a. Saya seorang yang percaya pada konsep "kode dokumentasi diri". Alasan di balik kode dokumentasi diri adalah bahwa komentar cenderung menjadi ketinggalan zaman, tidak lagi mencerminkan apa yang dilakukan kode, sedangkan kode itu sendiri - jika ditulis secara eksplisit - jelas, selalu tetap up to date. pada niatnya, dan tidak akan membuat Anda bingung dengan komentar basi. Jika tipe dapat diubah tanpa perlu memodifikasi kode itu sendiri, maka kode / variabel itu sendiri dapat menjadi basi. Sebagai contoh:
auto bThreadOK = CheckThreadHealth ();
Kecuali masalahnya adalah bahwa CheckThreadHealth () di beberapa titik telah di refactored untuk mengembalikan nilai enum yang menunjukkan status kesalahan, jika ada, bukan bool. Tetapi orang yang melakukan perubahan itu gagal memeriksa baris kode khusus ini, dan kompiler tidak membantu karena dikompilasi tanpa peringatan atau kesalahan.
- Anda mungkin tidak pernah tahu apa tipe sebenarnya. Ini juga sering terdaftar sebagai "manfaat" utama otomatis. Mengapa belajar apa fungsi memberi Anda, ketika Anda bisa mengatakan, "Siapa yang peduli? Itu mengkompilasi!"
Bahkan jenis pekerjaan, mungkin. Saya mengatakan jenis pekerjaan, karena meskipun Anda membuat salinan struct 500 byte untuk setiap iterasi loop, sehingga Anda dapat memeriksa nilai tunggal di dalamnya, kode masih berfungsi sepenuhnya. Jadi, bahkan pengujian unit Anda tidak membantu Anda menyadari bahwa kode buruk bersembunyi di balik otomatis yang sederhana dan tampak tidak bersalah itu. Kebanyakan orang lain memindai file tidak akan melihatnya pada pandangan pertama juga.
Ini juga dapat menjadi lebih buruk jika Anda tidak tahu apa jenisnya, tetapi Anda memilih nama variabel yang membuat asumsi yang salah tentang apa itu, pada dasarnya mencapai hasil yang sama seperti pada 1a, tetapi sejak awal bukan pasca-refactor.
- Mengetik kode ketika awalnya menulis itu bukan bagian yang paling memakan waktu dari pemrograman. Ya, otomatis membuat penulisan beberapa kode lebih cepat pada awalnya. Sebagai penafian, saya mengetik> 100 WPM, jadi mungkin itu tidak mengganggu saya sebanyak yang lain. Tetapi jika yang harus saya lakukan adalah menulis kode baru sepanjang hari, saya akan menjadi kemping yang bahagia. Bagian pemrograman yang paling banyak menghabiskan waktu adalah mendiagnosis bug tepi-kode yang sulit direproduksi, sering kali merupakan hasil dari masalah tidak jelas yang tidak jelas - seperti penggunaan mobil yang terlalu sering digunakan (referensi vs. salinan, ditandatangani vs. unsigned, float vs. int, bool vs. pointer, dll.).
Tampak jelas bagi saya bahwa otomatis diperkenalkan terutama sebagai solusi untuk sintaks yang mengerikan dengan tipe templat perpustakaan standar. Alih-alih mencoba memperbaiki sintaks templat yang sudah dikenal banyak orang - yang mungkin juga hampir mustahil dilakukan karena semua kode yang ada dapat rusak - tambahkan kata kunci yang pada dasarnya menyembunyikan masalah. Pada dasarnya apa yang Anda sebut "hack".
Saya sebenarnya tidak memiliki ketidaksetujuan dengan penggunaan otomatis dengan kontainer perpustakaan standar. Ini jelas untuk apa kata kunci itu dibuat, dan fungsi-fungsi di perpustakaan standar tidak mungkin secara mendasar mengubah tujuan (atau tipe dalam hal ini), membuat otomatis relatif aman untuk digunakan. Tetapi saya akan sangat berhati-hati dalam menggunakannya dengan kode dan antarmuka Anda sendiri yang mungkin jauh lebih tidak stabil, dan berpotensi mengalami perubahan yang lebih mendasar.
Aplikasi lain yang berguna dari auto yang meningkatkan kemampuan bahasa adalah membuat temporaries dalam macro type-agnostic. Ini adalah sesuatu yang tidak bisa Anda lakukan sebelumnya, tetapi Anda bisa melakukannya sekarang.
auto
sering dapat membuat hal-hal lebih sulit untuk dibaca ketika mereka sudah sulit dibaca, yaitu, fungsi terlalu lama, variabel nama buruk, dll. Pada fungsi pendek dengan variabel nama yang layak, mengetahui jenis harus salah satu dari # 1 mudah atau # 2 tidak relevan.