2010-08-16 15 views
9

में आलसी लोड मॉड्यूल को कार्यान्वित करना कुछ समय पहले, मुझे वीबीस्क्रिप्ट में स्वच्छ रूप से पुस्तकालयों को आयात करने के लिए एक समाधान की आवश्यकता थी।वीबीस्क्रिप्ट

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

class ImportFunction 
    private libraries_ 

    private sub CLASS_INITIALIZE 
     set libraries_ = Server.createObject("Scripting.Dictionary") 
    end sub 

    public default property get exec (name) 
     if not libraries_.exists(name) then 
      ' The following line will find the actual path of the named library ' 
      dim lib_path: set lib_path = Path.resource_path(name & ".lib", "libraries") 

      on error resume next 
      ' Filesystem is a class of mine; its operation should be fairly obvious ' 
      with FileSystem.open(lib_path, "") 
       executeGlobal .readAll 
       if Err.number <> 0 then 
        Response.write "Error importing library " 
        Response.write lib_path & "<br>" 
        Response.write Err.source & ": " & Err.description 
       end if 
      end with 
      on error goto 0 

      libraries_.add name, null 
     end if 
    end property 
end class 
dim import: set import = new ImportFunction 

' Example: 
import "MyLibrary" 

वैसे भी, यह बहुत अच्छी तरह से काम करता है, लेकिन अगर मैं डॉन यह बहुत काम है ' लाइब्रेरी का उपयोग कर खत्म नहीं होता है। मैं इसे आलसी बनाना चाहता हूं, ताकि फाइल सिस्टम खोज, लोडिंग और निष्पादन केवल तभी किया जा सके जब पुस्तकालय वास्तव में उपयोग किया जाता है। यह इस तथ्य से सरल है कि लाइब्रेरी के समान नाम के वैश्विक दायरे में प्रत्येक लाइब्रेरी की विशेषताओं को सिंगलटन ऑब्जेक्ट के माध्यम से पूरी तरह से एक्सेस किया जाता है। उदाहरण के लिए:

' StringBuilder.lib ' 

class StringBuilderClass ... end class 

class StringBuilderModule 
    public function [new] 
     set [new] = new StringBuilderClass 
    end function 

    ... 
end class 
dim StringBuilder: set StringBuilder = new StringBuilderModule 

 

import "StringBuilder" 
dim sb: set sb = StringBuilder.new 

तो ऐसा लगता है कि स्पष्ट दृष्टिकोण एक वस्तु है कि, जब तक पहुँचा, StringBuilder.lib लोड और खुद को बदल देगा के रूप में StringBuilder परिभाषित करने के लिए आलसी आयातक के लिए है।

दुर्भाग्यवश, यह वीबीआरक्रिप्ट्स द्वारा मेटाप्रोग्रामिंग संरचनाओं की उदासीन कमी से कठिन बना दिया गया है। उदाहरण के लिए, रूबी के method_missing के लिए कोई एनालॉग नहीं है, जो कार्यान्वयन को छोटा कर देता।

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

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

कुल मिलाकर, यह एक चिपचिपा समस्या है, और वीबीस्क्रिप्ट के अजीब quirks कोई मदद नहीं कर रहे हैं। किसी भी विचार या सुझाव का स्वागत किया जाएगा।

+6

आदमी का उपयोग कर ... यह सही वहाँ क्लासिक एएसपी उपयोग करने के लिए मजबूत इच्छाशक्ति है दृष्टांत कर सकते हैं लिखने के लिए है! – cregox

+0

मेरी पसंद नहीं है। मेरा विश्वास करो, यह सुरुचिपूर्ण कोड का मेरा विचार नहीं है। –

+0

@ थॉम हम हमेशा एक विकल्प है, लेकिन मैं आपको शुभकामनाएं देता हूं।मैं इस बारे में जानने और सोचने के लिए रोक नहीं सकता (परेशान)। :) – cregox

उत्तर

2

क्या विंडोज स्क्रिप्ट घटक यहां सहायता करेंगे? http://msdn.microsoft.com/en-us/library/07zhfkh8(VS.85).aspx

यह मूल रूप से एक तरह से VBScript या JScript का उपयोग कर COM घटकों जो आप CreateObject

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