Bir API tabanı tarafından desteklenen büyük bir projeniz olduğunu varsayalım. Proje ayrıca son (ish) kullanıcıların kullanabileceği genel bir API gönderir.
Bazen projenizi destekleyen API tabanında değişiklikler yapmanız gerekebilir. Örneğin, API değişikliğine, yeni bir yönteme ihtiyaç duyan veya nesnelerden birinin veya bu nesnelerden birinin biçiminin API'ye veya API'den geçirilmesini gerektiren bir özellik eklemeniz gerekir.
Bu nesneleri genel API'nizde de kullandığınızı varsayarsak, genel nesneler de bunu yaptığınız zaman değişecektir; bu, istemcileriniz ayrıştırma kodlarının çalışması için aynı kalan API nesnelerine güvenebileceğinden istenmeyen bir durumdur. (öksürük C ++ WSDL istemcileri ...)
Dolayısıyla potansiyel çözümlerden biri API'yi sürümlendirmektir. Ancak API'yi "sürüm" dediğimizde, bunun, API nesnelerini sürümlendirmenin yanı sıra, her değiştirilen yöntem imzası için yinelenen yöntem çağrıları sağlaması gerektiği anlamına gelmesi gerekir. Böylece benim api her sürümü için düz bir eski clr nesne olurdu, ki bu yine istenmeyen görünüyor. Ve bunu yapsam bile, her nesneyi sıfırdan inşa etmeyeceğim çünkü bu büyük miktarlarda çoğaltılan kodla sonuçlanacaktır. Bunun yerine, API'nin temel API'miz için kullandığımız özel nesneleri genişletmesi muhtemeldir, ancak daha sonra aynı sorunla karşılaşırız çünkü ek özellikler olması gerekmediğinde genel API'da da kullanılabilir.
Peki bu duruma genellikle uygulanan akıl sağlığı nedir? Git for Windows gibi birçok kamu hizmetinin sürümlü bir API barındırdığını biliyorum, ancak çeşitli sürümlendirilmiş yöntemleri ve giriş / çıkış nesnelerini kapsayan büyük miktarda yinelenen kod olmadan bunu destekleyen bir mimari hayal etmekte sorun yaşıyorum.
Anlamsal sürüm oluşturma gibi süreçlerin , genel API kesintilerinin ne zaman gerçekleşmesi gerektiği konusunda biraz akıl sağlamaya çalıştığının farkındayım . Sorun, nesnelerin daha fazla ayrılmazsa, birçok veya en çok değişiklik genel API'yi kırmayı gerektiren gibi görünüyor, ancak kodu çoğaltmadan bunu yapmanın iyi bir yolunu görmüyorum.
I don't see a good way to do that without duplicating code
- Yeni API'nız her zaman eski API'nizdeki yöntemleri çağırabilir veya tam tersi.