ऑब्जेक्ट ओरिएंटेशन विशेष रूप से मूल्यवान है क्योंकि इस प्रकार के परिदृश्य उत्पन्न होते हैं, और यह आपको उपकरण को यथोचित डिज़ाइन करने के लिए उपकरण देता है जो आपको जटिलता को घेरने की अनुमति देता है।
यहाँ असली सवाल यह है कि आप उस जटिलता को कहाँ तक सीमित करते हैं?
इसलिए मुझे एक पल के लिए पीछे हटने दें और बोलें कि मैं यहां किस जटिलता का उल्लेख कर रहा हूं। आपकी समस्या (जैसा कि मैं इसे समझता हूं; अगर मैं गलत हूं तो मुझे सुधारें) एक दृढ़ता मॉडल है जो उन कार्यों के लिए एक प्रभावी रूप से उपयोग करने योग्य मॉडल नहीं है जिन्हें आपको डेटा के साथ पूरा करने की आवश्यकता है। यह अन्य कार्यों के लिए प्रभावी और उपयोगी हो सकता है, लेकिन आपके कार्यों के लिए नहीं ।
तो हम क्या करते हैं जब हमारे पास डेटा होता है जो हमारे साधनों के लिए एक अच्छा मॉडल पेश नहीं करता है?
अनुवाद करना। यह केवल एक चीज है जो आप कर सकते हैं। वह अनुवाद 'जटिलता' है जिसका मैं ऊपर उल्लेख करता हूं। इसलिए अब जब हम स्वीकार करते हैं कि हम मॉडल का अनुवाद करने जा रहे हैं, तो हमें कुछ कारकों पर निर्णय लेने की आवश्यकता है।
क्या हमें दोनों दिशाओं का अनुवाद करने की आवश्यकता है? क्या दोनों दिशाओं का अनुवाद उसी तरह किया जाएगा, जैसे कि:
(Tbl A, Tbl B) -> ओबज एक्स (पढ़ें)
ओब्ज एक्स -> (टैबल ए, टैबल बी) (लिखें)
या सम्मिलन / अपडेट / डिलीट गतिविधियां एक अलग प्रकार की वस्तु का प्रतिनिधित्व करती हैं जैसे कि आप डेटा को ओब्ज एक्स के रूप में पढ़ते हैं, लेकिन ओबज वाई से डेटा डाला / अपडेट किया गया है? आप इन दोनों में से किस तरीके से जाना चाहते हैं, या यदि कोई अपडेट / इंसर्ट / डिलीट संभव नहीं है तो महत्वपूर्ण कारक हैं जहाँ आप अनुवाद करना चाहते हैं।
आप कहाँ अनुवाद करते हैं?
इस उत्तर में मेरे द्वारा दिए गए पहले कथन पर वापस; OO आपको जटिलता को एनकैप्सुलेट करने की अनुमति देता है और मैं यहां जो भी संदर्भित करता हूं वह तथ्य यह है कि न केवल आपको होना चाहिए , लेकिन आपको उस जटिलता को एनकैप्सुलेट करना होगा यदि आप यह सुनिश्चित करना चाहते हैं कि यह आपके सभी कोड में लीक न हो जाए और रिस न जाए। एक ही समय में, यह पहचानना महत्वपूर्ण है कि आपके पास एक सटीक अमूर्तता नहीं हो सकती है इसलिए इसके बारे में कम चिंता करना एक बहुत प्रभावी और उपयोगी होने की तुलना में।
अब फिर से; आपकी समस्या यह है: आप इस जटिलता को कहाँ रखते हैं? वैसे आपके पास विकल्प हैं।
आप इसे संग्रहीत प्रक्रियाओं का उपयोग करके डेटाबेस में कर सकते हैं । यह अक्सर ORMs के साथ बहुत अच्छा नहीं खेलने का दोष है, लेकिन यह हमेशा सच नहीं होता है। संग्रहीत कार्यविधियाँ कुछ लाभों को वहन करती हैं, जिनमें अक्सर प्रदर्शन भी शामिल है। संग्रहीत प्रक्रियाओं को हालांकि बहुत अधिक रखरखाव की आवश्यकता हो सकती है, लेकिन यह आपके ऊपर है कि आप अपने विशेष परिदृश्य का विश्लेषण करें और कहें कि क्या रखरखाव अन्य विकल्पों की तुलना में अधिक या कम होगा। मैं व्यक्तिगत रूप से संग्रहीत प्रक्रियाओं के साथ बहुत कुशल हूं, और इस तरह के रूप में उपलब्ध प्रतिभा का यह तथ्य ओवरहेड को कम करता है; तुम क्या के आधार पर निर्णय लेने के मूल्य कम कभी नहीं करते हैं पता है। कभी-कभी सही समाधान की तुलना में उप-अपनाने वाला समाधान अधिक इष्टतम हो सकता है क्योंकि आप या आपकी टीम यह जानती है कि इसे इष्टतम समाधान से बेहतर कैसे बनाया और बनाए रखा जा सकता है।
एक अन्य डेटाबेस विकल्प विचार है। आपके डेटाबेस सर्वर के आधार पर ये अत्यधिक इष्टतम या उप-इष्टतम हो सकते हैं या बिल्कुल भी प्रभावी नहीं हो सकते हैं, आपके डेटाबेस में अनुक्रमित विकल्प क्या उपलब्ध हैं, इसके आधार पर कमियों में से एक क्वेरी बार हो सकती है। यदि आपको कभी भी कोई डेटा संशोधन (इन्सर्ट / अपडेट / डिलीट) करने की आवश्यकता न हो तो व्यू और भी बेहतर विकल्प बन जाता है।
डेटाबेस से आगे बढ़ते हुए आपके पास रिपॉजिटरी पैटर्न का उपयोग करने का पुराना स्टैंडबाय है। यह एक समय-परीक्षण दृष्टिकोण है जो बहुत प्रभावी हो सकता है। कमियां बॉयलर प्लेट को शामिल करने के लिए होती हैं लेकिन अच्छी तरह से फैली हुई रिपॉजिटरी इसमें से कुछ राशि से बच सकती हैं, और यहां तक कि जब ये बॉयलर प्लेट की दुर्भाग्यपूर्ण मात्रा में परिणाम करते हैं, तो रिपॉजिटरी की सरल कोड होने की प्रवृत्ति है जो एक अच्छा एपीआई पेश करने के साथ-साथ समझने और बनाए रखने में आसान है। / अमूर्त। इसके अलावा रिपॉजिटरी उनकी यूनिट-टेस्टिबिलिटी के लिए अच्छी हो सकती है, जिसे आप इन-डेटाबेस विकल्पों के साथ खो देते हैं।
ऑटो-मैपर जैसे उपकरण हैं जो ORM का उपयोग कर सकते हैं, जहाँ वे डेटाबेस-मॉडल के बीच का अनुवाद orm से प्रयोग करने योग्य मॉडल में कर सकते हैं, लेकिन इनमें से कुछ उपकरण जादू की तरह अधिक व्यवहार को बनाए रखने / समझने के लिए मुश्किल हो सकते हैं; हालांकि वे ओवरहेड कोड का एक न्यूनतम बनाते हैं जिसके परिणामस्वरूप कम रखरखाव ओवरहेड जब अच्छी तरह से समझा जाता है।
आगे आप डेटाबेस से आगे और आगे बढ़ रहे हैं , जिसका अर्थ है कि अन-ट्रांसलेट किए गए दृढ़ता मॉडल से निपटने के लिए अधिक मात्रा में कोड होना चाहिए, जो वास्तव में अप्रिय होने वाला है। इन परिदृश्यों में आप अपने यूआई में अनुवाद की परत डालने के बारे में बात करते हैं जो ऐसा लगता है कि आप अभी कर रहे हैं। यह आम तौर पर एक बहुत बुरा विचार है, और समय के साथ बहुत कम हो जाता है।
अब बात शुरू करते हैं पागल की ।
Object
केवल अंत सब हो-सब अमूर्त कि मौजूद नहीं है। कंप्यूटर विज्ञान का अध्ययन और गणित के अध्ययन से पहले भी कई वर्षों में विकसित किए गए अमूर्तता की प्रचुरता है। यदि हम रचनात्मक होना शुरू करने जा रहे हैं, तो आइए उन उपलब्ध अमूर्तियों के बारे में बात करना शुरू करें, जिनका अध्ययन किया गया है।
एक्टर मॉडल है।यह एक दिलचस्प दृष्टिकोण है क्योंकि यह कहता है कि आप सभी करते हैं दूसरे कोड को संदेश भेजते हैं जो प्रभावी रूप से उस कोड को सभी काम को सौंपता है, जो आपके सभी कोड से जटिलता को दूर करने में बहुत प्रभावी है। यह तब तक काम कर सकता है जब तक आप एक अभिनेता को संदेश भेजते हुए कहते हैं कि "मुझे ओबज एक्स को वाई को भेजे जाने की आवश्यकता है" और आपके पास स्थान वाई पर प्रतिक्रिया की प्रतीक्षा में एक रिसेप्शन है जो ओबज एक्स को संसाधित करता है। आप एक संदेश भी भेज सकते हैं जो निर्देश देता है "मुझे ओबज एक्स और कम्प्यूटेशन वाई, जेड की जरूरत है" और फिर आपको इंतजार करने की भी जरूरत नहीं है; अनुवाद उस संदेश पास के दूसरी तरफ होता है और आप इसे तभी आगे बढ़ा सकते हैं जब आपको इसके परिणाम के बारे में पढ़ने की आवश्यकता न हो। यह आपके उद्देश्यों के लिए अभिनेता मॉडल का मामूली दुरुपयोग हो सकता है, लेकिन यह सब निर्भर करता है;
एक और एनकैप्सुलेशन सीमा प्रक्रिया सीमाएं हैं। ये बहुत प्रभावी ढंग से जटिलता को अलग करने के लिए इस्तेमाल किया जा सकता है। आप अनुवाद कोड को एक वेब सेवा के रूप में बना सकते हैं, जहां संचार सरल HTTP है, SOAP, REST का उपयोग करके, या यदि आप वास्तव में अपना स्वयं का प्रोटोकॉल चाहते हैं (सुझाव नहीं दिया गया है)। STOMP पूरी तरह से एक बुरा नया प्रोटोकॉल नहीं है। या आपके द्वारा चुने गए जो भी प्रोटोकॉल का उपयोग करते हुए बहुत जल्दी फिर से संचार करने के लिए एक सिस्टम-स्थानीय प्रचारित मेमोरी पाइप के साथ एक सामान्य डेमन सेवा का उपयोग करें। यह वास्तव में कुछ बहुत अच्छे लाभ हैं:
- आपके पास कई प्रक्रियाएं चल सकती हैं जो पुराने और नए संस्करण के लिए एक ही समय में अनुवाद का समर्थन करती हैं और आपको ऑब्जेक्ट मॉडल V2 को प्रचारित करने के लिए अनुवाद सेवा को अपडेट करने की अनुमति देती हैं, और फिर बाद में अलग से नई वस्तु के साथ काम करने के लिए उपभोग कोड को अपडेट करते हैं। नमूना।
- आप प्रदर्शन के लिए प्रक्रिया को एक कोर में पिन करने जैसी दिलचस्प चीजें कर सकते हैं, आपको इस दृष्टिकोण में सुरक्षा सुरक्षा की एक मात्रा भी मिलती है जिससे यह सुनिश्चित होता है कि उस डेटा को छूने के लिए सुरक्षा विशेषाधिकारों के साथ चलने वाली एकमात्र प्रक्रिया है।
- जब आप प्रक्रिया सीमाओं के बारे में बात कर रहे हैं तो आपको एक बहुत मजबूत सीमा मिल जाएगी, जो लंबे समय तक आपके अमूर्त के न्यूनतम रिसाव को सुनिश्चित करने के लिए स्थिर रहेगी क्योंकि अनुवाद स्थान में कोड लिखना अनुवाद स्थान के बाहर नहीं बुलाया जा सकेगा क्योंकि वे अनुबंध द्वारा उपयोग परिदृश्यों के एक निश्चित सेट को सुनिश्चित करते हुए, प्रक्रिया की गुंजाइश साझा नहीं की जाएगी।
- अतुल्यकालिक / गैर-अवरुद्ध अपडेट के लिए योग्यता सरल हो रही है।
कमियां स्पष्ट रूप से अधिक रखरखाव की तुलना में आवश्यक हैं, संचार ओवरहेड प्रदर्शन और रखरखाव को प्रभावित करता है।
जटिलता को घेरने के कई तरीके हैं जो आपके सिस्टम में उस जटिलता को कभी भी अधिक अजीब और उत्सुक स्थानों में रखने की अनुमति दे सकते हैं। उच्च आदेश कार्यों के रूपों का उपयोग करना (अक्सर रणनीति पैटर्न या ऑब्जेक्ट पैटर्न के विभिन्न अन्य विषम रूपों का उपयोग करके नकली), आप कुछ बहुत ही दिलचस्प चीजें कर सकते हैं।
यह सही है, चलो एक साधु के बारे में बात करना शुरू करते हैं। आप इस अनुवाद परत को छोटे विशिष्ट कार्यों के एक बहुत ही स्वतंत्र तरीके से बना सकते हैं जो स्वतंत्र अनुवाद आवश्यक करते हैं, लेकिन उन सभी अनुवाद कार्यों को छिपाते हैं जो दिखाई नहीं देते हैं, इसलिए वे बाहरी कोड तक शायद ही पहुंचते हैं। इससे उन पर निर्भरता को कम करने का लाभ मिलता है, जिससे वे बाहरी कोड को प्रभावित किए बिना आसानी से बदल सकते हैं। आप तब एक वर्ग बनाते हैं जो उच्च क्रम के कार्यों को स्वीकार करता है (अनाम फ़ंक्शंस, लैम्ब्डा फ़ंक्शंस, रणनीति ऑब्जेक्ट, हालांकि आपको उन्हें संरचना करने की आवश्यकता होती है) जो किसी भी अच्छे ओओ मॉडल प्रकार की वस्तुओं पर काम करते हैं। फिर आप अंतर्निहित कोड को उन कार्यों को स्वीकार करते हैं जो उपयुक्त अनुवाद विधियों का उपयोग करके शाब्दिक निष्पादन करते हैं।
यह एक सीमा बनाता है जहां सभी अनुवाद न केवल आपके सभी कोड से दूर सीमा के दूसरी तरफ मौजूद हैं ; इसका उपयोग केवल उस पक्ष के लिए किया जाता है, जिससे आपके बाकी कोड को इसके बारे में कुछ भी पता नहीं चल सके कि उस सीमा के लिए प्रवेश बिंदु कहां है।
ठीक है, हाँ जो वास्तव में पागल बात कर रहा है, लेकिन कौन जानता है; आप बस पागल हो सकते हैं (गंभीरता से, 88% से कम पागलपन की रेटिंग के साथ भिक्षुओं का कार्य न करें, शारीरिक चोट का वास्तविक जोखिम है)।