में आलसी लोड मॉड्यूल को कार्यान्वित करना कुछ समय पहले, मुझे वीबीस्क्रिप्ट में स्वच्छ रूप से पुस्तकालयों को आयात करने के लिए एक समाधान की आवश्यकता थी।वीबीस्क्रिप्ट
संदर्भ के लिए वीबीस्क्रिप्ट में कोई आयात-योग्य आयात क्षमता नहीं है। फ़ाइलों को आयात करने की पारंपरिक विधि एसएसआई का उपयोग करना है, जो समावेशी वर्बैटिम की सामग्री को समकक्ष में डंप करता है। यह कई कारणों से कम से कम इष्टतम है: एकाधिक समावेशन से बचने का कोई तरीका नहीं है, लाइब्रेरी निर्देशिका निर्दिष्ट करने का कोई तरीका नहीं है, इसलिए मैंने अपना स्वयं का कार्य लिखा। यह काफी सरल, एक शब्दकोश के साथ 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 कोई मदद नहीं कर रहे हैं। किसी भी विचार या सुझाव का स्वागत किया जाएगा।
आदमी का उपयोग कर ... यह सही वहाँ क्लासिक एएसपी उपयोग करने के लिए मजबूत इच्छाशक्ति है दृष्टांत कर सकते हैं लिखने के लिए है! – cregox
मेरी पसंद नहीं है। मेरा विश्वास करो, यह सुरुचिपूर्ण कोड का मेरा विचार नहीं है। –
@ थॉम हम हमेशा एक विकल्प है, लेकिन मैं आपको शुभकामनाएं देता हूं।मैं इस बारे में जानने और सोचने के लिए रोक नहीं सकता (परेशान)। :) – cregox