2012-07-30 5 views
6

मुझे संदेह है कि शैली और/या व्यक्तिगत स्वाद का मामला है, लेकिन मैंने सोचा कि मैं वैसे भी पूछूंगा।क्या यह पैकेज का नाम उपयोग करने के लिए बेहतर अभ्यास है: कोड में प्रतीक या: उपयोग करें: पैकेज-नाम एक डिफैकेज में?

मैं परिभाषित करने संकुल की आदत इस प्रकार किया गया है:, मैं तो DRAKMA में प्रतीकों अनलंकृत उपयोग कर सकते हैं:

(defpackage :wibble 
    (:use :cl :drakma) 
    (:export :main)) 

एक बार मैं में-पैकेज निष्पादित (wibble, इस मामले में):

(http-request ... 

तब मैं हाल ही में पढ़ा है कि अनुभवी लिस्प हैकर्स बल्कि होगा नहीं: का उपयोग लेकिन:

(drakma:http-request ... 

बस आश्चर्य हुआ कि राय की सर्वसम्मति क्या थी और क्या कोई पेशेवर या विपक्ष (उस तरह का कंस :) नहीं था) या तो?

चीयर्स,

पीटर

उत्तर

5

यह और अधिक एक शैली मुद्दा है, तो यह काले और सफेद में इसे वर्गीकृत करने के लिए असंभव है, लेकिन यहां पक्ष-विपक्ष हैं:

  1. पैकेज का उपयोग करना - योग्य प्रतीक।

    प्रतीक विवादों से बचें।

    स्पष्ट रूप से विदेशी प्रतीकों को अलग करने की अनुमति देता है।

    , आसानी से, खोज की जगह, नकल की अनुमति देता है ... (पुनर्रचना के लिए, कुछ अन्य जगह आदि के लिए कोड निकालने) बाहरी पुस्तकालय से एक निश्चित प्रतीक का उपयोग करता है

    बनाता कोड भद्दा है, लेकिन केवल जब पुस्तकालय के नाम बहुत लंबे हैं। (उदाहरण के लिए, मैं cl-pprce में एक प्रचलित नाम re जोड़ने के लिए, और अब कोड का उपयोग कर इसे और भी बेहतर है, की तुलना में/ओ योग्यता w: लगता है re:scan)

  2. पूरे पैकेज का आयात

    मूल रूप से, के विपरीत पिछले मामले लेकिन मैं, उपयोगिता पुस्तकालयों के साथ इसका इस्तेमाल करते हैं क्योंकि योग्य नामों का उपयोग अक्सर कोड अधिक संक्षिप्त बनाने के अपने पूरा उद्देश्य और स्पष्ट :)

  3. :import-from package symbol

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

12

जब आप use एक पैकेज, वहाँ सूक्ष्म तरीके बातें करता है, तो इस्तेमाल किया पैकेज परिवर्तन गलत हो सकता है एक जोड़े हैं।

सबसे पहले, पैकेज भविष्य में अधिक प्रतीकों का निर्यात कर सकता है। यदि, उदाहरण के लिए, पैकेज एक नया प्रतीक library:rhombus निर्यात करता है और आप पहले से ही myapp::rhombus का उपयोग कुछ नाम देने के लिए कर रहे हैं, तो आप कभी भी विरासत वाले प्रतीक का उपयोग कर रहे हैं, सभी संभव अनुलग्नक (जैसे वर्ग, डिफन्स, मैक्रोज़ इत्यादि), कभी-कभी अजीब परिणाम है।यदि आप योग्य प्रतीक नामों का उपयोग करते हैं, तो आपको अपने इच्छित प्रतीकों से कम या कोई भी कम नहीं मिलेगा।

दूसरा, पैकेज भविष्य में प्रतीकों को निर्यात करना बंद कर सकता है। तो यदि, उदाहरण के लिए, library:with-rhombus गायब हो जाता है, तो (with-rhombus (42 42 42) ...) पर आपकी कॉल अचानक किसी समस्या के स्रोत को इंगित करने वाली किसी चीज़ की बजाय अमान्य फ़ंक्शन कॉल (42 ...) के लिए त्रुटि प्राप्त करेगी, "अनुपलब्ध" प्रतीक। यदि आप योग्य प्रतीक नामों का उपयोग करते हैं, तो आपको Symbol WITH-RHOMBUS is not exported from the LIBRARY package की रेखाओं के साथ एक त्रुटि मिलेगी जो स्पष्ट है।

प्रतीकों को आयात करना (:import-from या :shadowing-import-from या import) अपनी समस्या के बिना नहीं है। पर प्रतीक पर काम आयात करना, भले ही यह बाहरी है या नहीं। तो यह मामला हो सकता है कि प्रतीक अब library::rhombus है, यानी सार्वजनिक खपत के लिए और अधिक नहीं है, लेकिन आयात अभी भी कोई त्रुटि के साथ काम करेगा।

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

4

अभी तक अच्छे उत्तर।

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

उदाहरण के लिए सीएलआईएम कार्यान्वयन में एक CLIM-LISP पैकेज है जो कार्यान्वयन भाषा सेट करता है। यह COMMON-LISP पैकेज का एक रूप है। फिर CLIM-SYS (संसाधन, प्रक्रियाएं, ताले, ...), CLIM-UTILS (सामान्य लिस्प के विभिन्न उपयोगिताओं और एक्सटेंशन) और CLIM जैसे पैकेज हैं। अब एक नए पैकेज में सिलिका (एक सार खिड़की प्रणाली) इन चार पैकेज का उपयोग किया जाता है। इस प्रकार सिलिका के कार्यान्वयन को एक भाषा में लागू किया गया है जो दो भाषाओं (सामान्य लिस्प संस्करण VIMIM-LISP और CLIM के UI आदेश) के साथ बनाया गया है, साथ ही दो उपयोगिता पैकेज जो कुछ सुविधाओं के साथ CLIM-LISP का विस्तार करते हैं।

ऊपर के उदाहरण में यह भावना उपयोग संकुल के लिए, उन का गहन उपयोग करता बनाता है के बाद से वे एक नया भाषा और है कि नए पैकेज में कार्यान्वयन के लिए फार्म एक दूसरे को बढ़ा रहे हैं।

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

3

अंगूठे के नियम के रूप में, मैं :use पैकेज जो सामान्य भाषा का विस्तार करता है, लेकिन कुछ विशेष अनुप्रयोग वाले पैकेजों के लिए योग्य प्रतीकों का उपयोग करें। उदाहरण के लिए, मैं हमेशा :use एलेक्सैंड्रिया चाहता हूं, लेकिन Hunchentoot से प्रतीकों के लिए पूरी तरह से योग्यता का संदर्भ लें। संदेह में, मैं योग्य नामों का उपयोग करता हूं।

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

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