2011-10-22 13 views
14

सभी एरलांग किताबें कहती हैं कि export_all खराब अभ्यास है लेकिन कोई कारण न दें। अंत में अधिकांश मॉड्यूल संकलन (export_all) के साथ अपने अधिकांश समय व्यतीत करते हैं क्योंकि सहायक कार्यों को हटाने के लिए मॉड्यूल की सूची को लगातार अद्यतन करना एक परेशानी है। क्या यह बुरा अभ्यास है क्योंकि मुझे उन कार्यों के बारे में परवाह करना चाहिए जिन्हें मैं अन्य डेवलपर्स के सामने पेश करता हूं? या यह बुरा अभ्यास है क्योंकि मॉड्यूल के कार्यों की संख्या में कुछ प्रकार की प्रदर्शन लागत है, शायद हॉट कोड लोडिंग जैसी चीजों के कारण। यदि मॉड्यूल को बहुत सारे कार्यों के साथ भरने के लिए कोई प्रदर्शन मारा जाता है, तो यह कितना बुरा है?क्यों -compile (export_all) खराब अभ्यास है?

+2

क्योंकि इंजीनियर को रिवर्स करना आसान है और अनावश्यक रूप से आवश्यकतानुसार बड़े निष्पादन योग्य उत्पादन का उत्पादन करना आसान है। निष्पादन योग्य अधिकार में किसी को भी आपके फ़ंक्शन नामों की आवश्यकता नहीं है? – fazo

उत्तर

22

कई कारणों के लिए:

  • स्पष्टता: यह जो कार्यों मॉड्यूल के बाहर उपयोग के लिए लक्षित कर रहे हैं देखना आसान हो जाए।

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

  • कोड गंध: आपको अप्रयुक्त कार्यों के लिए चेतावनियां मिलती हैं।

    इसलिए आप मृत कोड से बचेंगे।

  • अनुकूलन: संकलक अधिक आक्रामक अनुकूलन करने में सक्षम हो सकता है यह जानकर कि सभी कार्यों को निर्यात नहीं किया जाना चाहिए।

+0

क्या आपके पास अनुकूलन दावा का बैक अप लेने का कोई स्रोत है? दुर्भाग्यवश – jocull

+0

दुर्भाग्यवश नहीं, लेकिन मुझे लगता है कि यह केवल एक ही स्थान पर उपयोग किए जाने वाले कार्यों को इनलाइन करने में सक्षम होगा, उदाहरण के लिए, यदि यह जानता है कि उन्हें मॉड्यूल के बाहर से कभी भी नहीं बुलाया जाएगा। –

+3

इसके अलावा, यह डायलजर को उपयोग करने में कठोर बनाता है। @ जोकुल इन जो आर्मस्ट्रांग की पुस्तक, प्रोग्रामिंग एरलांग, दूसरा संस्करण, पृष्ठ। 164, वह कहता है कि जब आप कम फ़ंक्शन निर्यात करते हैं तो "कंपाइलर बहुत बेहतर कोड उत्पन्न कर सकता है"। – JDong

10

जबकि मुझे यह सुनिश्चित नहीं है कि -compile(export_all). का उपयोग करने के कोई व्यावहारिक प्रदर्शन प्रभाव हैं, तो मुझे संदेह है कि वे देखभाल करने के लिए पर्याप्त महत्वपूर्ण हैं।

हालांकि, निर्यात की सूची स्पष्ट रूप से घोषित करने का लाभ है। ऐसा करने से, .erl फ़ाइल के पहले पृष्ठ को देखकर हर कोई मॉड्यूल के इंटरफ़ेस को समझ सकता है। साथ ही, जैसा कि हम लिखने के लिए कई अन्य चीजों के साथ, मॉड्यूल इंटरफ़ेस की स्पष्ट घोषणा इसकी स्पष्टता को बनाए रखने में मदद करती है।

इसके साथ ही कहा, जब मैं एक नया Erlang मॉड्यूल पर काम शुरू करने के बाद इंटरफ़ेस परिपक्व हो जाता है मैं हमेशा -module(...). -compile(export_all). टाइप पर्याप्त मैं एक स्पष्ट -export([...])जोड़ने जबकिexport_all संकलन विकल्प रखे हुए हैं।

+3

'comcomile (export_all) 'का उपयोग करने के कोई प्रदर्शन प्रभाव नहीं हैं। कंपाइलर सभी कॉल को समान करता है और निर्यात को स्पष्ट निर्यात के साथ ही किया जाता है। – rvirding

3

परिभाषित सूची होने के कारण कौन से फ़ंक्शन बाहरी हैं, और इसलिए कौन से आंतरिक हैं, भविष्य में आपके कोड पर काम करने वाले किसी भी व्यक्ति के लिए बेहद उपयोगी है। मैंने हाल ही में कुछ पुराने कोड को दोबारा शुरू कर दिया है, और अधिकांश मॉड्यूल में export_all का उपयोग परेशानियों का निरंतर स्रोत रहा है।

संबंधित मुद्दे