2011-06-28 13 views
5

Tôi có một số quy trình sử dụng FileSystemObject. Tôi thấy nó khá thuận tiện.Vượt qua FileSystemObject hiện có hoặc tạo nhiều phiên bản

Câu hỏi: Có hợp lý khi chuyển một thể hiện tệp FileSystemObject từ thủ tục "chính" sang các thủ tục khác làm đối số, thay vì phải thực hiện từng thủ tục tạo tệp riêng của tệp FileSystemObject?

Ví dụ: là nó tốt hơn trong bất kỳ cách nào để làm điều này:

Sub MainSub() 
    Dim FSO : Set FSO = CreateObject("Scripting.FileSystemObject") 
    Call OtherSub(FSO, myargs) 
    ' call other subs and functions that use FileSystemObject 
End Sub 

Sub OtherSub(FSO, myargs) 
    ' Do stuff with FSO 
    ' call other subs and functions that use FileSystemObject 
End Sub 

mà tôi đã thấy ít nhất một lập trình viên làm, chứ không phải là những điều sau đây, đó là những gì tôi thường làm:

Sub MainSub() 
    Dim FSO : Set FSO = CreateObject("Scripting.FileSystemObject") 
    Call OtherSub(myargs) 
    ' call other subs and functions that use FileSystemObject 
End Sub 

Sub OtherSub(myargs) 
    Dim FSO : Set FSO = CreateObject("Scripting.FileSystemObject") 
    Call OtherSub(myargs) 
    ' Do stuff with FSO 
    ' call other subs and functions that use FileSystemObject 
End Sub 

Tôi có thể thấy ý tưởng làm việc trước đây ở chỗ điều này có khả năng làm giảm chi phí liên quan đến việc có nhiều phiên bản của FileSystemObject. Nhưng nó có vẻ khủng khiếp rườm rà để phải vượt qua FSO như một đối số mỗi lần. Và nghiêm túc, là chi phí thực sự lớn đến vậy?

Trả lời

1

Theo ý kiến ​​của tôi, chi phí tạo nhiều FSO không phải là vấn đề; nhưng "bạn không nên lặp lại chính mình" và mỗi CreateObject("System.FileSystemObject") [oops] làm tăng nguy cơ lỗi thời gian chạy. Dưới mui xe có chính xác một hệ thống tệp và một đối tượng hệ thống tệp, vì vậy nếu các lập trình viên C/C++ được phép sử dụng STDOUT hoặc cerr, một lập trình viên VBScript/VBA có quyền một toàn cầu FSO (bạn không thể làm bất cứ điều gì cho một FSO singleton thay đổi hoạt động của nó trong các subs/functions khác - ngoại trừ zapping biến giữ).

1

Tôi thích quấn mọi thứ lên trong một lớp học chứ không phải đi qua các thông số khoảng từ tiểu để phụ ...

Set c = New MyClass 
c.MainSub 

Class MyClass 

    Dim fso 

    Sub Class_Initialize 
     Set fso = CreateObject("Scripting.FileSystemObject") 
    End Sub 

    Sub Class_Terminate 
     Set fso = Nothing 
    End Sub 

    Public Sub MainSub()  
     OtherSub myargs 
     ' call other subs and functions that use fso 
     ' or use fso here 
    End Sub 

    Public Sub OtherSub myargs 
     ' Do stuff with fso here or call another sub in the class 
    End Sub 
End Class 

.

+1

Fake OOP. Tôi thích điều này. –

2

Gần đây tôi đã thực hiện một việc như thế này và cá nhân tôi thích sử dụng một đối tượng hệ thống tệp duy nhất bất cứ khi nào có thể. Tôi nghĩ về nó như là đi qua tập tin xử lý giữa các chức năng, mà in-turn ghi vào xử lý tập tin mở.

Khi xác định hàm/subs của bạn, hãy đảm bảo truyền đối tượng hệ thống tệp bằng cách sử dụng từ khóa ByRef.

Thời gian duy nhất điều này sẽ không thể chấp nhận được nếu bạn đang điều hướng thông qua phân cấp tệp và bạn cần FSO duy trì cùng một thư mục. Tuy nhiên, cần lưu ý rằng các yêu cầu bộ nhớ của một FSO đơn lẻ là không đáng kể trong các máy tính ngày nay, và bạn sẽ chỉ nhận được hiệu năng nếu bạn cần sử dụng chức năng đệ quy hoặc liên tục gọi một hàm tạo/hủy các đối tượng này.