क्या हठ-अज्ञान वस्तुएं आलसी लोडिंग को लागू करने में सक्षम हैं?


12

दृढ़ता अज्ञानता एकल जिम्मेदारी सिद्धांत का एक अनुप्रयोग है, जिसका अर्थ है कि डोमेन ऑब्जेक्ट्स ( डीओ ) में दृढ़ता से संबंधित कोड नहीं होना चाहिए, इसके बजाय उन्हें केवल डोमेन तर्क होना चाहिए।

a) मेरा यह अर्थ है कि कोड जो निचली परतों (यानी दृढ़ता परतों) से संपर्क करता है , वह व्यवसाय तर्क परत के अन्य वर्गों ( OC ) में डोमेन मॉडल के बाहर रहता है ?

बी) अगर मेरी धारणा एक के तहत सही है, तो डीओ , कहते हैं Customer, कभी भी इस तरह के तरीके शामिल नहीं हैं GetCustomersया GetCustomerByID?

c) यदि a और b) के तहत मेरी धारणाएं सही हैं, और मान लिया गया है कि Customerडोमेन ऑब्जेक्ट अपने कुछ गुणों के लिए आलसी लोडिंग का उपयोग करता है, तो कुछ बिंदु पर Customerआंतरिक तर्क OC से संपर्क करना चाहिए , जो बदले में हटाए गए डेटा को पुनः प्राप्त करता है। लेकिन अगर डेटा को प्राप्त करने के लिए OCCustomer से संपर्क करने की आवश्यकता है , तो हम वास्तव में यह दावा नहीं कर सकते कि डोमेन ऑब्जेक्ट्स में दृढ़ता से संबंधित तर्क नहीं हैं।

धन्यवाद

Jkohlhepp के लिए प्रतिक्रिया

1) मुझे लगता है OrderProviderऔर CustomerProviderकक्षाएं व्यापार तर्क परत के भीतर निहित हैं?

2) मैं आपके जवाब से इकट्ठा करता हूं कि बी के तहत मेरी धारणाएं सही हैं?

3)

... मैं यह देखने के लिए जाँच करूंगा कि क्या कुछ निजी आदेश क्षेत्र आबाद थे या यदि यह शून्य था। यदि यह अशक्त है ...

लेकिन जहां तक ​​मैं बता सकता हूं, जैसे ही डोमेन कोड को यह जांचने की आवश्यकता है कि क्या निजी orderक्षेत्र आबाद था, और यदि यह नहीं है, तो ऑर्डरप्रोवीडर से संपर्क करें, हम पहले से ही पीआई सिद्धांत का उल्लंघन कर रहे हैं ?!

जवाबों:


4

मेरा मानना ​​है कि आप अपनी मान्यताओं ए और बी में दृढ़ता अज्ञान के आसपास सही हैं।

आप सबसे अच्छी तरह से डेटाबेस ऑब्जेक्ट्स के आलसी लोडिंग को कैसे पूरा करेंगे, यह आपकी विशेष समस्या और कार्यान्वयन पर निर्भर करता है। हालाँकि, मैं एक सामान्य उत्तर देने का प्रयास करूंगा कि कैसे आलसी लोडिंग करना है जबकि अभी भी दृढ़ता और डोमेन तर्क वर्गों के बीच चिंताओं को अलग करना है।

मैं निम्नलिखित वर्गों का उपयोग करते हुए दृढ़ता अज्ञान को लागू करता हूं:

  • डोमेन कक्षाएं - जैसे ग्राहक
  • प्रदाता / रिपॉजिटरी कक्षाएं - उदाहरण के लिए CustomerProvider
  • जेनेरिक डेटाबेस क्वेरी क्लासेस - जैसे डेटाबेसकाम

