2011-09-22 6 views
7

मान लीजिए कि मैं निम्न विधि करते हैं:अनुरोध वस्तु, पेशेवरों और विपक्ष क्या हैं?

public Stream GetMusic(string songTitle, string albumName) { ... } 

मेरा एक सहयोगी ने आश्वस्त है कि यह एक बुरा विधि हस्ताक्षर।

public Stream GetMusic(SongRequest request) { ... } 

मैं वास्तव में ऐसा करने की बात नहीं दिख रहा है: उसने मुझे एक अनुरोध वस्तु है, जो इस में विधि हस्ताक्षर परिणत हो गया का उपयोग करना चाहते हैं। मुझे लगता है कि एकमात्र लाभ यह है कि भविष्य में पैरामीटर जोड़ना आसान होगा। हमें विधि हस्ताक्षर को बदलना नहीं होगा, लेकिन अनुरोध ऑब्जेक्ट को अभी भी बदलना होगा।

व्यक्तिगत रूप से, मुझे नहीं लगता कि यह एक अच्छा विचार है। पैरामीटर का उपयोग करना यह स्पष्ट करता है कि विधि को चलाने के लिए क्या आवश्यक है। इसके अलावा, यह हमें अधिक के लिए एक और वस्तु बनाने के लिए मजबूर करता है।

अनुरोध ऑब्जेक्ट्स का उपयोग करने के पेशेवर और विपक्ष क्या हैं? क्या आप इसे अपनी परियोजनाओं में उपयोग कर रहे हैं और क्यों?

+0

भविष्य में एक नया पैरामीटर "आसान" जोड़ने का लाभ आपको बाद में लागत का अनुबंध बदल देगा, और मौजूदा ग्राहकों को प्रभावित कर सकता है। इसलिए यदि अनुबंध बदल दिया गया है तो इसे स्पष्ट करें क्योंकि ग्राहकों को इसके बारे में पता होना चाहिए। –

+0

सिर्फ एक अवलोकन है कि आप अपने स्वयं के/सहयोगी की राय को एक प्रमुख प्रश्न पूछने से बचने के लिए बाहर कर सकते हैं। –

+0

नहीं। .NET ढांचा ऐसा नहीं करता है, पर्याप्त कहा। –

उत्तर

2

आपको GetMusic(...) विधि का उपयोग कर डेटा मिल रहा है। यदि ऐसा है, तो संभवतः बिना किसी आवश्यकता के अतिरिक्त इकाई का उपयोग करने के लिए यह बहुत अधिक प्रयास हो सकता है।

दरअसल, एक परिस्थिति में, केवल एक इनपुट पैरामीटर कहां है, आप एक कस्टम क्लास का उपयोग कर सकते हैं। लेकिन यदि वह वर्ग उपयोग करने का एकमात्र स्थान है, तो SongSignature वर्ग के नाम के रूप में कहता है, तो इस कक्षा के लिए विशेष रूप से का उपयोग करना होगा, यह "पैरामीटर बैग" का उपयोग करने का एक बुरा अभ्यास है, क्योंकि यह भाग्य पठनीयता है।

इसके अतिरिक्त, अगर कोई बेवकूफ कहता है कि SongSignature एक संरचना होनी चाहिए, और उस संरचना में कुछ डेटा को विधि के अंदर बदलने के लिए एक सूचक है, तो सूचक वास्तव में कभी भी नहीं बदलेगा क्योंकि हर बार GetMusic कहा जाता है, यह ले जाएगा संपत्ति बैग की प्रतिलिपि बनाएँ।

भले ही यह एक वर्ग है, आपको उस वर्ग के लिए public पर एक्सेसर बदलना होगा, और सामान्य रूप से यह किसी फ़ंक्शन के लिए आगे तर्कों को पारित करने और किसी फ़ंक्शन से परिणाम प्राप्त करने का सबसे अच्छा तरीका नहीं है, क्योंकि आपके पास है पहले से ही उस विधि से एक स्ट्रीम प्राप्त हो रही है।

एक टीम एक प्रोग्रामर एक वर्ग SongRequest साथ मानकों की जगह में है, तो दूसरा प्रोग्रामर नहीं मिला है कि यह (क्योंकि यह एक में जानकारी Lucks एक कार्यों के लिए एक पैरामीटर के रूप में इस्तेमाल किया जाता है:

के निम्न स्थिति मान लेते हैं एक वर्ग का नाम), और इसे अगले पुनरावृत्ति पर एक संरचना में बदल दिया, तीसरा प्रोग्रामर इस विधि को इस तरह से इस्तेमाल करता है, कि इसे एक वर्ग होना चाहिए (उदाहरण के लिए SongRequest के अंदर कक्षा संदर्भों का उपयोग किया गया है) ... नतीजतन एक वास्तव में जानता था कि कुछ क्यों काम नहीं कर रहा है क्योंकि उनमें से प्रत्येक गुंबद दाएं चीज है ... पैरामीटर की निहित घोषणा के बजाय स्थानीय उपयोग के लिए कक्षा का उपयोग करने का कोई बहाना नहीं है।

