विशुद्ध रूप से सौंदर्य कारणों के लिए नेस्टेड फ़ंक्शन बनाना?


16

मैंने हमेशा सोचा है कि अन्य प्रोग्रामर शुद्ध सौंदर्य कार्यों को बनाने के विचार के बारे में क्या सोचते हैं।

कहो कि मेरे पास एक फ़ंक्शन है जो डेटा का एक हिस्सा संसाधित करता है Function ProcessBigData:। मुझे लगता है कि डेटा के कई प्रक्रिया चरणों की जरूरत है, केवल वैध कहते हैं: Step1, Step2, Step3

सामान्य aproach जो मुझे स्रोत कोड में सबसे अधिक दिखाई देता है, वह इस तरह की टिप्पणियाँ लिखना है:

Function ProcessBigData:
    # Does Step1
    Step1..
    Step1..

    #Does Step2
    Step2..
    Step2..

मैं आमतौर पर क्या करता हूं, लेकिन साथी साथियों द्वारा ऐसी कोडिंग शैली की कमी के कारण हमेशा गलत महसूस किया जाता है:

Function ProcessBigData:
    Function Step1:
        Step1..
        Step1..

    Function Step2:
        Step2..
        Step2..

    Step1() -> Step2()

मैं मुख्य रूप से चिंतित हूं अगर जावास्क्रिप्ट और पायथन में इस तरह की शैली के लिए कोई कमियां हैं

क्या कोई विकल्प है जो मैं नहीं देख रहा हूं?


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

जवाबों:


4

यह उतना अजीब नहीं है जितना आप सोच सकते हैं। उदाहरण के लिए, मानक एमएल में यह सहायक कार्यों के दायरे को सीमित करने के लिए प्रथागत है। दी गई, SML को इसे सुविधाजनक बनाने के लिए सिंटैक्स है:

local
    fun recursion_helper (iteration_variable, accumulator) =
        ... (* implementation goes here *)
in
    fun recursive_function (arg) = recursion_helper(arg, 0);
end

मैं इस अच्छी शैली पर विचार करूंगा, यह देखते हुए कि 1) छोटे कार्य कार्यक्रम के बारे में तर्क करने की सुविधा प्रदान करते हैं, और 2) यह पाठक को संकेत देता है कि इन कार्यों का उस दायरे से बाहर उपयोग नहीं किया जाता है।

मुझे लगता है कि जब भी बाहरी फ़ंक्शन कहा जाता है तो आंतरिक कार्यों को बनाने में कुछ ओवरहेड संभव है (मुझे नहीं पता कि जेएस या पायथन इसे दूर अनुकूलित करते हैं), लेकिन आप जानते हैं कि वे समय से पहले अनुकूलन के बारे में क्या कहते हैं।


11

जब भी संभव हो ऐसा करना आम तौर पर एक अच्छी बात है, लेकिन मैं इस तरह के काम को "कदम" के रूप में नहीं, बल्कि उप-मुखौटे के रूप में सोचना पसंद करता हूं ।

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

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

पठनीयता।

प्रक्रियात्मक कोड की 200+ पंक्तियों (एक फ़ंक्शन का शरीर) को पढ़ना मुश्किल है। 2-20 लाइन फ़ंक्शन को पढ़ना आसान है। कोड मनुष्यों के लिए है।

नेस्टेड या नहीं, आपको ज्यादातर पठनीयता का लाभ मिलता है, जब तक कि आप पैरेंट स्कोप से बहुत सारे वैरिएबल का उपयोग नहीं कर रहे हों, ऐसे में इसे पढ़ना उतना ही मुश्किल हो सकता है।

चर दायरे को सीमित करें

एक अन्य फ़ंक्शन होने से आपको चर दायरे को सीमित करने के लिए मजबूर किया जाता है, और विशेष रूप से आपको जो भी आवश्यक है उसे पास करना होगा।

यह अक्सर आपको संरचना कोड को भी बेहतर बनाता है, क्योंकि यदि आपको पहले "चरण" से किसी प्रकार के राज्य चर की आवश्यकता होती है, तो आप वास्तव में वास्तव में एक और उपटैब पा सकते हैं जो उस मूल्य को प्राप्त करने के लिए पहले लिखा और निष्पादित किया जाना चाहिए। या दूसरे शब्दों में, कोड के अत्यधिक-युग्मित विखंडू को लिखना कठिन हो जाता है।

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

यूनिट परीक्षण

प्रत्येक उपटैब, एक फ़ंक्शन (या यहां तक ​​कि एक वर्ग) लागू किया गया एक स्टैंड-अलोन, कोड का परीक्षण योग्य टुकड़ा है। यूनिट परीक्षण और टीडीडी के लाभ कहीं और प्रलेखित हैं।

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

एक टीम / टॉप-डाउन डिज़ाइन पर काम करना

उपशीर्षक अलग-अलग लोगों द्वारा लिखे जा सकते हैं, स्वतंत्र रूप से, यदि आवश्यक हो।

यहां तक ​​कि अपने आप से, यह उपयोगी हो सकता है जब कोड लिखना बस कुछ उपटैब आह्वान करना है जो अभी तक मौजूद नहीं है, मुख्य कार्यक्षमता का निर्माण करते समय, और वास्तव में सबटैक को लागू करने के बारे में चिंता करें जब आप जानते हैं कि यह आपको उन परिणामों को प्राप्त करने जा रहा है जिनकी आपको आवश्यकता है सार्थक रास्ता। इसे टॉप-डाउन डिज़ाइन / प्रोग्रामिंग भी कहा जाता है।

कोड पुन: उपयोग

ठीक है, इसलिए जो मैंने पहले कहा था, उसके बावजूद, कभी-कभी वास्तव में एक कारण होता है कि बाद में किसी और चीज के लिए एक उपमा का फिर से उपयोग करना। मैं "आर्किटेक्चर एस्ट्रोनॉट" -वाद की वकालत बिल्कुल नहीं कर रहा हूं, लेकिन सिर्फ इतना है कि शिथिल-युग्मित कोड लिखकर, आप बाद में फिर से उपयोग करने से लाभान्वित हो सकते हैं।

अक्सर उस री-यूज़ का मतलब कुछ रिफैक्टिंग होता है, जो पूरी तरह से अपेक्षित होता है, लेकिन इनपुट मापदंडों को एक छोटे से स्टैंडअलोन फ़ंक्शन पर रिफैक्ट करना MUCH होता है, जो 200+ लाइन फंक्शन वाले महीनों से इसे लिखे जाने के बाद निकालने से ज्यादा आसान होता है, जो कि वास्तव में यहाँ मेरी बात है।

यदि आप एक नेस्टेड फ़ंक्शन का उपयोग करते हैं, तो इसे फिर से उपयोग करना आम तौर पर एक अलग फ़ंक्शन को फिर से चालू करने का मामला है, जो फिर से है, यही कारण है कि मैं तर्क देता हूं कि नेस्टेड जाने का तरीका नहीं है।


2
ये सामान्य रूप से कार्यों का उपयोग करने के लिए कुछ वास्तव में मान्य बिंदु हैं, लेकिन मुझे लगता है कि आपके जवाब से नहीं मिला, अगर आपको लगता है कि NESTED फ़ंक्शन एक अच्छा विचार है। या क्या आप कार्यों को अपस्ट्रीम दायरे में निकालते हैं?
स्लेटेल

क्षमा करें अच्छा बिंदु, मैं उन अन्य लाभों में फंस गया जिन्हें मैं उस हिस्से को संबोधित करना भूल गया था। :) संपादित किया गया।
ग्रिग्मैक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.