Mehrere Rückgabewerte einer Funktion

In der Softwareentwicklung arbeite ich sehr gerne mit Funktionen, um den Quellcode in kleinere, leicht verständliche Einheiten aufzuteilen. Idealerweise sind sie so allgemein, dass sie an mehreren Stellen im Code verwendet werden können. In der Regel geben diese Funktionen einen einzelnen Wert zurück. In manchen Fällen ist jedoch erforderlich, mehrere Rückgabewerte zurückgeben zu können, vor allem dann, wenn die Daten in einem engen fachlichen Zusammenhang stehen – beispielsweise ein bestimmtes Produkt, seine abgesetzte Menge und der damit generierte Umsatz.

Dafür stehen uns in VBA (in allen anderen Programmiersprachen natürlich auch) mehrere Lösungsmöglichkeiten zur Verfügung, die ich hier kurz vorstellen möchte.

Rückgabe als Array

Arrays werden in der Sotftwareentwicklung für interne Verwaltung mehrerer (in der Regel gleichartiger) Werte verwendet. Für unser Beispiel könnte man theoretisch auf die Idee kommen, die Funktion ein Array mit drei Elementen zurück geben zu lassen, wo im ersten Element der Produktname, im zweiten Element die abgesetzte Menge und im dritten der Umsatz enthalten sind.

In der Vergangenheit habe ich selbst (Schande über meinen Kopf) solche Konstrukte genutzt. Mittlerweile würde ich davon definitiv abraten. Denn jedes Mal, wenn man im Programm so eine Funktion einbindet, muss man als Entwickler ganz genau wissen, an welcher Arrayposition welcher Wert hinterlegt ist. Dies ist nicht intuitiv anhand der Methodensignatur ersichtlich, sondern es ist immer ein Blick in die konkrete Implementierung, bzw. in die hoffentlich vorhandene Funktionsdokumentation nötig. Das alles kostet Zeit und ist auch eine zusätzliche Fehlerquelle, die man durch bessere Konstrukte vermeiden kann.

Aufteilung der Funktion in mehrere Funktionen

Berücksichtigt man bei der Softwareentwicklung das Single-Responsibility-Prinzip, dann darf es eigentlich keine Funktion geben, die gleichzeitig mehrere Werte zurückgibt. Denn in diesem Fall würde es heißen, dass die Funktion mehrere Aufgaben erledigt, was dem Prinzip widerspricht.

Abhilfe würde in diesem Fall die Aufteilung der Funktion in separate Funktionen schaffen, zum Beispiel in getProdukt(), getMenge() und getUmsatz().

Das Wörtchen „eigentlich“ habe ich am Anfang des Kapitels nicht umsonst hervorgehoben. In der Softwareentwicklung geht es oft um Spagat zwischen der Performance, Wiederverwendbarkeit und Pragmatismus.

In unserem konkreten Fall mit drei unterschiedlichen zurückzugebenenden Werten ist die Sache einigermaßen händelbar. Bei beispielsweise 6 unterschiedlichen Werten könnte es dann wiederum anders aussehen. Zum einen ist es natürlich umständlicher, weil 6 Funktionen entwickelt, gewartet und aufgerufen werden müssen. Zum anderen könnte Performance zum Thema werden, wenn für die Ermittlung von jedem Wert ein erneuter Zugriff auf die Datenquelle nötig wäre.

Rückgabe mit eigenen VBA-Datentypen

Meine favorisierte, einfachste und eleganteste Lösung für diesen Anwendungsfall lautet – ich kreiere einen eigenen VBA-Datentypen, der auf die Bedürfnisse der jeweiligen Funktion ausgerichtet ist. Eigene Datentypen haben gewisse Ähnlichkeit mit Klassen, beschreiben jedoch ausschließlich die Datenhaltung.

Public Type typProdukt
    bezeichnung As String
    anzahl      As Long
    summe       As Double
End Type

Der so angelegte Datentyp wird dann als Rückgabewert der Funktion hinterlegt. Der große Vorteil dieser Lösung gegenüber dem Array ist, dass man die Attribute namentlich ansprechen kann. Darüber hinaus besteht auch keine Notwendigkeit, die Attribute als Variant zu deklarieren – man verwendet hier einfach die passenden Datentypen.

Public Function getProdukt() As typProdukt

    'hier erfolgt die Datenermittlung
    '...
    Dim produkt As typProdukt
    
	With produkt
		.summe = 120
		.bezeichnung = "TestProdukt"
		.anzahl = 12
	End With
    
    getProdukt = produkt

End Function

Nach dem Aufruf der Funktion lassen sich die zurückgegebene Daten bequem über deren Namen ausgeben.

Public Sub aufruf()
    With getProdukt()
        MsgBox .bezeichnung & " wurde " & .anzahl & "-fach verkauft und erlöste " & .summe & " €."
    End With
End Sub

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert