मान लीजिए कि आपके पास एपीआई आधार द्वारा समर्थित एक बड़ी परियोजना है। यह परियोजना एक सार्वजनिक एपीआई को भी शिप करती है जिसका उपयोग (ईश) उपयोगकर्ता कर सकते हैं।
कभी-कभी आपको एपीआई आधार में बदलाव करने की आवश्यकता होती है जो आपकी परियोजना का समर्थन करता है। उदाहरण के लिए, आपको एक ऐसी सुविधा जोड़ने की आवश्यकता है जिसमें एपीआई परिवर्तन, एक नई विधि या वस्तुओं में से किसी एक को बदलने की आवश्यकता हो, या एपीआई से पारित या उन वस्तुओं में से किसी एक का प्रारूप।
यह मानते हुए कि आप अपने सार्वजनिक एपीआई में इन वस्तुओं का उपयोग कर रहे हैं, सार्वजनिक वस्तुएं आपके द्वारा किए जाने वाले किसी भी समय को बदल देंगी, जो अवांछनीय है क्योंकि आपके ग्राहक एपीआई वस्तुओं पर निर्भर रह सकते हैं जो उनके पार्सिंग कोड के काम करने के लिए समान हैं। (खांसी C ++ WSDL क्लाइंट ...)
तो एक संभावित समाधान एपीआई का संस्करण है। लेकिन जब हम एपीआई को "संस्करण" कहते हैं, तो ऐसा लगता है कि एपीआई वस्तुओं के संस्करण के साथ-साथ प्रत्येक परिवर्तित विधि हस्ताक्षर के लिए डुप्लिकेट विधि कॉल प्रदान करने का भी मतलब होना चाहिए। तो मैं तो अपने एपीआई के प्रत्येक संस्करण के लिए एक सादे पुराने clr वस्तु होगा, जो फिर से अवांछनीय लगता है। और यहां तक कि अगर मैं ऐसा करता हूं, तो मैं निश्चित रूप से खरोंच से प्रत्येक ऑब्जेक्ट का निर्माण नहीं करूंगा क्योंकि यह बड़ी मात्रा में डुप्लिकेट कोड के साथ समाप्त होगा। इसके बजाय, एपीआई की संभावना है कि हम निजी वस्तुओं का उपयोग कर रहे हैं जो हम अपने आधार एपीआई के लिए उपयोग कर रहे हैं, लेकिन फिर हम उसी समस्या में भाग लेते हैं क्योंकि जोड़े गए संपत्तियां सार्वजनिक एपीआई में भी उपलब्ध होंगी जब उन्हें होना नहीं चाहिए।
तो क्या कुछ पवित्रता है जो आमतौर पर इस स्थिति पर लागू होती है? मुझे पता है कि कई सार्वजनिक सेवाएं जैसे कि Git for Windows एक संस्करणित API बनाए रखता है, लेकिन मुझे एक ऐसे आर्किटेक्चर की कल्पना करने में परेशानी हो रही है जो विभिन्न संस्करण विधियों और इनपुट / आउटपुट ऑब्जेक्ट्स को कवर करने वाले भारी मात्रा में डुप्लिकेट कोड के बिना इसका समर्थन करता है।
मुझे पता है कि जब सार्वजनिक एपीआई टूटना चाहिए तो कुछ संन्यास लेने की कोशिश जैसे अर्थ वर्जनिंग प्रोसेस । समस्या यह है कि ऐसा लगता है कि कई या अधिकांश परिवर्तनों को सार्वजनिक एपीआई को तोड़ने की आवश्यकता होती है यदि ऑब्जेक्ट अधिक अलग नहीं होते हैं, लेकिन मुझे ऐसा करने का एक अच्छा तरीका नहीं दिखता है जो कोड को दोहराए बिना।
I don't see a good way to do that without duplicating code
- आपका नया एपीआई हमेशा आपके पुराने एपीआई, या इसके विपरीत तरीकों को कॉल कर सकता है।