आम तौर पर आप एक भविष्य में ऐसी स्थिति प्राप्त करने के लिए एक अच्छा अवसर है, क्योंकि:

  • यदि आपने अपने कोड (यानी GetMusic)
  • कोई कोड की समीक्षा करने और प्राप्त कर सकते हैं बदलता है नहीं कर रहे हैं कक्षा 'SongReqest' उपयोगी है (इसलिए स्थानीय उपयोग से कक्षा के वैश्विक उपयोग के लिए स्थिति)
  • SongReuest कक्षा जोड़कर आप विधि के लिए अतिरिक्त निर्भरता जोड़ सकते हैं (क्या कोई इस वर्ग को बदलता है, संभवतः आप फाउंशन संकलित नहीं होगा)
  • SongRequest का उपयोग property bag के रूप में करता है क्योंकि यह पहले से ही एक वर्ग के रूप में उपयोग करता है, जैसा कि पहले उल्लेख किया गया है।
  • इस वर्ग का उपयोग कर, आप विधि शायद केवल एक विशेष समारोह के लिए पैरामीटर प्रदान करने के लिए SongRequest वर्ग का उपयोग कर का हिस्सा कभी नहीं होगा यह अन्य समारोह कॉल के साथ मानकों (किस कारण से?)
  • अंत में, अतिरिक्त स्मृति भूमि के ऊपर पदचिह्न देता है, क्योंकि यदि इस विधि को अक्सर कहा जाता है, तो एक तरफ, यह मेमोरी में बहुत सारी अनावश्यक वस्तुओं को कचरा इकट्ठा करना होगा, दूसरी तरफ, यदि ऐसी विधि का उपयोग शायद ही कभी किया जाता है, तो यह कक्षा बनाने के लिए व्यावहारिक नहीं होगा एक कॉल में कई चर

कक्षा का उपयोग करने के लिए केवल एक वास्तविक कारण है एक दो स्ट्रिंग तर्क: आप प्रोग्रामर ऐसी कॉल पसंद करते हैं और इस तथ्य के बावजूद कि यह बहुत व्यावहारिक और उपयोगी नहीं है, सभी कोड "पहले से अधिक सुंदर" बनाना चाहते हैं।

मैं आपको कभी ऐसा सलाह नहीं दूंगा जब तक कि आप इसे बेहतर दिखाना न पड़े।

आम तौर पर, मुझे लगता है कि किसी फ़ंक्शन के लिए तर्क पारित करने के लिए कस्टम क्लास का उपयोग करना एक बुरा अभ्यास है।

+0

कमाल की प्रतिक्रिया! धन्यवाद आर्टूर! – Martin

+0

@ मार्टिन: आपका स्वागत है! –

+0

आप इसे एक खराब अभ्यास के रूप में परिभाषित नहीं कर सकते हैं, ऐसे परिदृश्य हैं जहां यह समझ में आता है ... "यह निर्भर करता है" – Jowen

2

वहाँ एक प्रमुख लाभ एक वस्तु पारित करने के लिए है -

आप पैरामीटर के रूप में इस्तेमाल एक वस्तु, इस तरह के SongRequest के रूप में है, तो वस्तु का अपना सत्यापन के लिए जिम्मेदार हो सकता है। यह आपको ऑब्जेक्ट का उपयोग करने वाली प्रत्येक विधि में सत्यापन को नाटकीय रूप से सरल बनाने की अनुमति देता है, क्योंकि आपको प्रत्येक पैरामीटर की जांच करने के बजाय केवल नल की जांच करने की आवश्यकता होती है।

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

कहा जा रहा है कि, प्रत्येक स्थिति अद्वितीय है। मैं हर स्थिति के लिए दूसरे पर एक दृष्टिकोण की सिफारिश नहीं करता।

+2

यदि एक टीम में एक प्रोग्रामर वर्ग 'SongRequest' के साथ पैरामीटर को प्रतिस्थापित करता है, तो दूसरे प्रोग्रामर को यह नहीं मिला इसे किसी फ़ंक्शन के पैरामीटर के रूप में उपयोग किया जाता है (क्योंकि यह कक्षा के नाम पर भाग्य जानकारी है), और इसे अगले पुनरावृत्ति पर एक संरचना में बदल दिया गया है, तीसरा प्रोग्रामर इस विधि को इस तरह से इस्तेमाल करता है, कि इसे एक वर्ग होना चाहिए (उदाहरण के लिए 'SongRequest' के अंदर कक्षा संदर्भों का उपयोग किया गया है) ... नतीजतन कोई भी वास्तव में नहीं जानता था कि कुछ क्यों काम नहीं कर रहा है क्योंकि उनमें से प्रत्येक में गुंबद * दाएं * चीज है ... कक्षा के लिए कक्षा का उपयोग करने का कोई बहाना नहीं है पैराम की निहित घोषणा के बजाय स्थानीय उपयोग –

+0

अनुभव से बोलते हुए, इसकी आवाज़ से :) –

+3

@ आर्टूरमुस्ताफिन: 'वर्ग' से' संरचना 'में एक प्रकार को बदलना एक बड़ा बदलाव है। इसे बिना किसी इस्तेमाल के किया जा सकता है कि यह कैसे उपयोग किया जा रहा है, और वास्तव में डिजाइन पर ध्यान देने के साथ, सृजन के समय, वास्तव में निर्णय लिया जाना चाहिए। इस परिमाण के तथ्य के बाद किए गए परिवर्तन * को हमेशा इस प्रकार के सभी संदर्भों को देखकर किया जाना चाहिए, इसलिए, आईएमओ, यदि वास्तव में उचित डिजाइन पद्धति है तो यह वास्तव में नहीं होना चाहिए। –