मैं इसे उपयोग करने वाले कथन का दुरुपयोग मानता हूं। मुझे पता है कि मैं इस पद पर अल्पमत में हूं।
मैं इसे तीन कारणों से दुरुपयोग मानता हूं।
सबसे पहले, क्योंकि मुझे उम्मीद है कि "उपयोग" का उपयोग एक संसाधन का उपयोग करने के लिए किया जाता है और जब आप इसके साथ काम करते हैं तो इसका निपटान करते हैं । प्रोग्राम की स्थिति बदलना एक संसाधन का उपयोग नहीं कर रहा है और इसे वापस बदलना कुछ भी निपटाना नहीं है। इसलिए, राज्य को बदलने और बहाल करने के लिए "उपयोग" एक दुरुपयोग है; कोड आकस्मिक पाठक के लिए भ्रामक है।
दूसरा, क्योंकि मैं उम्मीद करता हूं कि "उपयोग करना" का उपयोग राजनीति से बाहर किया जाना चाहिए , आवश्यकता नहीं । जब आप इसके साथ काम कर रहे होते हैं, तो किसी फाइल के निपटान के लिए "उपयोग" करने का कारण यह नहीं होता है क्योंकि ऐसा करना आवश्यक है, बल्कि इसलिए कि यह विनम्र है - कोई अन्य व्यक्ति उस फ़ाइल का उपयोग करने के लिए इंतजार कर रहा हो सकता है, इसलिए कह रहा है "किया गया" अब "नैतिक रूप से सही बात है। मुझे उम्मीद है कि मुझे "उपयोग" करने में सक्षम होना चाहिए ताकि प्रयुक्त संसाधन लंबे समय तक आयोजित हो, और बाद में निपटारा हो, और ऐसा करने का एकमात्र प्रभाव अन्य प्रक्रियाओं को थोड़ा असुविधा में डालना है । एक "ब्लॉक" का उपयोग करना, जिसका कार्यक्रम राज्य पर अर्थ प्रभाव पड़ता है अपमानजनक है क्योंकि यह एक निर्माण में कार्यक्रम की स्थिति का एक महत्वपूर्ण, आवश्यक उत्परिवर्तन छिपाता है जो दिखता है कि यह सुविधा और राजनीति के लिए है, आवश्यकता नहीं।
और तीसरा, आपके कार्यक्रम की क्रियाएं उसके राज्य द्वारा निर्धारित की जाती हैं; राज्य के सावधानीपूर्वक हेरफेर की आवश्यकता ठीक है क्योंकि हम पहली बार में यह बातचीत कर रहे हैं। आइए विचार करें कि हम आपके मूल कार्यक्रम का विश्लेषण कैसे कर सकते हैं।
क्या आप इसे मेरे कार्यालय में एक कोड की समीक्षा करने के लिए लाएंगे, पहला सवाल जो मैं पूछूंगा "क्या यह अपवाद को फेंकने के लिए वास्तव में फ्रॉबल को लॉक करना सही है?" यह आपके कार्यक्रम से स्पष्ट रूप से स्पष्ट है कि यह चीज़ आक्रामक रूप से फिर से ताला लगा देती है चाहे कुछ भी हो जाए। क्या वह सही है? एक अपवाद फेंक दिया गया है। कार्यक्रम एक अज्ञात स्थिति में है। हम नहीं जानते कि क्या फू, फिडल या बार ने फेंक दिया, क्यों उन्होंने फेंक दिया, या उन्होंने अन्य राज्यों को क्या परिवर्तन किए जो साफ नहीं किए गए थे। क्या आप मुझे समझा सकते हैं कि उस भयानक स्थिति में हमेशा दोबारा ताला लगाना सही काम है?
शायद यह है, शायद यह नहीं है। मेरा कहना यह है कि कोड के साथ जैसा कि मूल रूप से लिखा गया था, कोड समीक्षक प्रश्न पूछना जानता है । उस कोड के साथ जो "उपयोग" करता है, मैं सवाल पूछना नहीं जानता; मुझे लगता है कि "उपयोग" ब्लॉक एक संसाधन आवंटित करता है, इसे थोड़ा उपयोग करता है, और जब यह किया जाता है, तो विनम्रता से इसका निपटान करता है, न कि "उपयोग" ब्लॉक का समापन ब्रेस मेरे प्रोग्राम स्टेट को असाधारण रूप से कई मनमाने ढंग से उत्परिवर्तित करता है कार्यक्रम राज्य की स्थिरता की शर्तों का उल्लंघन किया गया है।
सिमेंटिक प्रभाव के लिए "उपयोग" ब्लॉक का उपयोग इस कार्यक्रम को खंडित करता है:
}
अत्यंत सार्थक। जब मैं उस एक करीबी ब्रेस को देखता हूं तो मुझे तुरंत नहीं लगता "उस ब्रेस के साइड इफेक्ट्स हैं जो मेरे कार्यक्रम की वैश्विक स्थिति पर दूरगामी प्रभाव डालते हैं"। लेकिन जब आप इस तरह "उपयोग" का दुरुपयोग करते हैं, तो अचानक यह करता है।
दूसरी बात मैं पूछूंगा कि क्या मैंने आपका मूल कोड देखा है "यदि अनलॉक के बाद एक अपवाद को फेंक दिया जाता है, लेकिन कोशिश में प्रवेश करने से पहले क्या होता है?" यदि आप एक गैर-अनुकूलित असेंबली चला रहे हैं, तो संकलक ने कोशिश से पहले एक नो-ऑप निर्देश डाला हो सकता है, और यह थ्रेड एबॉर्ट अपवाद के लिए नो-ऑप पर होना संभव है। यह दुर्लभ है, लेकिन यह वास्तविक जीवन में होता है, विशेष रूप से वेब सर्वर पर। उस स्थिति में, अनलॉक होता है, लेकिन लॉक कभी नहीं होता है, क्योंकि अपवाद को कोशिश से पहले फेंक दिया गया था। यह पूरी तरह से संभव है कि यह कोड इस समस्या के लिए असुरक्षित है, और वास्तव में लिखा जाना चाहिए
bool needsLock = false;
try
{
// must be carefully written so that needsLock is set
// if and only if the unlock happened:
this.Frobble.AtomicUnlock(ref needsLock);
blah blah blah
}
finally
{
if (needsLock) this.Frobble.Lock();
}
फिर, शायद यह करता है, शायद यह नहीं है, लेकिन मैं सवाल पूछना जानता हूं । "उपयोग" संस्करण के साथ, यह एक ही समस्या के लिए अतिसंवेदनशील है: थ्रोबल बंद होने के बाद एक थ्रेड एबॉर्ट अपवाद को फेंक दिया जा सकता है, लेकिन उपयोग करने से जुड़े प्रयास से संरक्षित क्षेत्र में प्रवेश करने से पहले। लेकिन "उपयोग" संस्करण के साथ, मुझे लगता है कि यह एक "तो क्या है?" परिस्थिति। यदि ऐसा होता है तो यह दुर्भाग्यपूर्ण है, लेकिन मेरा मानना है कि "उपयोग करना" केवल विनम्र होना है, न कि व्यावहारिक रूप से महत्वपूर्ण राज्य को बदलने के लिए। मुझे लगता है कि अगर कुछ भयानक थ्रेड एबॉर्ट अपवाद गलत समय पर होता है, तो ठीक है, कचरा कलेक्टर अंतिम रूप से चलाने से उस संसाधन को साफ कर देगा।