Misalkan Anda memiliki proyek besar yang didukung oleh basis API. Proyek ini juga mengirimkan API publik yang dapat digunakan pengguna (ish).
Terkadang Anda perlu membuat perubahan pada basis API yang mendukung proyek Anda. Misalnya, Anda perlu menambahkan fitur yang memerlukan perubahan API, metode baru, atau membutuhkan perubahan salah satu objek, atau format salah satu objek tersebut, diteruskan ke atau dari API.
Dengan asumsi bahwa Anda juga menggunakan objek-objek ini di API publik Anda, objek-objek publik juga akan berubah setiap kali Anda melakukan ini, yang tidak diinginkan karena klien Anda dapat mengandalkan objek API yang tetap identik agar kode parsingnya berfungsi. (klien C + + WSDL batuk ...)
Jadi salah satu solusi potensial adalah dengan versi API. Tetapi ketika kita mengatakan "versi" API, sepertinya ini juga harus berarti versi objek API serta memberikan panggilan metode duplikat untuk setiap tanda tangan metode yang diubah. Jadi saya kemudian akan memiliki objek CLR tua polos untuk setiap versi api saya, yang lagi-lagi tampaknya tidak diinginkan. Dan bahkan jika saya melakukan ini, saya pasti tidak akan membangun setiap objek dari awal karena akan berakhir dengan sejumlah besar kode duplikat. Alih-alih, API kemungkinan akan memperpanjang objek pribadi yang kami gunakan untuk API dasar kami, tetapi kemudian kami mengalami masalah yang sama karena properti yang ditambahkan juga akan tersedia di API publik ketika seharusnya tidak demikian.
Jadi, apakah kewarasan yang biasanya diterapkan pada situasi ini? Saya tahu banyak layanan publik seperti Git untuk Windows mengelola API versi, tetapi saya mengalami kesulitan membayangkan arsitektur yang mendukung ini tanpa banyak kode duplikat yang mencakup berbagai metode versi dan objek input / output.
Saya menyadari bahwa proses seperti upaya versi semantik untuk menempatkan kewarasan ketika API publik rusak harus terjadi. Masalahnya lebih karena sepertinya banyak atau sebagian besar perubahan memerlukan pemutusan API publik jika objek tidak lebih terpisah, tapi saya tidak melihat cara yang baik untuk melakukannya tanpa kode duplikat.
I don't see a good way to do that without duplicating code
- API baru Anda selalu dapat memanggil metode di API lama Anda, atau sebaliknya.