एक ठोस सिद्धांतों के दृष्टिकोण से jgauffin का उत्तर समझ में आता है। हालाँकि, आपको सामान्य डिज़ाइन सिद्धांतों जैसे जानकारी छिपाना नहीं भूलना चाहिए ।
मुझे दिए गए दृष्टिकोण के साथ कई समस्याएं हैं:
- जैसा कि आपने खुद बताया कि लोग 'नए' कीवर्ड का उपयोग करने की उम्मीद नहीं करते हैं, जब बनाई गई वस्तु किसी भी राज्य का प्रबंधन नहीं करती है । आपका डिज़ाइन यह इरादा दर्शाता है। आपकी कक्षा का उपयोग करने वाले लोग भ्रमित हो सकते हैं कि यह किस स्थिति का प्रबंधन करता है, और क्या बाद में कॉल करने की विधि भिन्न व्यवहार में हो सकती है।
- वर्ग का उपयोग करने वाले व्यक्ति के दृष्टिकोण से आंतरिक स्थिति अच्छी तरह से छिपी हुई है, लेकिन जब कक्षा में संशोधन करना चाहते हैं या बस इसे समझना चाहते हैं, तो आप चीजों को और अधिक जटिल बना रहे हैं। मैंने उन समस्याओं के बारे में पहले से ही बहुत कुछ लिखा है, जिन्हें मैं विभाजित करने की विधियों के साथ देखता हूं ताकि उन्हें छोटा किया जा सके , खासकर जब राज्य को कक्षा के दायरे में ले जाया जाए। आप अपने एपीआई को छोटे कार्यों के लिए जिस तरह से इस्तेमाल किया जाना चाहिए उसे संशोधित कर रहे हैं! मेरी राय में यह निश्चित रूप से बहुत दूर ले जा रहा है।
कुछ संबंधित संदर्भ
संभवतः तर्क का एक मुख्य बिंदु यह है कि सिंगल रिस्पॉन्सिबिलिटी प्रिंसिपल को कैसे आगे बढ़ाया जाए । "यदि आप इसे उस चरम पर ले जाते हैं और ऐसी कक्षाएं बनाते हैं जिनका अस्तित्व होने का एक कारण है, तो आप प्रति कक्षा केवल एक विधि के साथ समाप्त हो सकते हैं। इससे कक्षाओं का एक बड़ा फैलाव और भी सरल प्रक्रियाओं के लिए पैदा होगा, जिससे सिस्टम हो सकता है। समझना मुश्किल है और बदलना मुश्किल है। ”
इस विषय से संबंधित एक अन्य प्रासंगिक संदर्भ: "अपने कार्यक्रमों को उन तरीकों में विभाजित करें जो एक पहचानने योग्य कार्य करते हैं। सभी कार्यों को एक ही स्तर पर अमूर्त स्तर पर रखें ।" - केंट बेक की यहाँ "अमूर्त के समान स्तर" है। इसका मतलब यह नहीं है कि "एक बात", क्योंकि इसकी व्याख्या अक्सर की जाती है। अमूर्त का यह स्तर पूरी तरह से उस संदर्भ तक है , जिसके लिए आप डिजाइन कर रहे हैं।
तो उचित दृष्टिकोण क्या है?
आपके ठोस उपयोग के मामले को जाने बिना यह बताना मुश्किल है। एक परिदृश्य है जिसमें मैं कभी-कभी (अक्सर नहीं) एक समान दृष्टिकोण का उपयोग करता हूं। जब मैं इस कार्यशीलता को पूरी कक्षा के दायरे में उपलब्ध कराना चाहता हूं, तो मैं एक डेटासेट प्रोसेस करना चाहता हूं। मैंने इसके बारे में एक ब्लॉग पोस्ट लिखी, कि लैम्ब्डा कैसे भी हो सकता है आगे इनकैप्सुलेशन में सुधार कर सकता है । मैंने प्रोग्रामर्स के विषय पर भी एक प्रश्न शुरू किया । निम्नलिखित एक नवीनतम उदाहरण है जहां मैंने इस तकनीक का उपयोग किया है।
new TupleList<Key, int>
{
{ Key.NumPad1, 1 },
...
{ Key.NumPad3, 16 },
{ Key.NumPad4, 17 },
}
.ForEach( t =>
{
var trigger = new IC.Trigger.EventTrigger(
new KeyInputCondition( t.Item1, KeyInputCondition.KeyState.Down ) );
trigger.ConditionsMet += () => AddMarker( t.Item2 );
_inputController.AddTrigger( trigger );
} );
चूँकि बहुत 'स्थानीय' कोड का ForEach
पुन: उपयोग कहीं और नहीं किया गया है, इसलिए मैं इसे केवल उसी स्थान पर रख सकता हूँ जहाँ यह प्रासंगिकता का है। आउटलाइनिंग कोड इस तरह से कि कोड जो एक दूसरे पर निर्भर करता है, दृढ़ता से एक साथ समूहीकृत होता है, यह मेरी राय में अधिक पठनीय बनाता है।
संभव विकल्प
- C # में आप इसके बजाय एक्सटेंशन विधियों का उपयोग कर सकते हैं। तो तर्क पर काम करते हैं सीधे आप इस 'एक बात' विधि से गुजरते हैं।
- देखें कि क्या यह फ़ंक्शन वास्तव में किसी अन्य वर्ग से संबंधित नहीं है।
- इसे एक स्थिर वर्ग में एक स्थिर कार्य करें । यह सबसे अधिक संभावना सबसे उपयुक्त दृष्टिकोण है, जैसा कि आपके द्वारा संदर्भित सामान्य एपीआई में भी परिलक्षित होता है।
bool arrayContainsSomestring = new List<string>(stringArray).Contains("somestring");
जब मैंने ध्यान रखा था कि जानकारी का एक विशेष टुकड़ा और LINQ विस्तार विधियाँ उपलब्ध नहीं हैं। ठीक काम करता है, औरif()
हुप्स के माध्यम से कूदने की आवश्यकता के बिना एक शर्त के अंदर फिट बैठता है । यदि आप उस तरह का कोड लिख रहे हैं, तो बेशक, आप एक कचरा एकत्र भाषा चाहते हैं।