यदि फ़ंक्शन "शुद्ध" है, तो मुझे कोई समस्या नहीं दिखती है। एक शुद्ध कार्य केवल इनपुट मापदंडों में संचालित होता है, और उसी के आधार पर परिणाम प्रदान करता है। यह किसी भी वैश्विक स्थिति या बाहरी संदर्भ पर निर्भर नहीं करता है।
यदि मैं आपके स्वयं के कोड उदाहरण को देखता हूं:
public class Class1
{
public static string GetSomeString()
{
// do something
}
}
यह फ़ंक्शन कोई पैरामीटर नहीं लेता है। इस प्रकार, यह शायद शुद्ध नहीं है (इस फ़ंक्शन का एकमात्र शुद्ध कार्यान्वयन एक स्थिर लौटना होगा)। मैं मानता हूं कि यह उदाहरण आपकी वास्तविक समस्या का प्रतिनिधि नहीं है, मैं केवल यह इंगित कर रहा हूं कि यह शायद एक शुद्ध कार्य नहीं है।
चलो एक अलग उदाहरण लेते हैं:
public static bool IsOdd(int number) { return (number % 2) == 1; }
इस फ़ंक्शन के स्थिर होने में कुछ भी गलत नहीं है। हम इसे एक्सटेंशन फ़ंक्शन में भी बना सकते हैं, जिससे क्लाइंट कोड और भी अधिक पठनीय बन सकता है। विस्तार कार्यों हैं मूल रूप से सिर्फ स्थिर कार्यों की एक विशेष प्रकार का।
Telastyn सही रूप से स्थैतिक सदस्यों के साथ एक संभावित समस्या के रूप में संगति का उल्लेख करता है। हालाँकि, चूंकि यह फ़ंक्शन साझा स्थिति का उपयोग नहीं करता है, इसलिए यहां कोई समसामयिक समस्याएं नहीं हैं। एक हजार सूत्र किसी भी संगामिति मुद्दों के बिना एक साथ इस फ़ंक्शन को कॉल कर सकते हैं।
.NET फ्रेमवर्क में, विस्तार विधियाँ काफी समय से मौजूद हैं। LINQ में बहुत सारे विस्तार कार्य हैं (जैसे Enumerable.Where () , Enumerable.First () , Enumerable.Single () , आदि)। हम इन्हें बुरा नहीं मानते, क्या हम?
यूनिट परीक्षण अक्सर लाभान्वित हो सकता है जब कोड बदली सार का उपयोग करता है, जिससे यूनिट टेस्ट को सिस्टम कोड को टेस्ट डबल के साथ बदलने की अनुमति मिलती है। स्टेटिक फ़ंक्शंस इस लचीलेपन पर रोक लगाते हैं, लेकिन यह ज्यादातर वास्तुशिल्प परत सीमाओं पर महत्वपूर्ण है, जहां हम प्रतिस्थापित करना चाहते हैं, उदाहरण के लिए, नकली डेटा एक्सेस परत के साथ एक वास्तविक डेटा एक्सेस परत।
हालांकि, जब कोई वस्तु अलग-अलग व्यवहार करती है, उसके लिए एक परीक्षण लिखते हैं, तो यह निर्भर करता है कि कुछ संख्या विषम है या यहां तक कि, हमें वास्तव में IsOdd()
वैकल्पिक कार्यान्वयन के साथ फ़ंक्शन को बदलने में सक्षम होने की आवश्यकता नहीं है। इसी तरह, मैं नहीं देखता कि हमें Enumerable.Where()
परीक्षण के उद्देश्य के लिए एक अलग कार्यान्वयन प्रदान करने की आवश्यकता है ।
तो चलिए इस फ़ंक्शन के लिए क्लाइंट कोड की पठनीयता की जांच करते हैं:
विकल्प (विस्तार विधि के रूप में घोषित फ़ंक्शन के साथ):
public void Execute(int number) {
if (number.IsOdd())
// Do something
}
विकल्प b:
public void Execute(int number) {
var helper = new NumberHelper();
if (helper.IsOdd(number))
// Do something
}
स्थैतिक (विस्तार) फ़ंक्शन कोड के पहले टुकड़े को अधिक पठनीय बनाता है, और पठनीयता बहुत मायने रखती है, इसलिए जहां उपयुक्त हो वहां स्थैतिक कार्यों का उपयोग करें।