2013-06-28 3 views
15

में गुणों और नामकरण सम्मेलनों को परिभाषित करना मैं एक अच्छा जावास्क्रिप्ट प्रोग्रामर रहा हूं और द्वारा सूचीबद्ध coding conventions का पालन करता हूं। हालांकि तब से जावास्क्रिप्ट विकसित हुआ है और मेरा मानना ​​है कि नामकरण सम्मेलन अब पुराने हैं।जावास्क्रिप्ट

उदाहरण के लिए Crockford ने कहा:

का प्रयोग न करें _ (underbar) एक नाम के पहले अक्षर के रूप में। कभी-कभी गोपनीयता को इंगित करने के लिए इसका उपयोग किया जाता है, लेकिन यह वास्तव में गोपनीयता प्रदान नहीं करता है। अगर गोपनीयता महत्वपूर्ण है, तो उन फॉर्मों का उपयोग करें जो private members प्रदान करते हैं। उन सम्मेलनों से बचें जो क्षमता की कमी का प्रदर्शन करते हैं।

हालांकि जावास्क्रिप्ट अब आपको गैर-गणना योग्य गुण बनाने की अनुमति देता है। इसलिए यह समझ में आता है कि (कम से कम मेरे लिए - आपको असहमत होने की अनुमति है) एक अंडरबार के साथ गैर-संख्यात्मक गुणों को उपसर्ग करने के लिए यह इंगित करने के लिए कि संपत्ति गैर-गणना योग्य है।

आपको ऐसा क्यों करना चाहिए?

  1. क्योंकि visual feedback is important (लिंक किए गए आलेख में पठनीयता अनुभाग तक स्क्रॉल करें)।
  2. पिछड़ा संगतता। आप उन गुणों को फ़िल्टर कर सकते हैं जो for in लूप में अंडरबार से शुरू होते हैं।

की क्या Crockford कहा की एक और उदाहरण लेते हैं:

वैश्विक चर सभी बड़े अक्षरों में होना चाहिए। मैं इसे देखना वहाँ के रूप में इन नियमों का पालन के साथ दो समस्याएं हैं (JavaScript मैक्रो या स्थिरांक नहीं है, इसलिए वहाँ ज्यादा रुचिकर स्थानों जावास्क्रिप्ट नहीं है कि सूचित करने के लिए कि सभी बड़े अक्षरों का प्रयोग करने में नहीं है।)

:

  1. अधिकांश जावास्क्रिप्ट प्रोग्रामर सभी कैप्स में वैश्विक चर नहीं लिखते हैं। यह सिर्फ प्राकृतिक नहीं है।
  2. जावास्क्रिप्ट अब आपको गैर-लेखन योग्य गुण बनाने की अनुमति देता है। इसलिए, इस तरह के गुणों के लिए सभी कैप्स का उपयोग उसी कारण से किया जाता है जैसा कि मैंने उपरोक्त गुणों के लिए ऊपर बताया है।

सब कुछ ठीक है और ठीक है, लेकिन असली सवाल आप से पूछना क्या है? Object.defineProperties फ़ंक्शन देखें। समस्या यह है कि आपको प्रत्येक संपत्ति के लिए एक संपत्ति डिस्क्रिप्टर की आपूर्ति करने की आवश्यकता है जिसे आप परिभाषित करना चाहते हैं। यह भी verbose है। उदाहरण के लिए: के रूप में निम्नानुसार

var o = {}, x = 0; 

define(o, { 
    E: Math.E, 
    get x() { 
     return x; 
    }, 
    set x(y) { 
     x = y; 
    } 
}); 

define समारोह परिभाषित किया जाएगा:

var define = (function() { 
    var defineProperty = Object.defineProperty; 
    var has = Function.call.bind(Object.hasOwnProperty); 
    var getDescriptorOf = Object.getOwnPropertyDescriptor; 

    return function (obj, props) { 
     for (var key in props) 
      if (has(props, key)) 
       defineProperty(obj, key, 
        getDescriptorOf(props, key)); 
    }; 
}()); 

लेकिन अब आप कर सकते हैं '

var o = {}, x = 0; 

Object.defineProperties(o, { 
    E: { 
     value: Math.E, 
     enumerable: true, 
     configurable: true 
    } 
    x: { 
     enumerable: true, 
     configurable: true, 
     get: function() { 
      return x; 
     }, 
     set: function (y) { 
      x = y; 
     } 
    } 
}); 

इसके बजाय यह अगर आप बस कर सकता है ज्यादा बेहतर होगा टी non-enumerable, non-configurable या non-writable आसानी से संपत्ति बनाते हैं।इसलिए मैं define समारोह संशोधित इस प्रकार है:

var define = (function() { 
    var defineProperty = Object.defineProperty; 
    var has = Function.call.bind(Object.hasOwnProperty); 
    var getDescriptorOf = Object.getOwnPropertyDescriptor; 

    return function (obj, props) { 
     for (var key in props) { 
      if (has(props, key)) { 
       var descriptor = getDescriptorOf(props, key); 

       if (key.charAt(0) === "_") 
        descriptor.enumerable = false; 

       if (key.charAt(key.length - 1) === "_") 
        descriptor.configurable = false; 

       if (has(descriptor, "value") && key === key.toUpperCase()) 
        descriptor.writable = false; 

       defineProperty(obj, key, descriptor); 
      } 
     } 
    }; 
}()); 

अब एक underbar के साथ शुरुआत गुण गैर गणनीय कर रहे हैं, एक underbar के साथ समाप्त होने के गुण जो नहीं है गैर विन्यास और डेटा वर्णनकर्ता गुण किसी भी लोअरकेस अक्षरों गैर कर रहे हैं -writable।

तो मेरा सवाल यह है - क्या क्रॉकफोर्ड के नामकरण सम्मेलनों का पालन करते हुए संपत्तियों को गैर-गणनीय, गैर-कॉन्फ़िगर करने योग्य या गैर-लिखने योग्य बनाने का कोई तरीका है? मुझे पता है कि मेरे नामकरण सम्मेलनों में अधिक योग्यता है। हालांकि मैं क्रॉकफोर्ड के सम्मेलनों को जल्दबाजी से त्यागना नहीं चाहता हूं।

+0

यह इसी प्रकार है: http://stackoverflow.com/questions/4484424/underscore-prefix-for-property-and-method-names-in-javascript –

उत्तर

14

मैं सुझाव देता हूं कि शब्द के लिए क्रॉक के शिक्षण शब्द का पालन न करें।

उसके पास कुछ अच्छी सलाह है, लेकिन यह नमक के अनाज के साथ ले जाने लायक है।

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

निरंतर मूल्यों के नामकरण के लिए सम्मेलन भी ALL_CAPS_WITH_UNDERSCORE है, भले ही जेएस वास्तव में स्थिरांक न हो।

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

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