2010-08-16 19 views
9

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.

+6

Man ... Đó là một ý chí mạnh mẽ để sử dụng asp cổ điển ngay tại đó! – cregox

+0

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ã. –

+0

@ 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

Trả lời

Các vấn đề liên quan