Saya melihat sebuah konferensi oleh Herb Sutter di mana ia mendorong setiap programmer C ++ untuk menggunakannya auto
.
Saya harus membaca kode C # beberapa waktu yang lalu di mana var
digunakan secara luas dan kode itu sangat sulit dipahami — setiap kali var
digunakan saya harus memeriksa kembali tipe sisi kanan. Terkadang lebih dari sekali, karena saya lupa jenis variabel setelah beberapa saat!
Saya tahu kompiler tahu jenisnya dan saya tidak harus menulisnya, tetapi secara luas diterima bahwa kita harus menulis kode untuk programmer, bukan untuk kompiler.
Saya juga tahu itu lebih mudah untuk ditulis:
auto x = GetX();
Dari:
someWeirdTemplate<someOtherVeryLongNameType, ...>::someOtherLongType x = GetX();
Tapi ini ditulis hanya sekali dan GetX()
tipe kembalinya diperiksa berkali-kali untuk memahami tipe apa yang x
dimiliki.
Ini membuat saya bertanya-tanya - apakah auto
membuat kode C ++ lebih sulit untuk dipahami?
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.auto
sangat mirip menentukan kapan harus digunakantypedef
. Terserah Anda untuk menentukan kapan itu menghalangi dan kapan itu membantu.auto x = GetX();
, pilih nama yang lebih baik daripadax
yang benar-benar memberi tahu Anda apa yang dilakukannya dalam konteks tertentu ... itu sering lebih berguna daripada tipenya.Jawaban:
Jawaban singkat: Secara lebih lengkap, pendapat saya saat ini
auto
adalah bahwa Anda harus menggunakanauto
secara default kecuali Anda secara eksplisit menginginkan konversi. (Sedikit lebih tepatnya, "... kecuali jika Anda ingin secara eksplisit berkomitmen pada suatu jenis, yang hampir selalu karena Anda menginginkan konversi.")Jawaban dan alasan yang lebih panjang:
Tulis jenis yang eksplisit (bukan
auto
) hanya ketika Anda benar-benar ingin berkomitmen secara eksplisit untuk suatu jenis, yang hampir selalu berarti Anda ingin secara eksplisit mendapatkan konversi ke jenis itu. Dari atas kepala saya, saya ingat dua kasus utama:initializer_list
Kejutan yangauto x = { 1 };
menyimpulkaninitializer_list
. Jika Anda tidak mauinitializer_list
, ucapkan tipe - mis., Secara eksplisit minta konversi.auto x = matrix1 * matrix 2 + matrix3;
menangkap jenis pembantu atau proxy yang tidak dimaksudkan untuk terlihat oleh programmer. Dalam banyak kasus, baik-baik saja dan jinak untuk menangkap jenis itu, tetapi kadang-kadang jika Anda benar-benar ingin itu runtuh dan melakukan perhitungan kemudian katakan jenisnya - yaitu, sekali lagi secara eksplisit meminta konversi.auto
Sebaliknya, gunakan standar secara rutin , karenaauto
menghindari jebakan dan membuat kode Anda lebih benar, lebih mudah dirawat, kuat, dan lebih efisien. Secara kasar, dari yang paling penting hingga yang paling tidak penting, dalam semangat "menulis untuk kejelasan dan kebenaran terlebih dahulu":auto
jaminan Anda akan mendapatkan jenis yang tepat. Seperti kata pepatah, jika Anda mengulangi diri sendiri (ucapkan tipenya secara berlebihan), Anda bisa dan akan berbohong (salah). Berikut ini adalah contoh yang biasa:void f( const vector<int>& v ) { for( /*…*
- pada titik ini, jika Anda menulis jenis iterator secara eksplisit, Anda ingin mengingat untuk menulisconst_iterator
(bukan?), Sedangkan yangauto
benar saja.auto
membuat kode Anda lebih kuat dalam menghadapi perubahan, karena ketika jenis ekspresi berubah,auto
akan terus menyelesaikan ke jenis yang benar. Jika Anda lebih memilih komit ke tipe eksplisit, mengubah tipe ekspresi akan menyuntikkan konversi diam ketika tipe baru dikonversi ke tipe lama, atau build tidak perlu pecah ketika tipe baru masih berfungsi - seperti tipe lama tetapi tidak dikonversi ke yang lama ketik (misalnya, ketika Anda mengubahmap
keunordered_map
, yang selalu baik-baik saja jika Anda tidak bergantung pada pesanan, menggunakanauto
untuk iterator Anda Anda akan beralih darimap<>::iterator
keunordered_map<>::iterator
, tetapi menggunakanmap<>::iterator
di mana-mana secara eksplisit berarti Anda akan membuang-buang waktu berharga Anda pada riak memperbaiki kode mekanik, kecuali jika magang berjalan dan Anda dapat mengesampingkan pekerjaan yang membosankan pada mereka).auto
tidak ada jaminan konversi implisit akan terjadi, itu menjamin kinerja yang lebih baik secara default. Jika sebaliknya Anda mengatakan jenisnya, dan itu membutuhkan konversi, Anda akan sering mendapatkan konversi diam-diam apakah Anda mengharapkannya atau tidak.auto
adalah satu-satunya pilihan Anda yang baik untuk jenis yang sulit untuk mengeja dan tidak dapat dihancurkan, seperti lambda dan bantuan templat, singkat menggunakandecltype
ekspresi berulang atau tipuan kurang efisien sepertistd::function
.auto
kurang mengetik. Saya menyebutkan bahwa terakhir untuk kelengkapan karena itu adalah alasan umum untuk menyukainya, tetapi itu bukan alasan terbesar untuk menggunakannya.Oleh karena itu: Lebih suka mengatakannya
auto
secara default. Ini menawarkan begitu banyak kesederhanaan dan kinerja serta kejernihan yang baik sehingga Anda hanya menyakiti diri sendiri (dan pengelola kode Anda di masa mendatang) jika tidak. Hanya berkomitmen untuk jenis eksplisit ketika Anda benar-benar bersungguh-sungguh, yang hampir selalu berarti Anda menginginkan konversi eksplisit.Ya, ada (sekarang) mengerti tentang hal ini.
sumber
auto x = static_cast<X>(y)
. Thestatic_cast
memperjelas bahwa konversi itu sengaja dan menghindari peringatan kompilator tentang konversi. Biasanya menghindari peringatan kompiler tidak begitu baik, tapi saya baik-baik saja dengan tidak mendapatkan peringatan tentang konversi yang saya pertimbangkan dengan hati-hati ketika saya menulisstatic_cast
. Meskipun saya tidak akan melakukan ini jika tidak ada peringatan sekarang tapi saya ingin mendapatkan peringatan di masa depan jika jenisnya berubah dengan cara yang berpotensi berbahaya.auto
adalah bahwa kita harus berusaha untuk memprogram terhadap antarmuka (bukan dalam arti OOP), bukan terhadap implementasi spesifik. Sama dengan template, sungguh. Apakah Anda mengeluh tentang "kode sulit dibaca" karena Anda memiliki parameter tipe templateT
yang digunakan di mana-mana? Tidak, kurasa tidak. Dalam templat juga kami kode terhadap antarmuka, kompilasi waktu bebek-mengetik adalah apa yang banyak orang menyebutnya.auto
.auto
variabel, tetapi hampir semua dari mereka melakukannya dengan benar dengan spesifikasi tipe eksplisit. Tidak ada yang menggunakan IDE? Semua orang hanya menggunakan variabel int / float / bool? Semua orang lebih suka dokumentasi eksternal untuk perpustakaan daripada header yang didokumentasikan sendiri?=
RHS tidak masuk akal dengan interpretasi lain (bar brit init-list, tetapi Anda perlu tahu apa yang Anda inisialisasi, yang merupakan sebuah oxymoron denganauto
). Salah satu yang adalah mengejutkan adalahauto i{1}
juga menyimpulkaninitializer_list
, meskipun menyiratkan tidak mengambil ini bersiap init-daftar melainkan mengambil ungkapan ini dan menggunakan jenisnya ... tapi kitainitializer_list
di sana juga. Untungnya, C ++ 17 memperbaiki semua ini dengan baik.Ini adalah situasi per kasus.
Terkadang membuat kode lebih sulit untuk dipahami, terkadang tidak. Ambil, misalnya:
jelas mudah dimengerti dan jelas lebih mudah untuk ditulis daripada deklarasi iterator yang sebenarnya.
Saya telah menggunakan C ++ untuk sementara waktu sekarang, tetapi saya dapat menjamin bahwa saya akan mendapatkan kesalahan kompiler pada kesempatan pertama saya karena saya akan melupakan
const_iterator
dan awalnya akan pergi untukiterator
... :)Saya akan menggunakannya untuk kasus-kasus seperti ini, tetapi tidak di mana itu benar-benar mengaburkan jenis (seperti situasi Anda), tetapi ini murni subjektif.
sumber
std::map<int, std::string>::const_iterator
, jadi itu bukan seolah-olah namanya memberi tahu Anda banyak tentang jenis itu.int
, dan nilainyastd::string
. :)it->second
karena itu adalah konstelasi. Semua informasi yang merupakan pengulangan dari apa yang ada di baris sebelumnyaconst std::map<int, std::string>& x
,. Mengatakan sesuatu berkali-kali kadang-kadang memberi informasi yang lebih baik, tetapi tidak berarti bahwa aturan umum :-)for (anX : x)
untuk membuatnya lebih jelas kita hanya mengulanginyax
. Kasus normal di mana Anda perlu sebuah iterator adalah ketika Anda memodifikasi kontainer, tetapix
adalahconst&
Lihatlah dengan cara lain. Apakah Anda menulis:
atau:
Terkadang tidak membantu untuk mengeja jenis ini secara eksplisit.
Keputusan apakah Anda perlu menyebutkan jenis tidak sama dengan keputusan apakah Anda ingin membagi kode di beberapa pernyataan dengan mendefinisikan variabel perantara. Di C ++ 03 keduanya terhubung, Anda dapat menganggapnya
auto
sebagai cara untuk memisahkan mereka.Kadang-kadang membuat tipe eksplisit dapat berguna:
vs.
Dalam kasus di mana Anda mendeklarasikan variabel, menggunakan
auto
membiarkan tipe tidak terucapkan seperti halnya dalam banyak ekspresi. Anda mungkin harus mencoba memutuskan sendiri kapan hal itu membantu keterbacaan dan kapan hal itu menghalangi.Anda dapat berargumen bahwa memadukan tipe yang bertanda tangan dan tidak bertanda merupakan kesalahan sejak awal (memang, beberapa orang berpendapat lebih jauh bahwa seseorang tidak boleh menggunakan jenis yang tidak bertanda sama sekali). The Alasan itu bisa dibilang kesalahan adalah membuat jenis operan sangat penting karena perilaku yang berbeda. Jika Anda perlu mengetahui jenis-jenis nilai Anda, itu mungkin juga bukan hal buruk untuk tidak perlu mengetahuinya. Jadi asalkan kode tersebut belum membingungkan karena alasan lain, itu tidak
auto
apa-apa, kan? ;-)Khususnya ketika menulis kode generik ada kasus di mana jenis sebenarnya dari variabel tidak boleh penting, yang penting adalah bahwa itu memenuhi antarmuka yang diperlukan. Jadi
auto
berikan tingkat abstraksi di mana Anda mengabaikan jenisnya (tapi tentu saja kompiler tidak, ia tahu). Bekerja pada level abstraksi yang sesuai dapat membantu keterbacaan cukup banyak, bekerja pada level "salah" membuat pembacaan kode menjadi pekerjaan berat.sumber
auto
memungkinkan Anda membuat variabel bernama dengan tipe yang tidak dapat disebutkan namanya atau tidak menarik. Nama yang bermakna dapat bermanfaat.sizeof
sebagai tidak ditandatangani pada Anda.IMO, Anda melihat ini secara terbalik.
Bukan masalah
auto
mengarah ke kode yang tidak dapat dibaca atau bahkan kurang dapat dibaca. Ini masalah (berharap bahwa) memiliki tipe eksplisit untuk nilai pengembalian akan menggantikan fakta bahwa (tampaknya) tidak jelas tipe apa yang akan dikembalikan oleh beberapa fungsi tertentu.Setidaknya menurut saya, jika Anda memiliki fungsi yang tipe pengembaliannya tidak segera jelas, itu masalah Anda di sana. Apa fungsi itu harus jelas dari namanya, dan jenis nilai pengembalian harus jelas dari apa yang dilakukannya. Jika tidak, itulah sumber masalahnya.
Jika ada masalah di sini, bukan dengan
auto
. Ini dengan sisa kode, dan kemungkinan cukup bagus bahwa jenis eksplisit hanya cukup band-bantuan untuk membuat Anda melihat dan / atau memperbaiki masalah inti. Setelah Anda memperbaiki masalah nyata itu, keterbacaan kode menggunakanauto
umumnya akan baik-baik saja.Saya kira secara adil saya harus menambahkan: Saya sudah berurusan dengan beberapa kasus di mana hal-hal seperti itu tidak sejelas yang Anda inginkan, dan memperbaiki masalah juga tidak bisa dipertahankan. Sebagai contoh, saya melakukan konsultasi untuk sebuah perusahaan beberapa tahun yang lalu yang sebelumnya bergabung dengan perusahaan lain. Mereka berakhir dengan basis kode yang lebih "didorong bersama" daripada benar-benar bergabung. Program konstituen sudah mulai menggunakan perpustakaan yang berbeda (tapi sangat mirip) untuk tujuan yang sama, dan meskipun mereka bekerja untuk menggabungkan hal-hal yang lebih bersih, mereka masih melakukannya. Dalam banyak kasus, satu-satunya cara untuk menebak jenis apa yang akan dikembalikan oleh fungsi yang diberikan adalah untuk mengetahui dari mana fungsi itu berasal.
Bahkan dalam kasus seperti itu, Anda dapat membantu membuat beberapa hal menjadi lebih jelas. Dalam hal ini, semua kode dimulai di namespace global. Cukup memindahkan jumlah yang wajar ke beberapa ruang nama menghilangkan bentrokan nama dan sedikit memudahkan pelacakan tipe.
sumber
Ada beberapa alasan mengapa saya tidak suka otomatis untuk penggunaan umum:
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.
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.
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.
sumber
auto something = std::make_shared<TypeWithLongName<SomeParam>>(a,b,c);
. :-)Ya, akan lebih mudah untuk mengetahui jenis variabel Anda jika Anda tidak menggunakannya
auto
. Pertanyaannya adalah: apakah Anda perlu tahu jenis variabel Anda untuk membaca kode? Terkadang jawabannya adalah ya, kadang tidak. Misalnya, ketika mendapatkan sebuah iterator daristd::vector<int>
, yang perlu Anda tahu bahwa itu adalahstd::vector<int>::iterator
atau akanauto iterator = ...;
cukup? Segala sesuatu yang orang ingin lakukan dengan iterator diberikan oleh fakta itu iterator - hanya saja tidak peduli apa jenisnya secara spesifik.Gunakan
auto
dalam situasi itu ketika itu tidak membuat kode Anda lebih sulit untuk dibaca.sumber
Secara pribadi saya
auto
hanya menggunakan ketika benar-benar jelas bagi programmer apa itu.Contoh 1
Contoh 2
sumber
auto record = myObj.FindRecord(something)
akan jelas bahwa tipe variabel itu direkam. Atau penamaanit
atau sejenisnya akan membuatnya jelas mengembalikan iterator. Perhatikan bahwa, bahkan jika Anda tidak menggunakanauto
, penamaan variabel dengan benar berarti Anda tidak perlu kembali ke deklarasi untuk melihat tipe dari mana saja dalam fungsi . Saya menghapus downvote saya karena contohnya bukan strawman lengkap sekarang, tapi saya masih tidak membeli argumen di sini.MyClass::RecordTy record = myObj.FindRecord (something)
Pertanyaan ini mengumpulkan opini, yang akan bervariasi dari satu programmer ke programmer lainnya, tetapi saya akan mengatakan tidak. Bahkan dalam banyak kasus justru sebaliknya,
auto
dapat membantu membuat kode lebih mudah dipahami dengan memungkinkan programmer untuk fokus pada logika daripada hal-hal kecil.Ini terutama benar dalam menghadapi tipe template yang kompleks. Berikut adalah contoh yang disederhanakan & dibuat-buat. Mana yang lebih mudah dipahami?
.. atau...
Beberapa akan mengatakan yang kedua lebih mudah dimengerti, yang lain mungkin mengatakan yang pertama. Namun yang lain mungkin mengatakan bahwa penggunaan gratis
auto
dapat berkontribusi untuk mematikan programmer yang menggunakannya, tapi itu cerita lain.sumber
std::map
contoh, selain itu dengan argumen templat yang kompleks.map
s. :)for
misalnya jika iterator tidak valid dalam loop body dan karenanya perlu pra-kenaikan atau tidak bertambah sama sekali.Banyak jawaban bagus sejauh ini, tetapi untuk fokus pada pertanyaan awal, saya pikir Herb terlalu jauh dalam sarannya untuk menggunakan
auto
secara bebas. Contoh Anda adalah satu kasus di mana penggunaanauto
jelas menyakitkan keterbacaan. Beberapa orang bersikeras itu bukan masalah dengan IDE modern di mana Anda dapat mengarahkan variabel dan melihat jenisnya, tetapi saya tidak setuju: bahkan orang yang selalu menggunakan IDE terkadang perlu melihat potongan kode secara terpisah (pikirkan ulasan kode) , misalnya) dan IDE tidak akan membantu.Intinya: gunakan
auto
ketika itu membantu: mis. Iterators in for loop. Jangan menggunakannya saat itu membuat pembaca kesulitan untuk mengetahui jenisnya.sumber
Saya cukup terkejut bahwa belum ada yang menunjukkan bahwa otomatis membantu jika tidak ada tipe yang jelas. Dalam kasus ini, Anda dapat mengatasi masalah ini dengan menggunakan #define atau typedef dalam templat untuk menemukan jenis yang sebenarnya dapat digunakan (dan ini kadang-kadang tidak sepele), atau Anda hanya menggunakan otomatis.
Misalkan Anda memiliki fungsi, yang mengembalikan sesuatu dengan tipe platform-spesifik:
Penggunaan penyihir yang Anda inginkan?
atau hanya sederhana
Tentu, Anda bisa menulis
juga di suatu tempat, tetapi tidak
sebenarnya memberi tahu lebih banyak tentang tipe x? Mengatakan itu adalah apa yang dikembalikan dari sana, tetapi itulah yang otomatis. Ini hanya mubazir - 'barang' ditulis 3 kali di sini - ini menurut saya membuatnya kurang mudah dibaca daripada versi 'otomatis'.
sumber
typedef
mereka.Keterbacaan itu subyektif; Anda harus melihat situasi dan memutuskan yang terbaik.
Seperti yang Anda tunjukkan, tanpa otomatis, deklarasi panjang dapat menghasilkan banyak kekacauan. Tetapi seperti yang Anda tunjukkan, deklarasi pendek dapat menghapus informasi jenis yang mungkin berharga.
Selain itu, saya juga akan menambahkan ini: pastikan Anda melihat keterbacaan dan bukan kemampuan menulis. Kode yang mudah ditulis umumnya tidak mudah dibaca dan sebaliknya. Misalnya, jika saya menulis, saya lebih suka otomatis. Jika saya membaca, mungkin deklarasi yang lebih panjang.
Lalu ada konsistensi; seberapa pentingkah hal itu bagi Anda? Apakah Anda ingin otomatis di beberapa bagian dan deklarasi eksplisit di bagian lain, atau satu metode yang konsisten di seluruh?
sumber
Saya akan mengambil titik kode yang kurang dapat dibaca sebagai keuntungan, dan akan mendorong programmer untuk menggunakannya lebih dan lebih. Mengapa? Jelas jika kode menggunakan otomatis sulit dibaca, maka akan sulit juga untuk menulis. Programmer dipaksa untuk menggunakan nama variabel yang bermakna , untuk membuat pekerjaannya lebih baik.
Mungkin pada awalnya programmer tidak dapat menulis nama variabel yang bermakna. Tetapi pada akhirnya ketika memperbaiki bug, atau dalam tinjauan kode, ketika dia harus menjelaskan kode tersebut kepada orang lain, atau dalam waktu yang tidak begitu dekat, dia menjelaskan kode kepada orang pemeliharaan, programmer akan menyadari kesalahan dan akan menggunakan nama variabel yang bermakna di masa depan.
sumber
myComplexDerivedType
mengganti dengan tipe yang hilang, yang mengacaukan kode dengan pengulangan tipe (di mana pun variabel digunakan), dan yang membujuk orang untuk menghilangkan tujuan variabel dalam namanya . Pengalaman saya adalah, bahwa tidak ada yang tidak produktif selain secara aktif menempatkan hambatan dalam kode.Saya punya dua pedoman:
Jika jenis variabelnya jelas, membosankan untuk ditulis atau sulit untuk menentukan penggunaan otomatis.
Jika Anda memerlukan konversi tertentu atau jenis hasilnya tidak jelas dan dapat menyebabkan kebingungan.
sumber
Iya. Ini mengurangi verbositas tetapi kesalahpahaman yang umum adalah bahwa verbositas mengurangi keterbacaan. Ini hanya benar jika Anda menganggap keterbacaan sebagai estetika daripada kemampuan Anda yang sebenarnya untuk kode intepret - yang tidak meningkat dengan menggunakan otomatis. Dalam contoh yang paling sering dikutip, vektor iterator, itu mungkin muncul di permukaan yang menggunakan otomatis meningkatkan keterbacaan kode Anda. Di sisi lain, Anda tidak selalu tahu apa kata kunci otomatis akan memberi Anda. Anda harus mengikuti jalur logis yang sama seperti yang dilakukan oleh kompiler untuk melakukan rekonstruksi internal, dan seringkali, khususnya dengan iterator, Anda akan membuat asumsi yang salah.
Pada akhirnya, 'otomatis' mengorbankan keterbacaan kode dan kejelasan, untuk 'kebersihan' sintaksis dan estetika (yang hanya diperlukan karena iterator memiliki sintaks yang berbelit-belit tidak perlu) dan kemampuan untuk mengetik 10 karakter lebih sedikit pada setiap baris yang diberikan. Itu tidak sepadan dengan risikonya, atau upaya yang dilakukan untuk jangka panjang.
sumber