Saya baru saja mengkompilasi beberapa kode saya sendiri dengan -std=c++0x
bendera di GCC, karena saya ingin secara samar mengikuti apa yang dilakukan semua anak muda (asalkan mereka tinggal di halaman saya), dan saya berakhir dengan banyak peringatan tentang auto_ptr
menjadi usang. Tentu saja, saya tahu itu auto_ptr
sudah usang dalam C ++ 0x, tapi ...
Bukankah penghinaan hanya membuang-buang waktu dan tenaga? Alasan untuk tidak mencela (dengan auto_ptr sebagai contoh):
ada lautan kode di luar sana yang masih perlu didukung, menghasilkan jutaan peringatan hanya akan menggoda orang untuk mematikan peringatan.
auto_ptr
Agak sulit, tapi itu benar-benar melakukan apa yang tertulis di kaleng.jika kita benar-benar ingin mencela, saya mencalonkan
printf()
. Tapi bayangkan saja jeritan yang akan terjadi.auto_ptr
tidak memiliki terlalu banyak teman, tetapi setidaknya dalam kode C ++ saya digunakan lebih dariprintf
, yang tidak digunakan sama sekali.panitia memiliki catatan buruk untuk mendapatkan ini dengan benar - mereka sudah ketinggalan zaman di lingkup namespace, dan sekarang tampaknya sudah tidak layak - saya tidak akan terkejut jika
auto_ptr
membuat yang sama kembaliterakhir, apa pun yang dikatakan komite, pelaksana kompiler mengabaikannya - mereka tidak bisa mengambil risiko melanggar kode pelanggan mereka, yang bisa mereka lakukan hanyalah mengeluarkan peringatan yang menjengkelkan.
Jadi pertanyaan saya - apakah Anda menganggap penghentian (dari apa pun, bukan hanya auto_ptrs, dan bukan hanya di C ++) ide yang bagus, dan jika demikian, mengapa?
sumber
auto_ptr
sebagai contoh.unique_ptr
dan lebih bahagia.Jawaban:
Alasan penghentian (secara umum):
Saya juga tidak setuju tentang poin terakhir. Kompiler tidak mengabaikan komite, dan mereka akhirnya menghapus hal-hal yang sudah usang (misalnya
>?=
dan<?=
dalam GCC - mereka sudah tidak digunakan lagi kemudian dihapus *).Saya pikir poin pentingnya adalah: beberapa hal harus dihapus, karena berbagai alasan, dan saya pikir penghinaan adalah satu-satunya cara yang waras untuk melakukan itu. Dalam kasus khusus ini,
auto_ptr
harus dihapus karena telah digantikan olehunique_ptr
. Mengubahnya cukup mudah, dan orang akan punya banyak waktu untuk melakukannya.(*) Ya saya tahu itu adalah ekstensi dan bukan standar, tetapi intinya adalah bahwa vendor kompiler akhirnya menghapus sesuatu setelah mereka memasuki penghentian, apakah kode masih bergantung pada mereka atau tidak.
sumber
>?=
dan<?=
operator?a >?= b;
yang mana singkatanif (a > b) a = b;
dan juga untuk<?=
.API apa pun yang cukup rumit kemungkinan akan memiliki kekurangan yang tidak ditemukan sampai mereka digunakan untuk sementara waktu. Pilihan kami:
Penghentian adalah yang terbaik dari alternatif-alternatif ini.
sumber
Tidak Penghentian bisa menjadi hal yang sangat baik. Itu membuat teknologi tidak terjebak dengan bagasi lama yang tidak berguna.
Hanya di arena C ++, saya ingat "fitur" Microsoft tidak mendukung deklarasi variabel dengan benar dalam pernyataan for. Itu berlangsung sekitar satu dekade dan membuat banyak kode non-portabel. Itu salah satu "fitur" saya senang sudah ditinggalkan.
Lebih umum, Apple telah memiliki kebiasaan sejak tahun 80-an menandai API tua yang kikuk sebagai "usang" selama 5-7 tahun sebelum menariknya. Saya baru saja berbicara dengan seorang insinyur Apple di WWDC tentang penghentian beberapa API QuickTime C kuno, dan sangat senang mendengar mereka melakukan itu, karena dukungan terus-menerus untuk model yang dikembangkan sekitar tahun 1990 benar-benar menghalangi apa yang diharapkan orang dapat dapat lakukan. untuk dilakukan pada CPU multicore 64-bit modern.
Dalam praktiknya, ini akan memakan waktu lama bagi penulis kompiler untuk membuang auto_ptr, dan mereka mungkin akan mendukung beberapa mode kompatibilitas-mundur selama satu atau dua dekade, tetapi itu adalah hal yang baik.
sumber
printf
adalah fungsi yang bermanfaat. Ini memungkinkan untuk memformat sesuatu dengan cara yang lebih pendek daripada iostreams. Dan itu adalah fungsi C. Alasan utama C ++ ada dan digunakan adalah karena itu kompatibel dengan C. Jadi penghinaanprintf
tampaknya kurang bermanfaat.Komite menyadari beberapa masalah dari arti penghinaan saat ini. Lihat arti dari penghinaan .
sumber
Bahasa dan API harus bergerak maju. Meskipun mungkin ada satu ton kode tergantung pada beberapa fitur lama, mungkin ada cara baru dan lebih baik untuk melakukan sesuatu dan biaya untuk mendukung fitur lama terlalu banyak.
Penghentian juga memberi peringatan bahwa di masa depan, fitur tersebut akan dihapus. Ini memberi pengembang waktu untuk memperbarui kode mereka jika mereka mengikuti API baru. Ini jauh lebih baik daripada alternatif: penghapusan langsung. Ingatlah bahwa depresiasi adalah peringatan, bukan kesalahan.
Dan jika ini adalah program lama yang tidak ingin Anda perbarui, maka tidak ada yang menghentikan Anda dari menggunakan API lama (atau dalam hal ini kompiler).
sumber
Seperti berdiri, penghinaan memiliki setidaknya dua makna.
Saya pikir statis termasuk dalam kategori yang terakhir, tetapi hanya waktu yang akan mengatakan apakah auto_ptr benar-benar layak dihapus atau apakah lebih baik menyimpannya dalam bahasa.
sumber
Penghentian tidak berbahaya jika pindah ke alternatif dapat dilakukan dalam 1 hari kerja: mis. pencarian sederhana / ganti fungsi lama dengan yang baru, atau lapisan kompatibilitas mudah diatur.
Jika Anda perlu menulis ulang sebagian besar perangkat lunak karena penghentian, maka itu berbahaya.
Contoh yang baik mungkin adalah PHP mysql API, pada dasarnya Anda hanya perlu mengganti semua mysql_ * dengan mysqli_ * dan memberikan id tautan kepada mereka dan itu selesai.
Salah satu contoh buruk adalah penghentian dan penghapusan glBegin, glEnd, dan semua hal-hal perhitungan matriks dari OpenGL, jika Anda ingin kode Anda bekerja pada OpenGL3 atau lebih, Anda harus menulis ulang seluruh kode rendering untuk menggunakan buffer vertex.
sumber
Saya pikir ini adalah cara yang baik untuk membuat orang tahu bahwa ada cara yang lebih baik. Saya lebih suka penghinaan yang bagus daripada fungsi hanya menghilang.
sumber