क्या मुझे उन भाषाओं में कार्य करने चाहिए जो मुझे ऐसा करने की अनुमति दें या क्या मुझे इससे बचना चाहिए?


12

जावास्क्रिप्ट में, पीएल / एसक्यूएल और कुछ अन्य भाषाओं में, फ़ंक्शन को नेस्ट किया जा सकता है, अर्थात किसी अन्य फ़ंक्शन के भीतर घोषित किया जा सकता है। इसका उपयोग किसी बड़े फ़ंक्शन को छोटे टुकड़ों में तोड़ने के लिए किया जा सकता है, लेकिन उन टुकड़ों को बड़े फ़ंक्शन के संदर्भ में रखें।

function doTooMuch() {
    function doSomething () {
       ...
    }
    function doSomethingElse() {
       ...
    }
    function doYetAnotherThing() {
       ...
    }

    // doTooMuch body

    doSomething();
    doSomethingElse();
    doYetAnotherThing();
}

कुछ मामलों में, जब वे छोटे कार्य बड़े फ़ंक्शन के स्थानीय चर का उपयोग नहीं करते हैं, तो यह आसानी से एक संस्करण में बदल सकता है जहां सभी फ़ंक्शन अनावश्यक हैं।

function doSomething () {
   ...
}
function doSomethingElse() {
   ...
}
function doYetAnotherThing() {
   ...
}
function doTooMuch() {
    doSomething();
    doSomethingElse();
    doYetAnotherThing();
}

यह मानते हुए कि उन नेस्टेड फ़ंक्शन का उपयोग कहीं और नहीं किया जाना है, क्या उन्हें बड़े फ़ंक्शन के संदर्भ में रखना बेहतर है या यह बुरा है क्योंकि यह वही है जो बड़े फ़ंक्शन को ठीक करता है, ठीक है, बड़े?

जवाबों:


8

यह एक राय का विषय है, लेकिन मैं घोंसले के शिकार कार्यों से बचूंगा जब तक कि यह वास्तव में आपके डिजाइन का एक आवश्यक और जानबूझकर हिस्सा न हो।

जब आप अधिकांश कार्यों में घोंसला बनाते हैं, तो आप किसी प्रकार के यांत्रिक प्रभाव को समाप्त कर देते हैं। सबसे आम, और दिलचस्प, एक चर के लेक्सिकल दायरे को बंद करना है जिसका उपयोग शरीर के अंदर किया जा सकता है, लेकिन अन्य (जैसे: फ़ंक्शन की दृश्यता) भी कुछ समय दिखाते हैं।

वे आम तौर पर भयानक उपकरण होते हैं, जब सही उपयोग किया जाता है - लेकिन वे जटिल उपकरण होते हैं, क्योंकि वे गैर-स्थानीय या गैर-स्पष्ट प्रभावों के परिणामस्वरूप हो सकते हैं जब आप कोड पर पहली नज़र डालते हैं।

यदि आप उनका उपयोग नहीं करते हैं, तो कई लोग कोड पढ़ेंगे और ऐसा कुछ भी करते हुए नहीं देखेंगे - तो मान लेंगे कि वे इससे चूक गए हैं, और फिर से देखें, इस तरह से काम करने की कोशिश कर रहे हैं कि आपने ऐसा क्यों किया, और अलग दायरे में नहीं।

आप यह भी जोखिम उठाते हैं कि भविष्य के प्रोग्रामर जानबूझकर या गलती से किसी ऐसी चीज को बंद कर देंगे, जिसका उन्होंने इरादा नहीं किया था, वहीं जोखिम को नोटिफाई करके।

अंत में, यदि आपका फ़ंक्शन डिक्लेरेशन एन्कोडिंग फ़ंक्शन के दायरे से बाहर एक नामित फ़ंक्शन की घोषणा करता है, तो इससे बचें। जो हर किसी के लिए सुपर भ्रामक है।

अंतिम नोट के अनुसार: क्योंकि अलग-अलग फ़ंक्शंस सीमांकित कोड की मदद करते हैं, इसलिए घोंसले के कार्य एक विशालकाय फ़ंक्शन की तुलना में कम परेशानी वाले होते हैं, लेकिन अंततः इसका मतलब यह है कि समझने के लिए बहुत अधिक कोड पढ़ना doTooMuch()- विशेषकर यदि आप नेस्टेड फ़ंक्शन घोषणाओं के बीच कोड छिपा सकते हैं, या जांच करने की जरूरत है कि किसी ने नहीं किया।


-1: जावास्क्रिप्ट "अधिकांश भाषा" नहीं है। जावास्क्रिप्ट में घोंसले के शिकार सामान्य अभ्यास है।
केविन क्लाइन

2
जावास्क्रिप्ट में @kevincline नेस्टिंग कार्य एक आम बुरा अभ्यास है
रेयनोस

@ रेयानोस: यदि आप उन्हें घोंसला नहीं बनाते हैं, तो आप उन्हें कहां रखने जा रहे हैं? Thee कोई वर्ग नहीं हैं उन्हें समाहित किया जा सकता है। यहाँ कुछ विशिष्ट कोड है:jquery(function($){ $('#id').click(function(){...}); }
केविन क्लाइन

@kevincline ... नोब्स के लिए विशिष्ट कोड, आपको एक गहरी नेस्टेड फ़ंक्शन की आवश्यकता है। और ऐसा इसलिए है क्योंकि जावास्क्रिप्ट में कोई मॉड्यूल गुंजाइश नहीं है, इसलिए आपको उस अनाम बंद होने की आवश्यकता है।
रेयानोस

और अगर वह क्लिक एक अजाक्स कॉल को पूरा करता है, एक पूर्ण कॉलबैक के साथ? अब आपके पास फ़ंक्शन दो स्तर पर नेस्टेड हैं। ज़रूर, आप अनाम क्लोजर को वेरिएबल्स में असाइन करके नेस्टिंग को सीमित कर सकते हैं। क्या यह वास्तव में बेहतर है?
केविन क्लाइन

2

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


0

इस सवाल का कोई सही उत्तर नहीं है, क्योंकि न तो विकल्प एनकैप्सुलेशन को अधिकतम करता है। यदि आप उन्हें घोंसला बनाते हैं, तो उनके पास अभी भी उन चर तक पहुंच है जो उन्हें नहीं चाहिए। यदि आप नहीं करते हैं, तो अन्य कार्यों में उन कार्यों तक पहुंच होती है जिन्हें उन्हें नहीं करना चाहिए। किसी भी तरह से, आप खो देते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.