मेरे पास यह एपीआई फ़ंक्शन है:
public ResultEnum DoSomeAction(string a, string b, DateTime c, OtherEnum d,
string e, string f, out Guid code)
मुझे यह पसंद नहीं है। क्योंकि पैरामीटर ऑर्डर अनावश्यक रूप से महत्वपूर्ण हो जाता है। नए क्षेत्रों को जोड़ना कठिन हो जाता है। यह देखना कठिन है कि आसपास क्या हो रहा है। यह छोटे भागों में परावर्तक विधि के लिए कठिन है क्योंकि यह उप कार्यों में सभी मापदंडों को पारित करने का एक और ओवरहेड बनाता है। कोड पढ़ना कठिन है।
मैं सबसे स्पष्ट विचार के साथ आया हूं: डेटा को इनकैप्सुलेट करने वाली एक वस्तु है और प्रत्येक पैरामीटर को एक-एक करके पास करने के बजाय इसे पास करें। यहां वह है जो मैंने जुटाया:
public class DoSomeActionParameters
{
public string A;
public string B;
public DateTime C;
public OtherEnum D;
public string E;
public string F;
}
इससे मेरी API घोषणा कम हो गई:
public ResultEnum DoSomeAction(DoSomeActionParameters parameters, out Guid code)
अच्छा लगा। बहुत मासूम लगता है लेकिन हमने वास्तव में एक बहुत बड़ा बदलाव पेश किया है: हमने पारस्परिकता का परिचय दिया। क्योंकि जो हम पहले कर रहे थे वह वास्तव में एक गुमनाम अपरिवर्तनीय वस्तु को पारित करने के लिए था: स्टैक पर फ़ंक्शन पैरामीटर। अब हमने एक नया वर्ग बनाया, जो बहुत ही परिवर्तनशील है। हमने कॉल करने वाले की स्थिति में हेरफेर करने की क्षमता बनाई । वह चूसता है। अब मुझे अपनी वस्तु अपरिवर्तनीय चाहिए, मैं क्या करूँ?
public class DoSomeActionParameters
{
public string A { get; private set; }
public string B { get; private set; }
public DateTime C { get; private set; }
public OtherEnum D { get; private set; }
public string E { get; private set; }
public string F { get; private set; }
public DoSomeActionParameters(string a, string b, DateTime c, OtherEnum d,
string e, string f)
{
this.A = a;
this.B = b;
// ... tears erased the text here
}
}
जैसा कि आप देख सकते हैं कि मैंने वास्तव में अपनी मूल समस्या को फिर से बनाया है: बहुत सारे पैरामीटर। यह स्पष्ट है कि यह रास्ता नहीं है। मै क्या करने जा रहा हूँ? इस तरह की अपरिवर्तनीयता को प्राप्त करने का अंतिम विकल्प इस तरह "पठनीय" संरचना का उपयोग करना है:
public struct DoSomeActionParameters
{
public readonly string A;
public readonly string B;
public readonly DateTime C;
public readonly OtherEnum D;
public readonly string E;
public readonly string F;
}
यह हमें कई मापदंडों के साथ कंस्ट्रक्टरों से बचने और अपरिवर्तनीयता प्राप्त करने की अनुमति देता है। वास्तव में यह सभी समस्याओं (पैरामीटर ऑर्डरिंग आदि) को ठीक करता है। फिर भी:
- हर कोई (एफएक्सकॉप और जॉन स्कीट सहित) सहमत हैं कि सार्वजनिक क्षेत्रों को उजागर करना बुरा है ।
- एरिक लिपर्ट एट अल कहते हैं कि अपरिवर्तनीयता के लिए पठनीय क्षेत्रों पर निर्भर रहना एक झूठ है ।
कि जब मैं भ्रमित हो गया और इस प्रश्न को लिखने का फैसला किया: क्या "सी कई मापदंडों" से बचने के लिए सी # में सबसे सीधा तरीका है, बिना म्यूटेशन शुरू किए? क्या उस उद्देश्य के लिए एक पठनीय संरचना का उपयोग करना संभव है और अभी तक खराब एपीआई डिजाइन नहीं है?
स्पष्टीकरण:
- कृपया मान लें कि एकल जिम्मेदारीबिली सिद्धांत का कोई उल्लंघन नहीं है। मेरे मूल मामले में फ़ंक्शन केवल एक डीबी रिकॉर्ड के लिए दिए गए पैरामीटर लिखता है।
- मैं दिए गए फ़ंक्शन के लिए एक विशिष्ट समाधान नहीं मांग रहा हूं। मैं ऐसी समस्याओं के लिए एक सामान्यीकृत दृष्टिकोण की मांग कर रहा हूं। मैं विशेष रूप से "बहुत सारे मापदंडों" समस्या को हल करने में रुचि रखता हूं, जो कि उत्परिवर्तन या एक भयानक डिजाइन को पेश किए बिना।
अपडेट करें
यहां दिए गए जवाबों के अलग-अलग फायदे / नुकसान हैं। इसलिए मैं इसे एक समुदाय विकी में बदलना चाहता हूं। मुझे लगता है कि कोड नमूना और पेशेवरों / विपक्ष के साथ प्रत्येक उत्तर भविष्य में इसी तरह की समस्याओं के लिए एक अच्छा मार्गदर्शक होगा। मैं अब यह पता लगाने की कोशिश कर रहा हूं कि यह कैसे करना है।
DoSomeActionParameters
फेंक वस्तु है, जिसे विधि कॉल के बाद छोड़ दिया जाएगा।