स्टेटिकनेस के बारे में अर्थिक सुराग के रूप में "स्थिर"?


11

मैंने हाल ही में जावा में एक मध्यम आकार की परियोजना को फिर से शुरू करने और इकाई परीक्षणों को जोड़ने का काम किया है। जब मुझे महसूस हुआ कि सिंगलटन और स्टैटिक्स का मजाक उड़ाने में कितना दर्द होता है, तो मुझे आखिरकार "मिल गया" जो मैं इस समय उनके बारे में पढ़ रहा हूं। (मैं उन लोगों में से एक हूं जिन्हें अनुभव से सीखने की जरूरत है। अच्छी तरह से।)

इसलिए, अब जब मैं वस्तुओं को बनाने और उन्हें चारों ओर तार करने के लिए स्प्रिंग का उपयोग कर रहा हूं, तो मुझे staticबाएं और दाएं कीवर्ड से छुटकारा मिल रहा है । (अगर मैं संभावित रूप से इसका मजाक उड़ा सकता था, तो यह वास्तव में एक ही अर्थ में स्थिर नहीं है कि Math.abs (), सही है?) बात यह है, मुझे यह बताने की आदत की आदत हो गई है staticकि एक विधि पर भरोसा नहीं था किसी वस्तु की अवस्था पर। उदाहरण के लिए:

//Before
import com.thirdparty.ThirdPartyLibrary.Thingy;
public class ThirdPartyLibraryWrapper {
    public static Thingy newThingy(InputType input) {
         new Thingy.Builder().withInput(input).alwaysFrobnicate().build();
    }
}

//called as...
ThirdPartyLibraryWrapper.newThingy(input);
//After
public class ThirdPartyFactory {
    public Thingy newThingy(InputType input) {
         new Thingy.Builder().withInput(input).alwaysFrobnicate().build();
    }
}

//called as...
thirdPartyFactoryInstance.newThingy(input);

तो, यहाँ है जहाँ यह छू-मटोल हो जाता है। मुझे पुराना तरीका पसंद आया क्योंकि कैपिटल लेटर ने मुझे बताया कि, जैसे Math.sin (x), ThirdPartyLibraryWrapper.newThingy (x) ने हर बार उसी तरह किया। यह बदलने के लिए कोई वस्तु स्थिति नहीं है कि वस्तु वह कैसे करती है जो मैं उसे करने के लिए कह रहा हूं। यहाँ कुछ संभावित उत्तर दिए जा रहे हैं जिन पर मैं विचार कर रहा हूँ।

  • किसी और को इस तरह महसूस नहीं होता इसलिए मेरे साथ कुछ गड़बड़ है। हो सकता है कि मैंने अभी-अभी चीजों को करने के तरीके को आंतरिक रूप से आंतरिक नहीं किया है! शायद मैं जावा में लिख रहा हूं, लेकिन फोरट्रान या सोमेसुच में सोच रहा हूं। (जो प्रभावशाली होगा क्योंकि मैंने कभी फोरट्रान नहीं लिखा है।)
  • शायद मैं कोड के बारे में तर्क के प्रयोजनों के लिए अपरिवर्तनीयता के लिए छद्म के रूप में स्थिरता का उपयोग कर रहा हूं। यह कहा जा रहा है, किसी व्यक्ति के लिए मेरे कोड में क्या सुराग होना चाहिए , यह जानने के लिए कि वह क्या राज्य है और क्या नहीं है?
  • शायद यह सिर्फ मुफ्त में आना चाहिए अगर मैं अच्छी वस्तु रूपकों का चयन करूं? उदाहरण के लिए thingyWrapperयह ध्वनि नहीं करता है जैसे इसमें लिपटे हुए का संकेत है Thingyजो कि स्वयं ही परिवर्तनशील हो सकता है। इसी तरह, ऐसा thingyFactoryलगता है कि यह अपरिवर्तनीय होना चाहिए, लेकिन अलग-अलग रणनीतियाँ हो सकती हैं जिन्हें निर्माण के बीच चुना जाता है।

जवाबों:


12

मुझे पुराना तरीका पसंद आया क्योंकि कैपिटल लेटर ने मुझे बताया कि, जैसे Math.sin (x), ThirdPartyLibraryWrapper.newThingy (x) ने हर बार उसी तरह किया। यह बदलने के लिए कोई वस्तु स्थिति नहीं है कि वस्तु वह कैसे करती है जो मैं उसे करने के लिए कह रहा हूं।

यह करने का सही तरीका है, हाँ। उस ने कहा, staticअपरिवर्तनीयता या राज्य की दृढ़ता की कोई गारंटी नहीं देता है। कि आप इसे इस तरह की गारंटी के लिए एक सुझाव के रूप में उपयोग करते हैं, लेकिन यह किसी भी तरह से आश्वस्त नहीं है।

निम्नलिखित को धयान मे रखते हुए:

public static class Logger
{
    public static int LogLevel { get; set; }

    public static void Log(string message, int logLevel)
    {
        if (logLevel >= LogLevel)
        {
            // logs the message, but only if it is important enough.
        }
    }
}

यह वर्ग न केवल राज्य रखता है, बल्कि Logger.Log()उस अवस्था को बदलने पर विधि का व्यवहार बदल जाता है। यह एक staticवर्ग पैटर्न का पूरी तरह से वैध अभ्यास है , लेकिन इसमें कोई भी शब्दार्थ गारंटी नहीं है जो आप सुझा रहे हैं।


