क्या कमांड / क्वेरी पृथक्करण एक ऐसी विधि पर लागू होता है जो एक वस्तु बनाता है और अपनी आईडी लौटाता है?


12

चलो दिखावा करते हैं हमारे पास एक सेवा है जो एक व्यवसाय प्रक्रिया को बुलाती है। यह प्रक्रिया डेटाबेस में टाइप ए की वस्तु बनाने के लिए डेटा लेयर पर कॉल करेगी।

बाद में हमें डेटाबेस में टाइप बी का एक उदाहरण बनाने के लिए डेटा परत के दूसरे वर्ग पर फिर से कॉल करने की आवश्यकता है। हमें विदेशी कुंजी के लिए ए के बारे में कुछ जानकारी पारित करने की आवश्यकता है।

पहली विधि में हम एक ऑब्जेक्ट बनाते हैं (राज्य को संशोधित करते हैं) और एक ही विधि में यह आईडी (क्वेरी) लौटाते हैं।

दूसरी विधि में हमारे पास दो तरीके हैं, एक (createA) सेव के लिए और दूसरा (getId) क्वेरी के लिए।

    public void FirstMethod(Info info)
    {
        var id = firstRepository.createA(info);           
        secondRepository.createB(id);
    }

    public void SecondMethod(Info info)
    {
        firstRepository.createA(info);
        var key = firstRepository.getID(info);
        secondRepository.createB(key);
    }

मेरी समझ से दूसरा तरीका कमांड क्वेरी अलगाव को पूरी तरह से अलग करता है। लेकिन मुझे लगता है कि हमने अभी जो वस्तु बनाई है, उसे प्राप्त करने के लिए डेटाबेस को क्वेरी करना बेकार और जवाबी-सहज है।

आप ऐसे परिदृश्य के साथ CQS को कैसे सामंजस्य स्थापित करते हैं?

क्या केवल दूसरी विधि CQS का अनुसरण करती है और यदि ऐसा है तो क्या इस मामले में इसका उपयोग करना बेहतर है?


2
यदि A और B किसी भी आवृत्ति के साथ मिलकर बनाए जाते हैं, तो मैं शायद एक संग्रहीत प्रक्रिया बनाऊंगा, दोनों को एक साथ बनाऊंगा, और फिर आप उन समस्याओं के होने पर B के बिना पहले B या A निर्मित किए जाने की क्षमता को काट देंगे।
रायथल

एक आउट पैरामीटर का उपयोग करने के विकल्प की पेशकश करने के लिए खेल में देर से कदम रखना। यह तकनीकी रूप से रिटर्न वैल्यू नहीं है! ;)

जवाबों:


13

CQS एक निरपेक्ष नियम के बजाय एक दिशानिर्देश है। सख्त क्यूक्यूएस के तहत असंभव गतिविधियों के उदाहरणों के लिए विकी लेख देखें ।

हालाँकि, इस मामले में, यदि आप CQS को बनाए रखना चाहते हैं, तो आप क्लाइंट साइड पर ID बना सकते हैं (जैसे GUID), या क्लाइंट किसी भी ऑब्जेक्ट को बनाने से पहले सिस्टम से आईडी के लिए अनुरोध कर सकता है, जो क्लीनर महसूस करता है मुझे ऑब्जेक्ट बनाने के बाद इसके लिए क्वेरी करना (लेकिन सिर्फ एक पहचान कॉलम का उपयोग करने की तुलना में कठिन है)।

व्यक्तिगत रूप से मैं सिर्फ आईडी वापस करूंगा और इसे उन स्थितियों में से एक कहूंगा जहां सीक्यूएस एक अच्छा फिट नहीं है।

उदाहरणों के साथ एक और अच्छा लेख: मार्टिन फाउलर


3

यदि आप एक कार्यप्रणाली का पालन करते हैं और यह आपको बुरे रास्तों पर ले जाती है, तो आपको इसका मूल्यांकन करना चाहिए।

मैं देखता हूं कि एक नए बनाए गए ऑब्जेक्ट का पहचानकर्ता एक रिटर्न पैरामीटर के रूप में होने के लिए एक मान्य चीज है - यह सिर्फ सुविधाजनक नहीं है, लेकिन यह "अच्छा" भी है - जैसा कि आप देख सकते हैं कि कोड ऐसा होने पर बेहतर है।

किसी भी मामले में, मैं "कमांड क्वेरी पृथक्करण" से परिचित नहीं हूं, लेकिन मुझे बहुत संदेह है कि यह कमांड निष्पादन के बारे में जानकारी लौटने से आदेशों को अस्वीकार कर देता है, और अगर यह करता है, तो इसे रद्दी करें- सफलता / विफलता हमेशा होती है, और मैं करता हूं यह मत सोचिए कि "आपकी वस्तु ठीक है" से "आपकी वस्तु ठीक से बनाई गई है और इसकी आईडी xxx है" बहुत अलग है।


-1

केवल दूसरी विधि CQS का अनुसरण करती है।

मैं सीक्यूएस को अच्छी कोडिंग प्रथाओं को प्रोत्साहित करने के लिए एक दिशानिर्देश मानता हूं। विकास के दौरान अच्छी कोडिंग प्रथाओं का उपयोग करें, और यदि आपको बाद में पता चले कि इस पद्धति में संसाधन-महत्वपूर्ण कोड है, तो भी आप इसे अनुकूलित कर सकते हैं।

सभी बुराईयो की जड़ समयपूर्व इष्टतमीकरण है :)


दूसरी विधि में क्या विशेष रूप से अच्छा है?
CheatEx

मैंने यह नहीं कहा कि दूसरी विधि 'अच्छी' है। मैंने कहा कि यह CQS प्रतिमान का अनुसरण करता है। यदि आप CQS का पालन नहीं करते हैं, तो मुझे लगता है कि दूसरा तरीका आपके लिए अच्छा नहीं है। यदि आप जानना चाहते हैं कि कुछ लोग
क्यूक्यूएस

आपने कहा कि CQS अच्छी कोडिंग प्रथाओं को प्रोत्साहित कर रहा है, अगर यह सच है तो हमें दूसरी विधि में किसी प्रकार की "अच्छाई" का पालन करना चाहिए। कहाँ है?
CheatEx

जाहिरा तौर पर आपने मेरे द्वारा दिए गए लिंक को नहीं पढ़ा। सीक्यूएस कैच-वाक्यांश: प्रश्न पूछने से उत्तर नहीं बदलना चाहिए । आपकी पहली विधि में, आपके पास एक विधि ('createA') है जो एक 'उत्तर' प्रदान करता है, लेकिन यह हर बार आपके द्वारा पूछे जाने वाले उत्तर को बदल देता है। दूसरी विधि में आपके पास वह नहीं है, यह उसमें 'अच्छाई' है। स्पष्ट होने के लिए: मैं कोई CQS शुद्धतावादी नहीं हूं, मैं हर बार इसका पालन नहीं करता।
चीजस का कहना है कि
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.