Saya memelihara API publik dan harus mencabut metode.
Apakah ada aturan umum tentang berapa bulan / tahun / versi sebelum penghapusan saya harus mencabut metode?
java
deprecation
deviDave
sumber
sumber
java.io.StringBufferInputStream
ditinggalkan sejak JDK 1.1 (1997?). Tidak ada jawaban yang baik atau salah untuk pertanyaan ini. Itu tergantung pada kebutuhan Anda untuk memberikan kompatibilitas ke belakang.Jawaban:
Minimal, Anda harus menyimpan metode yang sudah usang dalam satu versi sebelum menghapusnya yang tampak agak jelas ketika saya menuliskannya. Saya tidak berpikir ada waktu maksimum tetapi jika Anda tidak pernah benar-benar menghapusnya, penghinaan menjadi sedikit sia-sia.
Rilis versi besar adalah waktu yang tepat untuk menghapus metode yang sudah usang. Rilis minor biasanya tidak mengandung perubahan yang melanggar. Seperti yang dicatat cHao dalam komentar, penghentian tidak selalu menyiratkan bahwa akan ada penghapusan akhirnya jadi jika Anda berencana untuk menghapus sesuatu setelah penghentian, Anda harus secara eksplisit mencatatnya dan memberikan beberapa panduan pada timeline.
sumber
Ini semata-mata tergantung pada jaminan stabilitas seperti apa yang Anda berikan kepada pengguna Anda, dan berapa banyak rasa sakit yang ingin Anda sebabkan bagi pengguna Anda.
Idealnya, API Anda menggunakan semver sehingga setiap perubahan yang melanggar menyebabkan nomor versi utama bertambah. Dalam praktiknya, diinginkan untuk melakukan ini hampir tidak pernah. Jika API Anda diinstal melalui beberapa manajer paket, Anda mungkin ingin membuat nama paket baru setelah perubahan yang melanggar sehingga peningkatan sederhana tidak menyebabkan konflik (misalnya
myapi2 v2.123.4
vsmyapi3 v3.2.1
). Itu mungkin tidak perlu jika manajer paket Anda mendukung dependensi versi yang lebih ketat (mis. Spesifikasi dependensi seperti~v2.120
itu tidak termasukv3.*
), tetapi nama paket yang berbeda memiliki keuntungan bahwa versi yang tidak kompatibel dapat digunakan berdampingan dengan sangat mudah. Bahkan ketika menggunakan semver, masuk akal untuk memiliki periode penghentian.Semver tidak selalu berlaku. Maka lebih penting untuk mengomunikasikan kebijakan stabilitas yang jelas. Sebagai contoh:
Kebijakan seperti itu bekerja sangat baik ketika Anda memiliki rilis reguler sehingga ada periode penghentian yang jelas, misalnya satu tahun.
Selain menandai bagian mana pun dari API yang sudah usang, Anda harus membuat penghentian tersebut diketahui secara luas. Sebagai contoh:
Adapun periode penghentian tepat untuk memilih, pertama-tama lihat apakah Anda harus menghormati kontrak dukungan dengan pengguna Anda. Kontrak semacam itu mungkin mengharuskan Anda untuk mempertahankan kompatibilitas untuk beberapa periode. Jika tidak, pertimbangkan dampak hilir apa pun. Cobalah untuk berubah lebih cepat daripada pengguna hilir sehingga mereka dapat melalui siklus penghentian mereka sendiri. Pengguna hilir akan membutuhkan waktu untuk beradaptasi dengan perubahan Anda, jadi Anda seharusnya tidak pernah memiliki periode penghentian yang lebih pendek dari sebulan.
sumber
Ideally, your API uses semver so that any breaking change causes the major version number to be incremented. In practice, it is desirable to do this almost never.
Apa gunanya menggunakan semver untuk mengindikasikan perubahan yang pecah jika Anda mengikutinya dengan mengatakan Anda tidak boleh memperkenalkan versi utama baru?Idealnya, Anda ingin menunggu sampai tidak ada yang menggunakan metode yang sudah tidak digunakan lagi. Mengingat Anda menggunakan API publik, itu mudah dilacak, tetapi Anda mungkin menunggu lama sekali.
pada 2015, Google memiliki masalah serupa dengan stlport API di OS Android mereka. Mereka telah mencabutnya dan ingin menghapusnya, tetapi banyak aplikasi masih menggunakannya. Mereka menemukan solusi cerdas:
Pada dasarnya, mereka menambahkan sleep 8 detik () selama boot dari aplikasi apa pun yang masih menggunakan API dengan pesan log yang sesuai untuk para pengembang. Sebulan kemudian, mereka menggandakannya menjadi 16 detik. lalu sebulan kemudian, mereka dapat dengan aman menghapus antarmuka API karena tidak ada yang tersisa menggunakannya.
Ini bisa menjadi cara yang sangat efektif untuk melakukan ini. Satu-satunya masalah sebenarnya adalah jika API Anda sudah sangat tua dan telah secara aktif menggunakan konsumen yang tidak lagi didukung secara aktif. Sayangnya, Anda mungkin tidak akan dapat memperbaiki sendiri konsumen seperti itu, tetapi pada saat itu Anda tidak dapat melakukan lebih dari sekadar menghapus metode dan menghancurkan konsumen.
sumber
Waktu minimum untuk menyediakan metode yang tidak digunakan lagi tergantung pada siklus pengembangan program menggunakan API Anda. Sebagai angka rata-rata, 1 tahun seharusnya cukup.
Adapun waktu maksimum sebelum Anda harus menghapus metode usang, saya berpendapat bahwa tidak ada hal seperti itu. Tidak peduli berapa lama Anda menunggu, menghapus metode yang sudah usang akan selalu merusak sesuatu. Beberapa program menggunakan API Anda yang sudah usang tidak dipelihara secara aktif, dan melanggar kompatibilitas akan berarti akhir dari program tersebut.
Saya sarankan Anda menghapus metode yang sudah usang saat Anda mendapatkan sesuatu dari penghapusan :
Menghapus metode yang sudah usang hanya karena sudah tidak digunakan lagi selama X bulan / tahun atau karena Anda merilis versi baru berarti merusak kompatibilitas secara sewenang-wenang tanpa alasan yang jelas.
sumber
Pertama, Anda harus mempertimbangkan apakah Anda ingin usang atau usang.
Sudah usang harus digunakan untuk metode yang dalam beberapa cara berbahaya: keamanan, kinerja, hasil yang salah. Anda ingin menyingkirkan mereka secara relatif cepat, tidak lebih dari 2 versi utama dan pergi ke 3. Untuk masalah yang cukup signifikan, usang dapat dihapus di versi minor berikutnya.
Usang adalah untuk hal-hal yang kurang berguna untuk beberapa alasan, misalnya mengembalikan informasi lebih sedikit atau tidak berfungsi dengan baik, tidak memasukkan banyak opsi dan sebagainya. Ini bisa berkeliaran tanpa batas waktu, tetapi setidaknya harus hadir dalam versi utama berikutnya.
sumber
Jawabannya tergantung pada jenis layanan apa yang Anda berikan kepada pelanggan Anda.
Di salah satu ujung ekstrim, ada kesalahan di Windows.h dari era Win 3.1 yang disebarkan selama dua dekade karena Microsoft sangat percaya pada kompatibilitas ke belakang.
Di ujung lain spektrum, banyak aplikasi web menghapus fitur tanpa memberikan peringatan penghentian.
Berapa banyak klien Anda membayar untuk perangkat lunak Anda sering penting, seperti halnya pekerjaan mereka. Ilmuwan riset biasanya lebih bersedia menerima penghinaan sebagai bagian dari perjalanan kemajuan daripada, katakanlah, bankir atau FAA.
Saya bekerja di perusahaan yang mengembangkan perangkat lunak untuk penggunaan internal. Saya mendukung banyak kelompok selama bertahun-tahun. Satu kelompok memiliki mentalitas "tidak pernah menghapus fitur apa pun". Mereka membutuhkan kemampuan untuk kembali ke file 5-10 tahun yang lalu dan melakukan analisis pada mereka pada rentang waktu terlalu cepat untuk membuat pengembang memasukkan fitur kembali. Sikap satu kelompok adalah "memastikan semua penghinaan ada di catatan tempel, jadi kami dapat menemukannya nanti. " Di tengah, kami memiliki satu grup yang aturannya adalah "Fitur harus dihentikan untuk setidaknya 1 versi dengan peringatan tercetak jika digunakan sebelum menghapusnya." Kelompok itu memiliki ruang uji yang mencakup fitur yang mereka butuhkan. Setiap kali kami merilis versi baru, mereka dengan cepat menjalankan test suite mereka untuk melihat apakah ada penghinaan yang membuat mereka kesulitan.
sumber
Mengapa Anda perlu melakukan ini? Apakah karena ada cara baru yang mengkilap untuk melakukan sesuatu, sehingga metode lama sekarang tidak disarankan, tetapi masih berfungsi dengan baik? Atau apakah metode lama benar-benar perlu pergi karena hal-hal telah berubah secara mendasar?
Jika metode lama tidak menyebabkan masalah aktual, dan dapat bertahan, maka mungkin juga. Jika tidak rusak, jangan memperbaikinya. Apakah Anda benar-benar perlu menghapusnya? Mungkin tandai sebagai usang, dan sertakan catatan dalam dokumentasi bahwa metode lain mungkin lebih efisien, atau apa pun, tetapi mungkin baik-baik saja untuk membiarkannya di tempat.
Jika metode lama benar-benar perlu dilakukan, karena itu menyebabkan Anda sakit kepala karena pemeliharaan, atau karena itu tidak lagi masuk akal karena perubahan lain, maka pantau penggunaannya dan komunikasikan penghinaan tersebut dengan jelas kepada klien. Beri mereka tanggal yang jelas dan setelah itu metode tersebut akan dihapus. (Idealnya, jangan benar-benar menghapusnya segera pada tanggal ini: tunggu sampai tidak ada yang masih menggunakannya sebelum benar-benar menghapusnya. Mungkin perlu pergi lebih cepat, jika itu benar-benar menyebabkan masalah, tetapi setidaknya menunggu penggunaan untuk menjatuhkan sedikit.)
Jika metode lama menyebabkan masalah keamanan, Anda mungkin perlu bergerak lebih cepat dari itu, bahkan mungkin menghapusnya tanpa peringatan, tetapi Anda harus mendokumentasikan perubahan ini di suatu tempat yang sangat terlihat, dan juga mengembalikan pesan yang masuk akal kepada klien yang berusaha menggunakan metode lama.
(Dua poin peluru kedua tercakup dalam jawaban lain, tapi saya pikir yang pertama adalah baru.)
sumber
Untuk proyek publik, hapus saja jika dan hanya jika Anda perlu.
Ketika Anda melakukan penghapusan API yang tidak perlu, Anda harus mengeluarkan biaya untuk perusahaan dan kontraktor sedemikian rupa sehingga Anda bahkan tidak bisa menghitung karena churn yang mahal.
Ingin perusahaan dan pemrogram independen berhenti menggunakan proyek Anda? Hancurkan barang-barang mereka cukup saat Anda tidak penting dan Anda akan berada di kapal itu dalam waktu singkat.
deprecation != eventual_removal
. Jika API berbahaya, Anda menghapusnya. Jika sudah tua, tinggalkan dan dokumentasikan penggantinya.sumber