मान लें कि आपके पास कुछ प्रकार की डेटा संरचना है, जो किसी प्रकार के डेटाबेस में बनी रहती है। सरलता के लिए, आइए इस डेटा संरचना को कॉल करें Person
। अब आपको एक CRUD API डिज़ाइन करने का काम सौंपा गया है, जो अन्य एप्लिकेशन को s बनाने, पढ़ने, अपडेट करने और डिलीट करने की अनुमति देता है Person
। सरलता के लिए, मान लेते हैं कि यह API किसी प्रकार की वेब सेवा के माध्यम से एक्सेस किया गया है।
सीआरयूडी के सी, आर और डी भागों के लिए, डिजाइन सरल है। मैं C # की तरह कार्यात्मक संकेतन का उपयोग करूंगा - कार्यान्वयन SOAP, REST / JSON, या कुछ और हो सकता है:
class Person {
string Name;
DateTime? DateOfBirth;
...
}
Identifier CreatePerson(Person);
Person GetPerson(Identifier);
void DeletePerson(Identifier);
अपडेट के बारे में क्या? करने के लिए स्वाभाविक बात होगी
void UpdatePerson(Identifier, Person);
लेकिन आप यह कैसे निर्दिष्ट करेंगे कि कौन से क्षेत्र Person
अपडेट करें?
समाधान है कि मैं के साथ आ सकता है:
आपको हमेशा एक पूर्ण व्यक्ति को पारित करने की आवश्यकता हो सकती है, अर्थात ग्राहक जन्म तिथि को अद्यतन करने के लिए कुछ इस तरह करेगा:
p = GetPerson(id); p.DateOfBirth = ...; UpdatePerson(id, p);
हालाँकि, इसके लिए किसी प्रकार की लेन-देन और अद्यतन के बीच लेन-देन की निरंतरता या लॉकिंग की आवश्यकता होगी; अन्यथा, आप कुछ अन्य क्लाइंट द्वारा समानांतर में किए गए कुछ अन्य परिवर्तन को अधिलेखित कर सकते हैं। यह एपीआई को और अधिक जटिल बना देगा। इसके अलावा, यह त्रुटि प्रवण है, चूंकि निम्नलिखित छद्म कोड (JSON समर्थन के साथ एक ग्राहक भाषा मानकर)
UpdatePerson(id, { "DateOfBirth": "2015-01-01" });
- जो सही दिखता है - वह न केवल DateOfBirth को बदल देगा, बल्कि अन्य सभी फ़ील्ड्स को शून्य करने के लिए रीसेट कर देगा।
आप सभी क्षेत्रों की उपेक्षा कर सकते हैं
null
। हालाँकि, आप तब कैसे नहीं बदलनेDateOfBirth
और जानबूझकर इसे शून्य में बदलने के बीच अंतर करेंगे ?हस्ताक्षर को बदलें
void UpdatePerson(Identifier, Person, ListOfFieldNamesToUpdate)
।हस्ताक्षर को बदलें
void UpdatePerson(Identifier, ListOfFieldValuePairs)
।ट्रांसमिशन प्रोटोकॉल की कुछ विशेषता का उपयोग करें: उदाहरण के लिए, आप सभी क्षेत्रों को अनदेखा कर सकते हैं जो व्यक्ति के JSON प्रतिनिधित्व में निहित नहीं हैं। हालाँकि, आमतौर पर JSON को स्वयं पार्स करने की आवश्यकता होती है और आपकी लाइब्रेरी की अंतर्निहित सुविधाओं (जैसे WCF) का उपयोग करने में सक्षम नहीं होता है।
कोई भी समाधान मुझे वास्तव में सुरुचिपूर्ण नहीं लगता। निश्चित रूप से, यह एक सामान्य समस्या है, इसलिए हर किसी के द्वारा उपयोग किया जाने वाला सबसे अच्छा अभ्यास क्या है?
Person
उदाहरणों के लिए जो अभी भी कायम नहीं हैं, और मामले में पहचानकर्ता को दृढ़ता तंत्र के हिस्से के रूप में तय किया जाता है, बस इसे शून्य करने के लिए छोड़ दें। जवाब के लिए, जेपीए एक संस्करण संख्या का उपयोग करता है; यदि आप संस्करण 23 को पढ़ते हैं, जब आप आइटम को अपडेट करते हैं यदि DB में संस्करण 24 है तो लेखन विफल हो जाता है।