डेटाबेस क्वेरी डेटाबेस का उपयोग करने के लिए डेटाबेसविकल्पी वर्ग के लिए ज़िम्मेदार होगा और परिणामी डेटा को डेटाटेबल जैसे सामान्य परिणाम में इकट्ठा करेगा। CustomerProvider डेटाबेस के खिलाफ SQL को निष्पादित करने के लिए DatabaseQuery वर्ग का उपयोग करने और ग्राहक के उदाहरणों को इकट्ठा करने के लिए उस SQL ​​के परिणामों का उपयोग करने के लिए जिम्मेदार होगा। ग्राहक "शुद्ध" डोमेन ऑब्जेक्ट होगा जिसमें ग्राहकों से संबंधित डेटा और तर्क शामिल थे।

इस बात के लिए कि क्या प्रदाता वर्ग बिजनेस टियर या डेटा टियर में होना चाहिए, मेरे पास एक मजबूत राय नहीं है। मैं दोनों के लिए मामला देख सकता हूं। महत्वपूर्ण हिस्सा यह है कि आप कक्षाओं में जिम्मेदारियों को अलग कर देते हैं।

तो अब आलसी लोडिंग पर चर्चा करते हैं। मान लीजिए कि मैं चाहता था कि ग्राहक के पास आदेशों का संग्रह हो, लेकिन मैं तब तक डेटाबेस से आदेशों को नहीं निकालना चाहता जब तक कि उपभोक्ता उन तक पहुँचने की कोशिश न करे। मैं कस्टमर नामक एक संपत्ति बनाऊंगा। उस संपत्ति के प्राप्तकर्ता में, मैं यह देखने के लिए जाँच करूंगा कि क्या कुछ निजी आदेश क्षेत्र आबाद थे या यदि यह शून्य था। यदि यह शून्य है, तो ऑर्डरपॉइडर का उपयोग करके डेटाबेस से ऑर्डर लोड करें। अन्यथा, केवल उस संग्रह को लौटाएं जो पहले से लोड था।

मेरी राय में, ग्राहक के लिए ऑर्डरप्रोवीडर से संपर्क करने की आवश्यकता पीआई का उल्लंघन नहीं करती है। ग्राहक को अभी भी नहीं पता है कि उसे कैसे ऑर्डर मिलते हैं। यह सिर्फ यह जानता है कि यह उन्हें ऑर्डरप्रोइडर से मिलता है। ऑर्डरप्रोइडर से ग्राहक को हटाने के अन्य कारण हो सकते हैं, लेकिन मुझे नहीं लगता कि पीआई यहां कोई समस्या है।

यह मानता है कि आप मैन्युअल रूप से अज्ञानता कर रहे हैं। यदि आप एक ORM फ्रेमवर्क जैसे कि Entity Framework या Hibernate का उपयोग कर रहे हैं, तो उन फ्रेमवर्क में आमतौर पर स्वचालित रूप से आलसी लोडिंग का समर्थन करने की विशेषताएं होती हैं।


नमस्ते, यदि आप समय पाते हैं - मैंने आपके उत्तर के उत्तर में अपना पोस्ट संपादित किया है
user1483278

1
@ user1483278 मैंने उन सवालों को उम्मीद से संबोधित करने के लिए अपना जवाब संपादित किया।
रेशनलगीक

पीआई किस लिए खड़ा है?
कुगेल

दृढ़ता अज्ञानता
RationalGeek

2

आपके पास बस कुछ वायरअप क्लास है जो डोमेन ऑब्जेक्ट्स को पॉप्युलेट करता है (कहते हैं, "रिपॉजिटरी" नामक कुछ)। आप आलसी लोडिंग को लागू कर सकते हैं या आप जिस तरह की कैश सुसंगतता योजना चाहते हैं और डोमेन ऑब्जेक्ट कोई भी समझदार नहीं हैं। आप डोमेन ऑब्जेक्ट्स को डोमेन ऑब्जेक्ट्स से पॉप्युलेट करने की जिम्मेदारी को अलग कर रहे हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.