यह आपके प्रश्न के तहत मेरी प्रारंभिक टिप्पणी का अधिक सुव्यवस्थित प्रतिलेखन है। ओपी द्वारा पूछे गए प्रश्नों के उत्तर इस उत्तर के निचले भाग में मिल सकते हैं। कृपया उसी स्थान पर स्थित महत्वपूर्ण नोट भी देखें ।
आप वर्तमान में जो वर्णन कर रहे हैं, सिपो, एक डिज़ाइन पैटर्न है जिसे सक्रिय रिकॉर्ड कहा जाता है । सब कुछ के साथ, यहां तक कि यह भी प्रोग्रामर के बीच अपनी जगह पा गया है, लेकिन एक साधारण कारण, मापनीयता के लिए रिपॉजिटरी और डेटा मैपर पैटर्न के पक्ष में त्याग दिया गया है।
संक्षेप में, एक सक्रिय रिकॉर्ड एक वस्तु है, जो:
- आपके डोमेन में किसी ऑब्जेक्ट का प्रतिनिधित्व करता है (व्यावसायिक नियमों को शामिल करता है, जानता है कि ऑब्जेक्ट पर कुछ कार्यों को कैसे प्रबंधित किया जाए, जैसे कि आप उपयोगकर्ता नाम बदल सकते हैं और आगे नहीं कर सकते हैं),
- इकाई को पुनः प्राप्त करना, अद्यतन करना, सहेजना और हटाना जानता है।
आप अपने वर्तमान डिज़ाइन के साथ कई मुद्दों को संबोधित करते हैं और आपके डिज़ाइन की मुख्य समस्या को अंतिम, 6 ठी, बिंदु (अंतिम लेकिन कम से कम, मुझे लगता है) में संबोधित किया जाता है। जब आपके पास एक वर्ग होता है जिसके लिए आप एक कंस्ट्रक्टर डिजाइन कर रहे होते हैं और आपको यह भी नहीं पता होता है कि कंस्ट्रक्टर को क्या करना चाहिए, तो क्लास शायद कुछ गलत है। आपके मामले में वही हुआ।
लेकिन इकाई प्रतिनिधित्व और CRUD तर्क को दो (या अधिक) वर्गों में विभाजित करके डिज़ाइन को ठीक करना बहुत सरल है।
यह वही है जो आपका डिज़ाइन अब जैसा दिखता है:
Employee
- कर्मचारी संरचना (इसकी विशेषताओं) और इकाई को संशोधित करने के तरीके (यदि आप परिवर्तनशील तरीके से जाने का निर्णय लेते हैं) के बारे में जानकारी शामिल है Employee
, इकाई के लिए CRUD तर्क Employee
हैं, वस्तुओं की एक सूची वापस कर सकते हैं , Employee
जब आप चाहते हैं तब एक वस्तु को स्वीकार करता है। एक कर्मचारी को अपडेट करें, Employee
जैसे कि एक विधि के माध्यम से एकल वापस कर सकते हैंgetSingleById(id : string) : Employee
वाह, वर्ग बहुत बड़ा लगता है।
यह प्रस्तावित समाधान होगा:
Employee
- कर्मचारी संरचना (इसकी विशेषताओं) और इकाई को संशोधित करने के तरीकों के बारे में जानकारी शामिल है (यदि आप पारस्परिक तरीके से जाने का निर्णय लेते हैं)
EmployeeRepository
- इसमें Employee
इकाई के लिए CRUD तर्क होता है , Employee
वस्तुओं की एक सूची वापस कर सकता है , एक Employee
वस्तु को स्वीकार करता है जब आप एक कर्मचारी को अपडेट करना चाहते हैं, Employee
एक विधि के माध्यम से एकल वापस कर सकते हैं जैसेgetSingleById(id : string) : Employee
क्या आपने चिंताओं को अलग करने के बारे में सुना है ? नहीं, अब आप करेंगे। यह सिंगल रिस्पॉन्सिबिलिटी सिद्धांत का कम सख्त संस्करण है, जो कहता है कि एक वर्ग को वास्तव में केवल एक जिम्मेदारी होनी चाहिए, या अंकल बॉब के रूप में:
एक मॉड्यूल को बदलने का एक और केवल एक कारण होना चाहिए।
यह बिल्कुल स्पष्ट है कि अगर मैं स्पष्ट रूप से आपकी प्रारंभिक कक्षा को दो में विभाजित करने में सक्षम था, जिसमें अभी भी एक अच्छी तरह से गोल इंटरफ़ेस है, तो प्रारंभिक वर्ग शायद बहुत अधिक कर रहा था, और यह था।
रिपॉजिटरी पैटर्न के बारे में बहुत अच्छा है, यह न केवल डेटाबेस के बीच एक मध्य परत प्रदान करने के लिए एक अमूर्त के रूप में कार्य करता है (जो कुछ भी हो सकता है, फ़ाइल, noSQL, SQL, ऑब्जेक्ट-ओरिएंटेड), लेकिन इसके लिए एक ठोस होने की भी आवश्यकता नहीं है कक्षा। कई OO भाषाओं में, आप इंटरफ़ेस को वास्तविक interface
(या शुद्ध वर्चुअल विधि के साथ एक वर्ग यदि आप C ++ में हैं) के रूप में परिभाषित कर सकते हैं और फिर कई कार्यान्वयन कर सकते हैं।
यह पूरी तरह से निर्णय को बढ़ाता है कि क्या कोई रिपॉजिटरी आप का वास्तविक कार्यान्वयन है, जो कि वास्तव में interface
कीवर्ड के साथ एक संरचना पर निर्भर होकर इंटरफेस पर निर्भर है । और रिपॉजिटरी वास्तव में यह है कि, यह डेटा लेयर एब्स्ट्रैक्शन के लिए एक फैंसी शब्द है, अर्थात् आपके डोमेन और इसके विपरीत डेटा की मैपिंग।
इसे (कम से कम) दो वर्गों में अलग करने के बारे में एक और महान बात यह है कि अब Employee
वर्ग स्पष्ट रूप से अपने डेटा का प्रबंधन कर सकता है और इसे बहुत अच्छी तरह से कर सकता है, क्योंकि इसके लिए अन्य कठिन चीजों का ध्यान रखने की आवश्यकता नहीं है।
प्रश्न 6: तो नवनिर्मित Employee
वर्ग में निर्माणकर्ता को क्या करना चाहिए ? यह आसान है। यह तर्क लेना चाहिए, जांच लें कि क्या वे वैध हैं (जैसे कि एक उम्र नकारात्मक नहीं होनी चाहिए या नाम खाली नहीं होना चाहिए), डेटा अमान्य होने पर एक त्रुटि उठाएं और यदि मान्यता पारित हुई तो निजी चर को तर्क दें इकाई का। यह अब डेटाबेस के साथ संवाद नहीं कर सकता है, क्योंकि इसे बस यह पता नहीं है कि इसे कैसे करना है।
प्रश्न 4: सभी पर उत्तर नहीं दिया जा सकता है, आम तौर पर नहीं, क्योंकि उत्तर बहुत हद तक इस बात पर निर्भर करता है कि आपको वास्तव में क्या चाहिए।
प्रश्न 5: अब जब कि तुम दो भागों में फूला हुआ वर्ग अलग है, तो आप पर सीधे कई अद्यतन तरीकों हो सकता है Employee
वर्ग, जैसे changeUsername
, markAsDeceased
, के डेटा में हेरफेर होगा जो Employee
वर्ग केवल रैम में और उसके बाद आप इस तरह के रूप में एक विधि को लागू कर सकता registerDirty
से रिपॉजिटरी वर्ग को कार्य पैटर्न की इकाई , जिसके माध्यम से आप रिपॉजिटरी को बताएंगे कि इस ऑब्जेक्ट ने गुण बदल दिए हैं और आपको commit
विधि को कॉल करने के बाद अपडेट करने की आवश्यकता होगी ।
जाहिर है, एक अद्यतन के लिए एक वस्तु के लिए एक आईडी की आवश्यकता होती है और इस प्रकार पहले से ही बचाई जाती है, और यह मानदंड और मापदंड पूरा नहीं होने पर त्रुटि का पता लगाने के लिए भंडार है।
प्रश्न 3: यदि आप यूनिट ऑफ़ वर्क पैटर्न के साथ जाने का निर्णय लेते हैं, तो create
विधि अब होगी registerNew
। यदि आप नहीं करते हैं, तो मैं शायद इसके save
बजाय कहूंगा । एक रिपॉजिटरी का लक्ष्य डोमेन और डेटा लेयर के बीच एक अमूर्तता प्रदान करना है, इस वजह से मैं आपको सलाह दूंगा कि यह विधि (हो registerNew
या हो save
) Employee
ऑब्जेक्ट को स्वीकार करती है और यह रिपॉजिटरी इंटरफ़ेस को लागू करने वाली कक्षाओं तक है, जो विशेषताएँ वे इकाई से बाहर निकालने का फैसला करते हैं। संपूर्ण ऑब्जेक्ट को पास करना बेहतर है, इसलिए आपको कई वैकल्पिक मापदंडों की आवश्यकता नहीं है।
प्रश्न 2: दोनों विधियाँ अब रिपॉजिटरी इंटरफ़ेस का एक हिस्सा होंगी और वे एकल जिम्मेदारी सिद्धांत का उल्लंघन नहीं करती हैं। रिपॉजिटरी की जिम्मेदारी Employee
वस्तुओं के लिए सीआरयूडी संचालन प्रदान करना है, यही वह करता है (इसके अलावा पढ़ें और हटाएं, सीआरयूडी क्रिएट और अपडेट दोनों में अनुवाद करता है)। जाहिर है, आप आगे EmployeeUpdateRepository
और पीछे होने से भी रिपॉजिटरी को विभाजित कर सकते हैं, लेकिन इसकी शायद ही कभी आवश्यकता होती है और एक एकल कार्यान्वयन में आमतौर पर सभी सीआरयूडी ऑपरेशन शामिल हो सकते हैं।
प्रश्न 1: आपने एक साधारण Employee
वर्ग के साथ समाप्त किया जो अब (अन्य विशेषताओं के बीच) आईडी होगा। क्या आईडी भरी हुई है या खाली है (या null
) इस बात पर निर्भर करती है कि वस्तु पहले से ही बचाई गई है या नहीं। फिर भी, एक आईडी अभी भी एक विशेषता है जो इकाई का मालिक है और इकाई की जिम्मेदारी Employee
इसकी विशेषताओं का ध्यान रखना है, इसलिए इसकी आईडी का ख्याल रखना है।
एक इकाई के पास एक आईडी है या नहीं, आमतौर पर इससे कोई फर्क नहीं पड़ता कि आप उस पर कुछ दृढ़ता-तर्क करने की कोशिश करते हैं। जैसा कि प्रश्न 5 के उत्तर में उल्लेख किया गया है, यह पता लगाने के लिए रिपॉजिटरी की ज़िम्मेदारी है कि आप किसी ऐसी इकाई को बचाने की कोशिश नहीं कर रहे हैं जो पहले से ही बच गई है या बिना आईडी के किसी इकाई को अपडेट करने की कोशिश कर रही है।
महत्वपूर्ण लेख
कृपया ध्यान रखें कि हालांकि चिंताओं को अलग करना महान है, वास्तव में एक कार्यात्मक रिपॉजिटरी परत डिजाइन करना काफी थकाऊ काम है और मेरे अनुभव में सक्रिय रिकॉर्ड दृष्टिकोण की तुलना में सही होना थोड़ा मुश्किल है। लेकिन आप एक डिजाइन के साथ समाप्त होंगे जो कहीं अधिक लचीला और स्केलेबल है, जो एक अच्छी बात हो सकती है।
Employee
अमूर्तता प्रदान करने के लिए एक वस्तु लेनी चाहिए , प्रश्न 4. और 5. आम तौर पर अचूक होते हैं, आपकी आवश्यकताओं पर निर्भर करते हैं, और यदि आप संरचना और सीआरयूडी के संचालन को दो वर्गों में अलग करते हैं, तो यह काफी स्पष्ट है,Employee
डेटा का निर्माता डेटा प्राप्त नहीं कर सकता है db से और अधिक, ताकि उत्तर ६.