मैं मार्टिन फाउलर की रिफैक्टिंग पुस्तक में आम कोड स्मेल के बारे में पढ़ रहा हूं । उस संदर्भ में, मैं एक पैटर्न के बारे में सोच रहा था जिसे मैं एक कोड बेस में देख रहा हूं, और एक व्यक्ति इसे उद्देश्य-विरोधी पैटर्न पर विचार कर सकता है।
पैटर्न वह है जहां एक वस्तु को एक या अधिक विधियों के तर्क के रूप में पारित किया जाता है, जिसमें से सभी वस्तु की स्थिति को बदलते हैं, लेकिन इनमें से कोई भी वस्तु वापस नहीं करता है। तो यह पास पर निर्भर है (इस मामले में) C # /। NET के संदर्भ प्रकृति द्वारा।
var something = new Thing();
// ...
Foo(something);
int result = Bar(something, 42);
Baz(something);
मुझे लगता है कि (विशेष रूप से जब तरीकों को उचित रूप से नामित नहीं किया जाता है) मुझे यह समझने के लिए कि क्या वस्तु की स्थिति बदल गई है, ऐसे तरीकों पर गौर करने की आवश्यकता है। यह कोड को अधिक जटिल बनाता है, क्योंकि मुझे कॉल-स्टैक के कई स्तरों को ट्रैक करने की आवश्यकता होती है।
मैं नए राज्य के साथ किसी अन्य (क्लोन) ऑब्जेक्ट, या कॉल-साइट पर ऑब्जेक्ट को बदलने के लिए आवश्यक किसी भी चीज़ को वापस करने के लिए इस तरह के कोड को बेहतर बनाने का प्रस्ताव देना चाहता हूं।
var something1 = new Thing();
// ...
// Let's return a new instance of Thing
var something2 = Foo(something1);
// Let's use out param to 'return' other info about the operation
int result;
var something3 = Bar(something2, out result);
// If necessary, let's capture and make explicit complex changes
var changes = Baz(something3)
something3.Apply(changes);
मेरे लिए ऐसा लगता है कि पहला पैटर्न मान्यताओं पर चुना गया है
- यह कम काम है, या कोड की कम लाइनों की आवश्यकता है
- यह हमें ऑब्जेक्ट को बदलने और कुछ अन्य जानकारी को वापस करने की अनुमति देता है
- यह अधिक कुशल है क्योंकि हमारे पास कम उदाहरण हैं
Thing
।
मैं एक विकल्प का वर्णन करता हूं, लेकिन इसे प्रस्तावित करने के लिए, मूल समाधान के खिलाफ तर्क देने की आवश्यकता है। क्या, यदि कोई हो, तो इस मामले को सुलझाने के लिए तर्क दिया जा सकता है कि मूल समाधान एक विरोधी पैटर्न है?
और क्या, अगर कुछ भी, मेरे वैकल्पिक समाधान के साथ गलत है?