क्या किसी विधि की पैरामीटर सूची में ऑब्जेक्ट या ऑब्जेक्ट पहचानकर्ता शामिल होने चाहिए?


10

हमारी टीम निम्नलिखित चर्चा कर रही है:

मान लें कि हमारे पास दो तरीके हैं:

public Response Withdraw(int clubId, int terminalId,int cardId, string invoice, decimal amount);

public Response Withdraw(Club club, Terminal terminal,Card card, string invoice, decimal amount);

क्या भेजे गए तार केवल आईडी हैं।

एक पक्ष कहता है कि पहला तरीका सही है, क्योंकि हमारे पास केवल टर्मिनल और क्लब की आईडी हैं, और यह स्पष्ट होना चाहिए कि हमारे पास और कुछ नहीं है, यह मेरा दृष्टिकोण है।

दूसरा पक्ष कहता है कि दूसरा तरीका सही है क्योंकि यह अधिक लचीला है।

हम ऑब्जेक्ट पैरामीटर विचार से परिचित हैं, दूसरा पक्ष यह भी सोचता है कि ऑब्जेक्ट पैरामीटर में ऑब्जेक्ट को गुणों के रूप में होना चाहिए।

सही तरीका कौन सा है?

हो सकता है कि एक और भी बेहतर तरीका है?


क्या? ...........
जेम्स

1
प्रसंग? वेब सेवा? WCF?
कोडइन्चौस

1
@ नाम - क्षमा करें, मैंने यह प्रश्न थोड़े तेज लिखा है, क्या आप मुझे बता सकते हैं कि जो कुछ समझ में नहीं आया है, इसलिए मैं उसे संपादित कर सकता हूं?
मिथिर

@CodesInChaos की विधियाँ वास्तव में BL विधियाँ हैं
मिथिर

जवाबों:


10

उत्तर संदर्भ निर्भर है।

यदि ग्राहक को उन सभी वस्तुओं के उपलब्ध होने की उम्मीद है , तो मैं ऑब्जेक्ट पैरामीटर का उपयोग करूंगा। अन्यथा, उनका कोड होने की तुलना में अधिक जटिल दिखाई देगा। (उदाहरण के लिए उनके पास कॉल जैसे होंगे club.getId(), उदाहरण के लिए)

यदि क्लाइंट के पास केवल आसानी से उपलब्ध आईडी होगी , तो शायद दूसरा तरीका बेहतर है, क्योंकि आप नहीं चाहते कि ग्राहक को उन सभी वस्तुओं को इकट्ठा करना होगा / लोड करना होगा यदि आपको वास्तव में केवल आईडी की आवश्यकता है।

एक विकल्प दोनों तरीकों को प्रदान करने के लिए है , इसलिए ग्राहक चुन सकता है कि कौन सा उपयोग करना है (यह देखते हुए कि यह आपके एपीआई को अव्यवस्थित नहीं करता है)

सामान्य तौर पर ऑब्जेक्ट पैरामीटर अधिक एक्स्टेंसिबल होते हैं, क्योंकि यदि भविष्य में आपको काम करने के लिए किसी अन्य डेटा की आवश्यकता होती है, तो आपको उस अतिरिक्त जानकारी को लेने के लिए किसी अन्य विधि की आवश्यकता नहीं है।

अंत में, आपके विधि हस्ताक्षरों को उस पद्धति की बारीकियों से निर्धारित नहीं किया जाना चाहिए कि विधि क्या करती है (आपके मामले में, वास्तव में तार के ऊपर क्या जाता है)। एपीआई को अमूर्त रूप से समझाना चाहिए ताकि यदि कार्यान्वयन में बदलाव हो, तो आप खराब न हों।


3
+1 मैं केवल एक और बिंदु जोड़ूंगा: दूरस्थ रूप से ("ओवर द वायर"?) नामक विधियों के लिए, पासिंग ऑब्जेक्ट्स एक व्यापक ऑब्जेक्ट ट्री को गहराई से अनुक्रमित कर सकते हैं। जब आप रिमोट-कॉल पेलोड के आकार के बारे में चिंतित होते हैं, तो आईडी वस्तुओं के लिए उत्कृष्ट विकल्प होते हैं।
रॉस पैटरसन ने

1
इस मामले में ऐसा लगता है कि आप अमूर्त के सेट पर युग्मित हो गए हैं, इसलिए ईद पास करना आपको अधिक लचीलापन खरीदने के लिए नहीं जा रहा है और संभवतः इस संभावना को बढ़ा देगा कि आप मापदंडों को उलट देंगे। सवाल यह है कि जिस विधि में मैं गुजर रहा हूं उसके साथ युग्मित विधि में कोड कितना कड़ा है? उदाहरण के लिए "वैद्येटक्रेडिट कार्ड (स्ट्रिंग कार्ड, स्ट्रिंग सीवी)" जैसी विधि शायद किसी प्रकार के क्रेडिट कार्ड ऑब्जेक्ट के साथ कसकर जोड़े जाने से बचने के लिए आदिम के साथ रहना चाहिए।
ipaul

मैं बीच में मिलता और पैरामीटर सूची में एक इंटरफ़ेस का उपयोग करता। फिर आपका क्लब एक क्लब हो सकता है, लेकिन भविष्य में एक सॉना भी।
पीटर बी

13

