2008-12-02 19 views
8

पास करने के संबंध में मेरे पास एक फ़ंक्शन में पास करने के लिए लगभग 8-9 पैरामीटर हैं जो एक सरणी देता है। मैं जानना चाहता हूं कि उन पैरामीटर को सीधे फ़ंक्शन में पास करना या इसके बजाय सरणी पास करना बेहतर है? कौन सा बेहतर तरीका होगा और क्यों?कई पैरामीटर

उत्तर

11

मैं कुछ भी चाहते हैं, तो:

Array FireEmployee(string first, string middle, string last, int id) {...} 
कार्यों के लिए

कि इस तरह दिखेगा, सरणी का उपयोग करें:

कार्य करता है जो इस तरह दिखेगा के लिए, इस संकेतन का उपयोग अच्छी संरचना और मजबूत नाम प्राप्त करने के लिए सभी मानकों को रखने वाली संरचना तैयार करना होगा।

public struct user 
{ 
    public string FirstName; 
    public string LastName; 
    public string zilionotherproperties; 
    public bool SearchByLastNameOnly; 
} 
public user[] GetUserData(user usr) 
{ 
    //search for users using passed data and return an array of users. 
} 
+1

WIN32 प्रोग्रामिंग सबसे अच्छा है! ;-) –

+0

मैं एक वीबी प्रोग्रामर हूं इसलिए यदि मेरा उदाहरण कुछ सी # डिजाइन नियमों का उल्लंघन करता है, तो मैं क्षमा चाहता हूं। लेकिन यदि पैरामीटर "उपयोगकर्ता" -केस की तरह स्वाभाविक रूप से ऑब्जेक्ट से जुड़े होते हैं तो सभी पैरामीटर पैरामीटर के बजाय ऑब्जेक्ट्स भेजना पसंद करते हैं। ;) – Stefan

+1

मुझे असहमत होना होगा, आपका उदाहरण अच्छा दिखता है क्योंकि आपने माना है कि इनपुट पैरामीटर संबंधित हैं (उपयोगकर्ता के सभी सदस्य) लेकिन यह हमेशा ऐसा नहीं होता है। – hhafez

6

, व्यक्तिगत रूप से उन्हें पास है क्योंकि:

  • प्रकार सुरक्षित तरीका है।
  • इंटेलिसेन्स इसे विजुअल स्टूडियो में उठाएगा और जब आप अपने कॉलिंग फ़ंक्शन लिखेंगे, तो आपको पता चलेगा कि क्या है।
  • इस तरह से निष्पादित करना तेज़ है।

यदि पैरामीटर वास्तव में सरणी है, तो, सरणी पास करें। उदाहरण: तो यह

Array FireEmployees(Employee[] unionWorkers) {...} 
2

मैं तुम्हें सी # 4 का उपयोग कर रहे हैं और बस नाम वाले पैरामीटर का उपयोग कर सकते मान:

FireEmployee(
    first: "Frank", 
    middle: "", 
    last: "Krueger", 
    id: 338); 

ये कोड वीबी या स्मालटाक के रूप में लगभग के रूप में पठनीय हैं। :-)

यदि नहीं, तो मैं डेव मार्कले के कहने के साथ जाऊंगा।

2

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

वैकल्पिक रूप से, आप सदस्य प्रारंभकर्ताओं के साथ डिफ़ॉल्ट मान निर्धारित करके और सीटीओआर ओवरलोड की प्रगति का उपयोग करके स्टीफन के दृष्टिकोण के साथ एक समान प्रभाव प्राप्त कर सकते हैं।

1

