Pertama buat API BARU, yang melakukan apa yang Anda inginkan perilaku API BARU Anda. Jika kebetulan bahwa API baru ini memiliki nama yang sama dengan API TUA, maka saya menambahkan nama _NEW ke nama API baru.
int DoSomethingInterestingAPI ();
menjadi:
int DoSomethingInterestingAPI_NEW (int take_more_arguments); int DoSomethingInterestingAPI_OLD (); int DoSomethingInterestingAPI () {DoSomethingInterestingAPI_NEW (whatever_default_mimics_the_old_API); OK - pada tahap ini - semua tes regresi Anda masih lulus - menggunakan nama DoSomethingInterestingAPI ().
NEXT, buka kode Anda dan ubah semua panggilan ke DoSomethingInterestingAPI () ke varian yang sesuai dari DoSomethingInterestingAPI_NEW (). Ini termasuk memperbarui / menulis ulang bagian apa pun dari tes regresi Anda yang perlu diubah untuk menggunakan API baru.
NEXT, tandai DoSomethingInterestingAPI_OLD () sebagai [[usang ()]]. Tetap gunakan API yang sudah tidak digunakan lagi selama Anda mau (sampai Anda telah memperbarui semua kode yang mungkin bergantung dengan aman).
Dengan pendekatan ini, setiap kegagalan dalam tes regresi Anda hanyalah bug dalam tes regresi itu atau mengidentifikasi bug dalam kode Anda - persis seperti yang Anda inginkan. Proses bertahap untuk merevisi API dengan secara eksplisit membuat versi _NEW dan _OLD dari API ini memungkinkan Anda untuk memiliki sedikit kode baru dan lama yang hidup berdampingan untuk sementara waktu.
Berikut adalah contoh yang baik (sulit) dari pendekatan ini dalam praktiknya. Saya memiliki fungsi BitSubstring () - di mana saya telah menggunakan pendekatan memiliki parameter ketiga menjadi COUNT bit dalam substring. Agar konsisten dengan API dan pola lain dalam C ++, saya ingin beralih untuk memulai / mengakhiri sebagai argumen untuk fungsi.
https://github.com/SophistSolutions/Stroika/commit/003dd8707405c43e735ca71116c773b108c217c0
Saya membuat fungsi BitSubstring_NEW dengan API baru, dan memperbarui semua kode saya untuk menggunakannya (meninggalkan NO LEBIH BANYAK PANGGILAN ke BitSubString). Tetapi saya meninggalkan implementasi untuk beberapa rilis (bulan) - dan menandainya sudah usang - sehingga semua orang dapat beralih ke BitSubString_NEW (dan pada saat itu mengubah argumen dari hitungan menjadi gaya awal / akhir).
LALU - ketika transisi itu selesai, saya melakukan komit lain menghapus BitSubString () dan mengganti nama BitSubString_NEW-> BitSubString () (dan mencabut nama BitSubString_NEW).