Trong khi đó, tôi cần một giải pháp để nhập các thư viện một cách an toàn trong VBScript.Thực hiện các mô-đun được nạp chậm trong VBScript
VBScript, để tham chiếu, không có khả năng nhập tích hợp. Phương pháp nhập tệp truyền thống là sử dụng SSI, kết xuất nội dung của nguyên văn includee vào includer. Điều này là ít hơn tối ưu vì một số lý do: không có cách nào để tránh nhiều sự bao gồm, không có cách nào để chỉ định một thư mục thư viện, vv Vì vậy, tôi đã viết chức năng của riêng tôi. Đó là khá đơn giản, sử dụng executeGlobal
với một cuốn từ điển để theo dõi các module nhập khẩu và gói toàn bộ điều trong một đối tượng cho đóng gói:
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"
Dù sao, điều này hoạt động khá tốt, nhưng đó là rất nhiều công việc nếu tôi don' t kết thúc bằng cách sử dụng thư viện. Tôi muốn làm cho nó lười biếng, để tìm kiếm hệ thống tập tin, tải, và thực thi chỉ được thực hiện nếu và khi thư viện thực sự được sử dụng. Điều này được đơn giản hóa bởi thực tế là các tính năng của mỗi thư viện chỉ được truy cập thông qua một đối tượng đơn lẻ trong phạm vi toàn cục có cùng tên với thư viện. Ví dụ:
' 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
Vì vậy, có vẻ như cách tiếp cận rõ ràng là dành cho các nhà nhập khẩu lười biếng để xác định StringBuilder như một đối tượng đó, khi truy cập, sẽ tải StringBuilder.lib và thay thế riêng của mình.
Thật không may, điều này được thực hiện khó khăn bởi VBScripts thiếu thiếu các cấu trúc lập trình meta. Ví dụ, không có sự tương tự với số method_missing
của Ruby, điều này sẽ làm cho việc triển khai thực hiện tầm thường.
Suy nghĩ đầu tiên của tôi là cho chính import
chức năng để sử dụng executeGlobal
để tạo ra một chức năng toàn cầu mang tên StringBuilder dùng không có đối số đó sẽ ở StringBuilder.lib tải lần lượt, và sau đó sử dụng executeGlobal
để "bóng" bản thân (chức năng) với StringBuilder singleton. Có hai vấn đề với điều này: đầu tiên, sử dụng executeGlobal
để xác định hàm sau đó tự ghi đè bằng cách sử dụng executeGlobal
có vẻ như một ý tưởng khá sơ sài nói chung và thứ hai, hóa ra trong VBScript, bạn chỉ có thể ghi đè hàm bằng biến hàm được đề cập là nội trang dựng sẵn. Oooookay. Ý tưởng tiếp theo tôi đã làm là tương tự, ngoại trừ thay vì sử dụng executeGlobal
để thay thế hàm bằng một biến, sử dụng nó để thay thế hàm bằng một hàm khác mà đơn giản trả về singleton. Điều này sẽ yêu cầu singleton được lưu trữ trong một biến toàn cầu riêng biệt. Những bất lợi của phương pháp này (ngoài tính không sẵn sàng của chiến lược) là việc truy cập singleton sẽ thêm phí gọi hàm và do sự phân tích lập dị của trình thông dịch, singleton không còn có thể sử dụng các thuộc tính mặc định nữa.
Nhìn chung, đó là một vấn đề khá dính và các quirks kỳ quặc của VBScript không giúp được gì. Bất kỳ ý tưởng hoặc đề xuất nào đều được hoan nghênh.
Man ... Đó là một ý chí mạnh mẽ để sử dụng asp cổ điển ngay tại đó! – cregox
Không phải lựa chọn của tôi. Tin tôi đi, đây không phải là ý tưởng của tôi về mã trang nhã. –
@ Chúng tôi luôn có lựa chọn, nhưng tôi chúc bạn may mắn.Tôi không thể (bận tâm) dừng lại để tìm hiểu và suy nghĩ về điều này ngay bây giờ. :) – cregox