यदि आप वास्तव में अपने तर्कों को अलग से पास नहीं करना चाहते हैं तो मैं एक नई कक्षा बनाने का सुझाव दूंगा जो आपके सभी तर्कों को समाहित करता है। आप (जावा में और सी # में सबसे अधिक संभावना) इस उद्देश्य के लिए ग्रेनरी विधि वाले वर्ग के अंदर एक सार्वजनिक आंतरिक कक्षा घोषित कर सकते हैं। इससे कक्षाएं चलने वाली कक्षाएं होती हैं जो वास्तव में केवल सहायक प्रकार हैं।

1

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

स्टैम्प युग्मन को कम करने के लिए आप एक इंटरफ़ेस का उपयोग कर सकते हैं, लेकिन यह मेरे स्वाद के लिए बहुत अधिक ओवरहेड है, इसलिए मैं अलग-अलग तर्कों को पारित करना चाहता हूं।

-1

उन्हें एक सरणी के रूप में पारित न करें जब तक कि समारोह एक सरणी पर काम करता है, मैं एक नया डेटा संरचना नहीं बनाता या तो समूह के लिए निम्न reasones

  1. एक नया डेटा संरचना खाल पासिंग के लिए मानकों क्या समारोह वास्तव में इनपुट के रूप में की जरूरत है (चूंकि उन सभी डेटा संरचना/भाग आवश्यकता क्यों है?)

  2. 1 से संबंधित यह संघ राज्य क्षेत्रों को और अधिक कठिन बना देता है (जब एक केन्द्र शासित प्रदेशों के लेखन आप पूरे डेटा संरचना से बनाना होगा)

  3. यदि इनपुट पैरामीटर संबंधित नहीं हैं, तो आप एक नई डेटा संरचना के साथ समाप्त होते हैं जो फ़ंक्शन कॉल करने के अलावा किसी अन्य कारण से असंबंधित डेटा प्रकारों को समूहित करता है, न्युटर

  4. यदि आपने अपने फ़ंक्शन में नई डेटा संरचना को पास करना चुना है समारोह, एक गुंजाइश जहां नए आंकड़ा संरचना

सच कार्य करने के लिए प्रत्येक परमाटर पारित करने के लिए केवल नुकसान है कि आप कोड की एक पंक्ति में समारोह फिट करने में सक्षम नहीं हो सकता है परिभाषित किया गया था में नहीं किया जा सकता लेकिन फ़ंक्शन कॉल से पहले आपको आवश्यक लाइनों को न भूलें जिसमें आप अपनी डेटा संरचना को भर देंगे।

0

क्या आपको वास्तव में एक समारोह के लिए 8-9 पैरामीटर की आवश्यकता है? ऐसा लगता है कि यदि आपको उन कई मानकों की आवश्यकता है, तो आप शायद उस समारोह में बहुत सी अलग-अलग चीजें कर रहे हैं। कोड को अलग-अलग कार्यों में पुन: सक्रिय करने का प्रयास करें ताकि प्रत्येक कार्य में बिल्कुल एक उद्देश्य हो।

+0

और फिर क्या? एक टिप्पणी जोड़ें कि किसी को हमेशा अनुक्रम में सभी 6 संबंधित कार्यों को कॉल करना चाहिए? –

4

आपका परिदृश्य मार्टिन फाउलर की रीफैक्टरिंग पुस्तक में परिचय पैरामीटर ऑब्जेक्ट रिफैक्टरिंग द्वारा कवर किया गया है। किताब अच्छी तरह से मालिकाना है, लेकिन जो लोग नहीं करते हैं, उनके लिए रिफैक्टरिंग का वर्णन here है। publisher's site पर और Google पुस्तकें पर भी एक पूर्वावलोकन है। यह पैरामीटर को एक सरणी के साथ नहीं बदलने की सिफारिश करता है, लेकिन एक नई वस्तु।

+1

यहां पैटर्न के बारे में अधिक भयानक संसाधन है e.t.c .: http://sourcemaking.com/refactoring/introduce-parameter-object। और पैटर्न के बारे में मुझे लगता है कि इसका मुख्य विचार 'संबंधित' पैरामीटर को ऑब्जेक्ट्स में समूहित करना है, सभी पैरामीटर नहीं, बल्कि केवल निकट से संबंधित है। –

+0

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

+0

निश्चित रूप से नहीं। तब सभी को विकिपीडिया e.t.c. के सभी लिंक हटा देना चाहिए 'सोर्समेकिंग' पैटर्न, यूएमएल चार्ट, एंटी-पैटर्न और चौथाई का एक कैटलॉग है। यह वास्तुकला के बारे में सभी सार्वजनिक ज्ञान को समेकित करता है। क्या आप इन चीजों के अधिक पूर्ण विवरण के साथ एक बेहतर संसाधन जानते हैं? और इसे रास्ते में क्रिएटिव कॉमन्स के तहत लाइसेंस प्राप्त है। मुझे फाउलर बहुत पसंद है, मुझे लगता है कि वह कमाल है, लेकिन उसकी 'रिफैक्टरिंग' पुस्तक में इस ज्ञान का कुछ हिस्सा शामिल है। –

3

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

कक्षा का उपयोग करने का मुख्य कारण जैसा कि मैं देख सकता था, क्या आप इसे अपरिवर्तनीय बना सकते थे, लेकिन यह संरचनाओं के साथ भी संभव है?

उदाहरण के लिए

:

struct user 
{ 
public user(string Username, string LastName) 
{ 
    _username = Username; 
} 
private string _username; 
public string UserName { 
    get { return _username; } 
} 

}

मैं लंबे समय से महसूस किया है कि मैं न अब अब और वर्गों और संरचनाओं के बीच मतभेदों को पता है कि हम propertys, initializers, खेतों और वास्तव में सब कुछ हो सकता है जब है कि एक वर्ग भी एक संरचना में है। मुझे पता है कि कक्षाएं पुनर्नवीनीकरण प्रकार हैं और संरचनाएं मूल्य प्रकार हैं लेकिन फ़ंक्शन में पैरामीटर के रूप में इसका उपयोग करते समय उपरोक्त मामले में यह क्या अंतर करता है?

मैं इस साइट http://www.startvbdotnet.com/oop/structure.aspx पर मतभेद के इस विवरण पाया और विवरण ठीक है मैं यह कैसे मेरे सिर में मैप किया गया:

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

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

+0

यह न भूलें कि सी # के हाल के संस्करणों में आप इस तरह के केवल-पढ़ने वाले स्वचालित गुणों का उपयोग कर कुछ टाइपिंग सहेज सकते हैं: सार्वजनिक स्ट्रिंग उपयोगकर्ता नाम {प्राप्त करें; निजी सेट; } –

संबंधित मुद्दे