Saat ini saya mengelola perpustakaan yang memiliki banyak penggunaan publik, dan saya punya pertanyaan tentang versi semantik . Saya ingin memperbaiki satu bagian yang cukup penting dari perpustakaan yang diimplementasikan secara tidak benar - dan selalu diimplementasikan dengan salah. Tetapi melakukan ini berarti perubahan pada API publik, yang merupakan keputusan besar.
Perubahan yang ingin saya lakukan berkisar pada bagaimana iterator digunakan. Saat ini, pengguna harus melakukan ini:
while ($element = $iterator->next()) {
// ...
}
Yang salah, setidaknya di antarmuka PHP asli Iterator . Saya ingin mengganti dengan ini:
while ($iterator->valid()) {
$element = $iterator->current();
// ...
$iterator->next();
}
yang analog dengan:
foreach ($iterator as $element) {
// ...
}
Jika Anda melihat panduan Tom untuk versi semantik, ia dengan jelas menyatakan bahwa setiap perubahan pada API publik (yaitu yang tidak kompatibel ke belakang), harus membenarkan rilis utama. Jadi perpustakaan akan melompat dari 1.7.3 ke 2.0.0 yang, bagi saya, adalah langkah terlalu jauh. Kami hanya berbicara tentang satu fitur diperbaiki.
Saya memang punya rencana untuk merilis 2.0.0, tetapi saya pikir ini adalah ketika Anda benar-benar menulis ulang perpustakaan dan mengimplementasikan banyak perubahan API publik. Apakah pengenalan refactoring ini menjamin rilis versi utama? Saya benar-benar tidak bisa melihat bagaimana caranya - saya merasa lebih nyaman melepaskannya sebagai 1.8.0 atau 1.7.4. Adakah yang punya saran?
next()
metode ini digunakan untuk mengambil elemen saat ini DAN menggerakkan pointer internal ke depan. Yang salah.next()
harus menggerakkan pointer, dancurrent()
digunakan untuk mengambil ...next()
hanya yang menggerakkan pointer, ini benar-benar tidak merusak kompatibilitasJawaban:
Anda ragu karena Anda tidak ingin membuat versi semantik, Anda ingin membuat "versi pendukung iklan". Anda mengharapkan nomor versi "2.0" untuk memberi tahu dunia bahwa Anda memiliki banyak fitur keren baru di perpustakaan Anda sekarang, bukan karena Anda mengubah API. Tidak apa-apa (banyak perusahaan perangkat lunak dan / atau pengembang melakukan itu). IMHO Anda memiliki opsi berikut:
next
, cukup tambahkanvalid
dancurrent
fungsinya). Kemudian Anda dapat menggunakan "1.8.0" sebagai nomor versi berikutnya. Jika Anda berpikir mengubah perilakunext
sangat penting, lakukanlah dalam 2.0.0.sumber
next()
untuk terus melakukan apa yang dilakukannya. Untuk mengimplementasikan fungsi dengan benar, ia harus melakukan sesuatu yang berbeda. Jadi jika saya membuatnya kompatibel - fungsi baru / perbaikan juga akan salah, dan merusak seluruh titik perubahan.next()
metode baru untuk melakukan semua fungsi baru, ditambah apa yang diperlukan untuk membuat kompatibel. Rasanya agak mengerikan karena harus menodai fungsi baru seperti ini, tapi hei ho.Tetap dengan panduan Tom untuk versi semantik.
Setiap perubahan signifikan pada API publik harus dilakukan di salah satu dari dua poin ini:
Pilihan saya, omong-omong, adalah untuk yang pertama. Tapi saya akui itu hanya cocok untuk hal-hal sepele.
Masalahnya adalah menjaga kompatibilitas ke belakang dan memastikan Anda tidak merusak barang-barang untuk pengguna API Anda sebelumnya.
Intinya, Anda membuat kesalahan pengindeksan untuk pengguna Anda yang tidak menyadari perubahan tersebut. Memaksa perubahan seperti ini memaksa semua pengguna Anda untuk melakukan hal berikut:
Itu bisa berpotensi banyak usaha, terutama ketika Anda mempertimbangkan betapa sedikit proyek memiliki kasus uji untuk memvalidasi perubahan seperti ini. Jumlah upaya bertambah ketika Anda mempertimbangkan jumlah pengguna hilir dari pengguna Anda yang juga perlu memperbarui instalasi mereka.
Untuk sesuatu yang sekecil ini, saya akan membiarkannya pergi dan tidak repot-repot dengan itu.
Jika itu benar-benar mengganggu Anda (yang ternyata tidak atau Anda tidak akan bertanya) maka saya akan melakukan hal berikut.
Release Notes
sebelumnya yang menyiarkan bahwa perubahan akan terjadiDan bersabarlah karena akan membutuhkan waktu untuk mengumpulkan hal-hal lain yang membenarkan peningkatan nomor versi ke rilis besar baru. Pemberitahuan lanjutan (bagian 3) memberi Anda waktu untuk menerima umpan balik dari pengguna akhir untuk mengetahui seberapa besar dampak perubahan yang akan terjadi.
Solusi alternatif adalah menambahkan fungsi baru yang beroperasi dengan cara yang Anda inginkan.
Jika sudah,
foo()
maka Anda akan membuatfooCorrect()
untuk memberikan perbaikan tetapi juga sepenuhnya mempertahankan kompatibilitas ke belakang. Dan pada titik tertentu Anda dapatfoo()
membuat orang lain tahu untuk tidak menggunakannya.Tantangannya ada adalah bahwa Anda akan menemukan sesuatu yang lain dalam
fooCorrect()
yang memerlukan pembaruan itu dan Anda berakhir denganfooCorrectedCorrect()
atau omong kosong konyol lainnya.Jika Anda benar-benar menginginkannya ini diperbaiki sekarang, pendekatan alternatif ini mungkin merupakan rute terbaik. Waspadai dan waspada menciptakan banyak fungsi tambahan dengan cara ini karena itu membuat API lebih sulit untuk dikerjakan. Dan kesadaran itu mungkin cukup untuk mencegah yang terburuk dari jenis masalah ini.
Tapi ini mungkin pendekatan "paling buruk" untuk dipertimbangkan untuk sesuatu yang kecil.
sumber
next()
tidaknextCorrect()
). Saya akan melihat apakah saya dapat memodifikasi next () sehingga kompatibel mundur DAN berfungsi ketika mengimplementasikanIterator
antarmuka.