Penghentian dianggap berbahaya? [Tutup]

27

Saya baru saja mengkompilasi beberapa kode saya sendiri dengan -std=c++0xbendera 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_ptrmenjadi usang. Tentu saja, saya tahu itu auto_ptrsudah 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_ptrtidak memiliki terlalu banyak teman, tetapi setidaknya dalam kode C ++ saya digunakan lebih dari printf, 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_ptrmembuat yang sama kembali

  • terakhir, 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?

Neil Butterworth
sumber
2
@TheLQ - Saya membacanya sebagai "mengapa harus mendepresiasi apa pun" tetapi menggunakan auto_ptrsebagai contoh.
ChrisF
4
apakah itu tertulis di kaleng "akan menghancurkan hatimu jika digunakan dalam wadah dari hampir semua jenis"? Gunakan unique_ptrdan lebih bahagia.
Kate Gregory
13
@ Neil - bahasa Anda sedikit radang dan (pada refleksi) itu memang muncul lebih dari kata-kata kasar dari pertanyaan serius. Jika Anda ingin tetap terbuka Anda mungkin ingin "nada turun".
ChrisF
4
@ Neil - Saya menghargai bahwa Anda telah menjadikannya lucu, tetapi seperti yang saya katakan, pada refleksi itu lebih "ranty" daripada yang saya pikir Anda maksudkan.
ChrisF
10
Jika Anda pernah berencana untuk menyingkirkan penghinaan, Anda harus benar-benar mencela itu terlebih dahulu. Banyak bahasa / API yang ada akan rusak jika tidak. Dengan penghinaan, Anda bisa memberi mereka waktu untuk menyingkirkan penghinaan yang sudah usang itu.
Joachim Sauer

Jawaban:

32

Alasan penghentian (secara umum):

  • Ini jelas menunjukkan kepada orang-orang bahwa ada sesuatu yang merupakan praktik buruk (dan mudah-mudahan menyarankan alternatif).
  • Periode penghentian memberi orang kesempatan untuk mengubah kode mereka sebelum kompiler menghapusnya langsung.

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_ptrharus dihapus karena telah digantikan oleh unique_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.

Peter Alexander
sumber
6
Maaf untuk offtopic, tapi aku tidak bisa menahan: apa yang mereka >?=dan <?=operator?
brandizzi
7
Di GCC lama Anda bisa menulis a >?= b;yang mana singkatan if (a > b) a = b;dan juga untuk <?=.
Peter Alexander
2
Ugh ... Saya bisa melihat mengapa mereka menambahkannya. Lalu mengapa mereka menghapusnya. Penghentian dapat diperlukan untuk fitur "rapi" yang hanya mengungkapkan betapa problematisnya mereka setelah mereka dirilis ke publik.
Phil
25

API apa pun yang cukup rumit kemungkinan akan memiliki kekurangan yang tidak ditemukan sampai mereka digunakan untuk sementara waktu. Pilihan kami:

  • Tinggalkan apa adanya. Ini berarti API akan terus mengumpulkan semakin banyak cacat seiring berkembangnya waktu. Bahkan jika versi baru dan lebih baik ditambahkan, yang lama perlu tetap dijaga.
  • Hapus tanpa peringatan. Ini kemungkinan akan merusak banyak kode.
  • Jelekkan dan hapus dalam versi yang lebih baru. Ini memberi waktu untuk memperbaiki kode yang ada, sambil memastikan bahwa jumlah cruft tetap dibatasi.

Penghentian adalah yang terbaik dari alternatif-alternatif ini.

hammar
sumber
12

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.

Bob Murphy
sumber
11

jika kita benar-benar ingin mencela hal-hal, saya menominasikan printf ()

printfadalah 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 penghinaan printftampaknya kurang bermanfaat.

Jadi, ada orang lain yang siap untuk perang salib anti-penghinaan?

Komite menyadari beberapa masalah dari arti penghinaan saat ini. Lihat arti dari penghinaan .

Johannes Schaub - litb
sumber
5

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).

TheLQ
sumber
1

Seperti berdiri, penghinaan memiliki setidaknya dua makna.

  • Itu akan dihapus di versi masa depan
  • Kami menciptakan alternatif yang lebih baik dan sekarang fitur tersebut berlebihan (tetapi tidak sepenuhnya tidak berguna). Pendatang baru akan lebih baik melewati ini sambil belajar bahasa; Namun, itu tidak akan dihapus dalam waktu dekat.

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.

marcus
sumber
0

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.

Calmarius
sumber
-1

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.

Jeff
sumber