2011-04-13 16 views
6

मैं दो तरीकों:एक पैरामीटर या कई

BuildThing(Thing a); 
BuildThings(IEnumerable<Thing> things); 

इस दृश्य के लिए एक साफ कोड बिंदु से अच्छा है? या शायद बिल्डिंग का उपयोग करना बेहतर होगा और केवल एक चीज के साथ IENumerable पास करना बेहतर होगा? या पैराम का उपयोग करें?

धन्यवाद।

void Build(Thing thing); 
void Build(IEnumerable<Thing> things); 

कार्यान्वयन:

void Build(Thing thing) 
{ 
    Build(new [] { thing }); 
} 

void Build(IEnumerable<Thing> things) 
{ 
    //do stuff 
} 

कारण मैं उपयोग करने के लिए इस पद्धति है, क्योंकि यह सुनिश्चित करती है पसंद करते हैं कि आप DRY जबकि रहने

उत्तर

6

मेरी निजी पसंद के रूप में इस प्रकार है

इंटरफेस है आपको params के विपरीत, एकाधिक ओवरलोड होने की लचीलापन देता है, जहां आपको किसी भी गैर-सरणी को परिवर्तित करना होगा एक सरणी के लिए गणना योग्य।

0

शुद्ध रूप से 'स्वच्छ कोड' बिंदु से, यह बिल्कुल ठीक है। यद्यपि कार्यात्मक रूप से विकल्प आपको बेहतर तरीके से अनुकूल कर सकते हैं या नहीं। उदाहरण के लिए, params का उपयोग करके संग्रह को कॉल के समक्ष गहराई से गणना के विपरीत कॉल से पहले गणना करने के लिए मजबूर किया जाता है।

BuildThings(params Thing[] things); 

आप किसका उपयोग करना सक्षम बनाता है::

BuildThings(thing1, thing2, thing3, ...); 
5

एक बात आप कर सकते है।

मुझे लगता है कि आपके 2 या अधिक तरीकों से ठीक है जब तक आपके पास केवल एक कार्यान्वयन हो।

public void BuildThing(Thing a) 
{ 
    this.BuildThings(new List<Thing>(){a}); 
} 
2

पैरामीटर अपने तरीकों के लिए एक अच्छा समाधान नहीं होगा

1

आपके द्वारा प्रदान की जाने वाली विधियां एक अच्छी प्रैक्टिस की तरह लगती हैं। कई अलग-अलग चीजें हो सकती हैं जब आप कई उदाहरणों के बजाय केवल एक उदाहरण बना रहे हों।

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

0

मैं दो मामलों पर विचार करेंगे:

  1. उन दो तरीकों के लिए, लेकिन BuildThing(Thing a) में मैं BuildThings(IEnumerable<Thing> things) का उपयोग करें और
  2. params साथ केवल एक ही विधि बनाएं केवल एक ही बात के साथ IEnumerable से होकर गुजरेगा इस विकल्प से एक दोष यह है - यदि आप एक और तर्क पारित करना चाहते हैं तो आपको प्रत्येक IEnumerable से Array (पाठ्यक्रम के सरणी को छोड़कर) को परिवर्तित करना होगा।

मैं शायद params समाधान के साथ जाऊंगा।

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