पहला दृष्टिकोण आदिम जुनून का संकेत है । क्योंकि आप आस-पास और तारों को पास कर रहे हैं, इसलिए प्रोग्रामर के लिए एक गलती करना बहुत आसान है (उदाहरण के लिए एक क्लब आईडी टर्मिनलआईडीडी पैरामीटर से गुजरना)। इससे बग ढूंढना मुश्किल हो जाएगा।

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

फिर भी, मैं अभी भी देखूंगा string invoice। क्या एक चालान वास्तव में एक स्ट्रिंग है? क्या amountमतलब है? यह एक मौद्रिक मूल्य होने की अधिक संभावना है।

आपने अपने प्रश्न में उल्लेख किया है "व्हाट्स ओवर-द-वायर केवल आईडी हैं।" यह सही है, लेकिन इस आवश्यकता को अपने डोमेन को खराब न करने दें।

इस दृष्टिकोण के पक्ष में मैंने जो सबसे अच्छी व्याख्या की है वह ऑब्जेक्ट कैलिसथेनिक्स के नियम 3 में थी :

अपने आप में एक int सिर्फ एक अदिश राशि है, इसलिए इसका कोई अर्थ नहीं है। जब कोई विधि एक पैरामीटर के रूप में एक इंट लेती है, तो विधि नाम को आशय व्यक्त करने के सभी कार्य करने की आवश्यकता होती है। यदि एक ही विधि पैरामीटर के रूप में एक घंटा लेती है, तो यह देखना बहुत आसान है कि क्या हो रहा है। इस तरह की छोटी वस्तुएं कार्यक्रमों को अधिक बनाए रख सकती हैं, क्योंकि एक वर्ष एक विधि को पारित करना संभव नहीं है जो एक घंटे पैरामीटर लेता है। एक आदिम चर के साथ संकलक आपको अर्थपूर्ण रूप से सही प्रोग्राम लिखने में मदद नहीं कर सकता है। एक वस्तु के साथ, एक छोटा भी, आप संकलक और प्रोग्रामर दोनों को अतिरिक्त जानकारी दे रहे हैं कि मूल्य क्या है और इसका उपयोग क्यों किया जा रहा है।


तो दूसरा तरीका क्या है? यहां तक ​​कि अगर कोई आईडी ऑब्जेक्ट है, जिसमें सिर्फ आईडी प्रॉपर्टी भरी गई है?
मिथिर

यह एक यादृच्छिक ब्लॉग प्रतीत होता है। यह कहने के लिए कोई सबूत नहीं है कि पसंदीदा क्या है। कौन परवाह करता है कि वास्तव में क्या पसंद किया जाता है? आपके लिए क्या काम करता है
जेम्स

@James इस सवाल का कोई निश्चित जवाब नहीं है, खासकर जब से ओपी ने हमें बहुत संदर्भ नहीं दिया है। जो कोई स्पष्ट रूप से दावा करता है कि एक दृष्टिकोण दूसरे के लिए बेहतर है, वह ओपी को एक असंतोष कर रहा है। यह काला और सफेद नहीं है।
मैटवेवी

1
@ जेम्स मैंने केवल बताया कि पहला दृष्टिकोण बग को खोजने के लिए कठिन परिचय देना बहुत आसान बनाता है। मैं यह नहीं कह रहा हूं कि आदिम प्रकार खराब हैं, लेकिन आदिम प्रकार का उद्देश्य सार्थक डोमेन प्रकारों का निर्माण करना है। इस संदर्भ के बाहर उनका उपयोग करना आदिम जुनून कोड गंध की बहुत परिभाषा है।
मैटडवी

5
@ जेम्स: मैटडैवी ने जो कहा वह एक अच्छी तरह से स्थापित तथ्य है। वह यह नहीं कह रहा है कि मूल प्रकार बुरे हैं, वह क्या कह रहा है कि यह: someMethod (int, int, int, string, दशमलव) एक ग्राहक द्वारा समझे जाने और उपयोग करने के लिए बहुत कठिन है, कुछMethod (क्लब, टर्मिनल, कार्ड, स्ट्रिंग) , दशमलव)
c_maker

2

इसका कोई सही उत्तर नहीं है। या तो विकल्प नौकरी के लिए सही हो सकता है। लगभग किसी भी तरह से, चालान तर्क ने मेरे भौंह पर एक फरसा उठाया, मेरे पास कोई सुराग नहीं है कि कोड पढ़ने से क्या है।

यदि आप एक आईडी भेजते हैं, तो दोनों प्रणालियों को कसकर युग्मित करने की आवश्यकता है जो कि प्रतिनिधित्व करता है। क्लब टेबल में क्लब की प्रमुख है। कॉल करने वाले और कैली दोनों को इस बात से सहमत होने की आवश्यकता है कि क्लब की मेज को क्या कहा जाता है और यह किस डेटाबेस में है। यदि आप उस बाधा को लागू नहीं करना चाहते हैं या नहीं कर सकते हैं, तो आप कुछ सामान्य विवरण का उपयोग करके ऑब्जेक्ट पास करेंगे, देशी, क्रमबद्ध, xml, नाम = मान जो भी हो, एक ini फ़ाइल :)

के रूप में आप की पहचान की है कि आप "तार पर" खर्च होंगे। इससे बचना कि सिर्फ पहचानकर्ता को भेजने से आप कहीं और खर्च करते हैं। तो जो आपको सबसे कम चोट पहुँचाता है, अब (या बाद में हो सकता है ...) अच्छे बनाम बुरे का सूचक है।

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