Передайте существующий FileSystemObject или создайте несколько экземпляров - PullRequest
5 голосов
/ 28 июня 2011

У меня есть несколько процедур, которые используют FileSystemObject. Я считаю, что это довольно удобно.

Вопрос. Имеет ли смысл передавать существующий экземпляр FileSystemObject из «основной» процедуры в эти другие процедуры в качестве аргумента, вместо того, чтобы каждая процедура создавала свой собственный экземпляр FileSystemObject?

Пример: лучше ли это сделать каким-либо образом:

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 

, что я видел, по крайней мере, один программист, а не следующее, что я обычно делаю:

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 

Я вижу идею сделать первое в том, что это потенциально снижает издержки, связанные с наличием нескольких экземпляров FileSystemObject. Но кажется ужасно громоздким, чтобы каждый раз приводить аргумент FSO. А если серьезно, накладные расходы действительно такие большие?

Ответы [ 3 ]

2 голосов
/ 29 июня 2011

Недавно я сделал что-то подобное, и лично я предпочитаю использовать один объект файловой системы, где это возможно.Я думаю о нем как о передаче файловых дескрипторов между функциями, которые, в свою очередь, записывают в дескриптор открытого файла.

При определении ваших функций / подпрограмм обязательно передавайте объект файловой системы, используя ключевое слово ByRef.

Единственный раз, когда это будет неприемлемо, это если вы перемещаетесь по файловой иерархии и вам нужен FSO для поддержки того же каталога.Однако следует отметить, что требования к памяти одного FSO на современных компьютерах незначительны, и вы заметите прирост производительности только в том случае, если вам нужно использовать рекурсивную функцию или повторно вызывать функцию, которая создает / уничтожает эти объекты.

1 голос
/ 29 июня 2011

Я предпочитаю оборачивать вещи в классе, а не передавать параметры из sub в sub ...

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 голос
/ 28 июня 2011

По моему мнению, накладные расходы на создание многих FSO не являются проблемой; но «вы не должны повторяться» и каждый CreateObject( "System.FileSystemObject" ) [упс] увеличивает риск ошибки времени выполнения. Под капотом находится ровно одна файловая система и один объект файловой системы, поэтому, если программистам на C / C ++ разрешено использовать STDOUT или cerr, программист VBScript / VBA имеет право на global FSO (вы можете ничего не делать с одноэлементным FSO, который меняет свою работу в других подпрограммах / функциях - кроме замены переменной хранения).

...