मैंने आपको चेकमार्क दिया है क्योंकि आप मेरे अंतर्ज्ञान के आधार पर एक उपयोगी काउंटरपॉइंट प्रस्तुत करते हैं, लेकिन मैं फिर भी आपके विचारों को प्राप्त करना चाहूंगा कि मुझे उस अनुबंध / अपेक्षा का प्रतिनिधित्व कैसे करना चाहिए जो राज्य की कमी और कोडिंग के माध्यम से दुष्प्रभावों की कमी के बारे में है। सम्मेलनों।
leoger

1
आम तौर पर इस तरह की अपेक्षाओं को विधि के लिए प्रलेखन में शामिल किया जाता है; वही थ्रेड सेफ्टी का सच है।
रॉबर्ट हार्वे

5

मेरी राय में आप क्या कह रहे हैं - सभी स्थिर कार्य अशक्त होने के लिए - ज्यादातर मामलों में कोड लिखने का एक अच्छा तरीका है, लेकिन मेरा मानना ​​है कि जब आप एक स्थिर कार्य को देखते हैं तो आपको स्वतः यह मान लेना चाहिए कि इसके दुष्प्रभाव नहीं हैं । स्थिति अधिक जटिल हो सकती है; उदाहरण के लिए फ़ंक्शन को लें Class.forName(String)जो स्टेटलेस प्रतीत होता है, लेकिन यह वास्तव में एक वर्ग को मेमोरी में लोड करता है और अंततः स्थिर फ़ील्ड्स को चलाता है / स्टैटिक इनिशियलाइज़र चलाता है; यह एक आदर्श कार्य का एक उदाहरण है (पहले वाले के बाद कोई फर्क नहीं पड़ता है) लेकिन यह शुद्ध कार्य नहीं है (यह नहीं कहा जा सकता है कि इसके दुष्प्रभाव नहीं हैं)। यह भी एक अच्छा विकल्प है, लेकिन ऐसे मामले हो सकते हैं जिनमें एक ही फ़ंक्शन के तीन अलग-अलग कॉल तीन अलग-अलग परिणाम देते हैं; उदाहरण के लिए यदि आप फोन करते हैंThread.currentThread() एक बहु-थ्रेडेड एप्लिकेशन में कोई गारंटी नहीं है कि आपको हर बार एक ही धागा प्राप्त होगा।

यह कहा जा रहा है, किसी व्यक्ति के लिए मेरे कोड में क्या सुराग होना चाहिए, यह जानने के लिए कि वह क्या राज्य है और क्या नहीं है?

दस्तावेज़ के लिए एक उचित समाधान है (उदाहरण के लिए जावदोक); फ़ंक्शन के नाम से, और कभी-कभी यह जो भी करता है उससे यह अनुमान लगाया जा सकता है कि स्थिर फ़ंक्शन एक शुद्ध फ़ंक्शन है। उदाहरण के लिए किसी के पास यह मानने का कोई कारण नहीं है कि Assert.assertTrue(boolean)जुनीत से कहीं न कहीं राज्य बदल जाएगा। दूसरी ओर जब किसी फ़ंक्शन System.clearProperty(String)को बुलाया जाता है, तो यह स्पष्ट है कि इसके साइड-इफेक्ट्स होंगे।


"अशक्त" और "स्टेटलेस" के बीच अंतर क्या है?
22

@ स्पेसर कोई अंतर नहीं होना चाहिए।
m3th0dman 15

4

यह कहा जा रहा है, किसी व्यक्ति के लिए मेरे कोड में क्या सुराग होना चाहिए, यह जानने के लिए कि वह क्या राज्य है और क्या नहीं है?

आप उन्हें स्थिर बना सकते हैं। C # दुनिया में FxCop आपको उन चीजों को स्थिर बनाने के लिए धकेल देगा जो कोई संदर्भ सदस्य चर नहीं हैं। यह (आमतौर पर) करने के लिए सही बात है।

जब मुझे महसूस हुआ कि सिंगलटन और स्टैटिक्स का मजाक उड़ाने में कितना दर्द होता है, तो मुझे आखिरकार "मिल गया" जो मैं इस समय उनके बारे में पढ़ रहा हूं।

उन सभी को उदाहरणों तक ले जाना शायद सही दृष्टिकोण नहीं है। इसके बजाय, उन वर्गों से स्थिर विधियों पर निर्भरता को कम करें जो उनका उपयोग करते हैं। आप अलगाव में स्थैतिक तरीकों का परीक्षण कर सकते हैं, और फिर उपभोक्ताओं में निर्भरता को प्रतिस्थापित कर सकते हैं जब उन्हें परीक्षण करने की आवश्यकता होती है।


क्या आप मुझे "स्थिर तरीकों पर निर्भरता को कम करने" का एक उदाहरण दे सकते हैं? यह मेरे लिए स्पष्ट नहीं है कि आप क्या सक्रिय कर रहे हैं। मैंने पहले से ही स्थैतिक विधि में कार्यान्वयन विवरण छिपा दिया है। दिन के अंत में, इसका उपयोग करने वाले वर्ग को उस कार्यक्षमता तक पहुंचने की आवश्यकता होती है। क्या आप कह रहे हैं कि मुझे एक इंस्टेंस ऑब्जेक्ट बनाना चाहिए जिसमें सभी स्थिर तरीकों के लिए पतले रैपर हों?
लीगर

1
@leoger - वह वर्ग जो स्थैतिक विधि का उपयोग करता है, यदि आपको उस कक्षा का परीक्षण कर रहे हैं, तो उसे कार्यक्षमता तक पहुंचने की आवश्यकता नहीं है, अन्यथा आप स्थैतिक विधि का मजाक नहीं उड़ाएंगे।
तेलस्टिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.