GRUNDLAGEN

Refactoring: Code optimieren - Teil 3

Zuweisungen zu Parametern entfernen

Wenn man einer Funktion eine Variable übergibt, verwendet man diese oft direkt weiter (Listing 1).

Public Function DateinameExtrahieren(ByVal strPfad As String)
Dim intLetzterBackslash As Integer
intLetzterBackslash = InStrRev(strPfad, "\")
If intLetzterBackslash > 0 Then
strPfad = Mid(strPfad, intLetzterBackslash + 1)
End If
DateinameExtrahieren = strPfad
End Function

Gerade weil beim Aufruf von Funktionen mit Parametern standardmäßig eine Referenz auf den jeweiligen Wert übergeben wird, kann dies zu unerwartetem Verhalten führen. Die folgenden Zeilen verdeutlichen dies. Die Variable strDateiname wird deklariert und dann mit einem Dateinamen gefüllt. Anschließend wird die Variable – wie standardmäßig festgelegt – als Referenz übergeben. Die Funktion DateinameExtrahieren ändert den Wert des Parameters und damit auch den Wert der Variablen in der aufrufenden Routine. Die beiden Debug.Print-Anweisungen geben beide den Ausdruck Text.txt aus, obwohl das Ändern des Inhalts der Variablen strDateiname sicher nicht beabsichtigt war.

Dim strDateiname As String
strDateiname = "c:\Beispiele\Text.txt"
Debug.Print DateinameExtrahieren(strDateiname)
Debug.Print strDateiname

Dies lässt sich auf zwei Arten verhindern: Entweder man stellt den Typ des Parameters mit dem Schlüsselwort By Value um, wodurch sich Änderungen nicht mehr auf den Wert der Variablen in der aufrufenden Routine auswirken. Der Kopf der Funktion aus Listing 1 sieht dann wie folgt aus:

Public Function DateinameExtrahieren(ByVal strPfad As String)

Die elegantere und sinnvollere Methode ist, den Inhalt des Parameters erst gar nicht zu ändern. Dazu führt man eine neue temporäre Variable ein, in diesem Fall etwa mit dem Namen strDateinameTemp, und weist ihr den Wert des Parameters zu (Listing 2).

Public Function DateinameExtrahieren(strPfad As String)
Dim intLetzterBackslash As Integer
Dim strDateinameTemp As String
strDateinameTemp = strPfad
intLetzterBackslash = InStrRev(strDateinameTemp, "\")
If intLetzterBackslash > 0 Then
strDateinameTemp = Mid(strDateinameTemp, intLetzterBackslash + 1)
End If
DateinameExtrahieren = strDateinameTemp
End Function