| |
VB.NET - FortgeschritteneÜbergabeparameter einer Function abfragen | | | Autor: Maurice | Datum: 21.09.11 12:36 |
| hallo,
ich möchte innerhalb einer function die Übergabeparameter überprüfen und zwar ohne die Parameter kennen zu müssen. Der Hintergrund ist folgender: Ich habe mehrere Berechnungsfunktionen, die mehrere Parameter vom Typ Nullable(Of Double) übergeben bekommen. Der Typ Nullable(Of Double) kann den Wert nothing annehmen, weshalb ich ihn auch verwende. Das hat allerdings zur Folge, das Übergabeparameter mit dem Wert nothing Berechnungen unmöglich machen. Deswegen benötige ich einen möglichst flexiblen Mechanismus, der überprüft ob alle Übergabeparameter einen Wert haben.
Eine Möglichkeit wäre es, exceptions mit try catch abzufangen. Aber wenn ich das so mache, unterbricht der Debugger ständig um mich über die exceptions zu informieren.
Deswegen wäre eine Lösung mit reflection oder etwas ähnliches besser.
Public Function Calculate(ByVal a As Nullable(Of Double), ByVal b As Nullable( _
Of Double), ByVal c As Nullable(Of Double)) As Nullable(Of Double)
'überprüfen der parameter hier:
Return (a + b) / c
End Function gruß Maurice | |
Re: Übergabeparameter einer Function abfragen | | | Autor: Manfred X | Datum: 21.09.11 12:49 |
| Hallo!
Frage die Parameter auf "HasValue" ab.
Falls mindestens einer der Parameter dabei "false" liefert,
beendest Du die Funktion und gibst Nothing zurück.
MfG
Manfred | |
Re: Übergabeparameter einer Function abfragen | | | Autor: Maurice | Datum: 21.09.11 13:43 |
| Die Übergabewerte dürfen nothing sein, um zu signalisieren ob eine Variable durch Nutzereingabe schon gesetzt wurde oder nicht. Wenn einer der Übergabewerte nicht gesetzt wurde, soll die function nothing zurückgeben.
@Manfred X:
Das man mit HasValue den Zustand abfragt, weiß ich bereits. Das Problem ist eigenlich, das ich eine Auflistung aller Übergabewerte brauche, die ich dann in einer Schleife durchlaufen kann um HasValue abzuprüfen.
Ich habe etwa 50 derartige Berechnungsfunktionen mit verschiedenen Übergabewerten, deswegen bin ich auf der Suche nach einer flexiblen Möglichkeit ein variable Anzahl an Parametern auf Hasvalue zu prüfen. Ich hatte dabei schon an Reflection gedacht.
system.reflection.methodinfo könnte eine Möglichkeit sein, allerdings habe ich bisher noch keine Möglichkeit gefunden, damit direkt auf die Übergabeparameter meiner Funktion zuzugreifen.
Beitrag wurde zuletzt am 21.09.11 um 13:44:43 editiert. | |
Re: Übergabeparameter einer Function abfragen | | | Autor: Manfred X | Datum: 21.09.11 14:26 |
| Hallo!
Suchst Du eine in allen Routinen einsetzbare Check-Funktion?
Private Function CheckParameters _
(ByVal ParamArray args() As Nullable(Of Double)) As Boolean
For i As Integer = 0 To args.Length - 1
If Not args(i).HasValue Then Return False
Next i
Return True
End Function Bei Berechnungen hat jeder Parameter eine spezifische Funktion.
Vorhandensein und Ausprägung sollte deshalb individuell beurteilt werden.
Beitrag wurde zuletzt am 21.09.11 um 14:29:02 editiert. | |
Re: Übergabeparameter einer Function abfragen | | | Autor: Manfred X | Datum: 21.09.11 14:47 |
| Hallo!
... wegen der ergänzenden Anmerkung
(z.B. Einbau zusätzlicher Überprüfung der Parameter auf Ausprägungsbereich
bzw. auf das Vorliegen von Double.NaN). | |
Re: Übergabeparameter einer Function abfragen | | | Autor: Maurice | Datum: 21.09.11 17:21 |
| Vielen Dank ihr beiden! So lässt sich das gut lösen. Perfekt wäre es, wenn ich auch noch alle Übergabewerte meiner Functions mittels Reflection ermitteln könnte.
Aber das schaue ich mir mal an, wenn ich ein bisschen Zeit finde um mich mit Reflection intensiver auseinanderzusetzen. | |
Re: Übergabeparameter einer Function abfragen | | | Autor: Manfred X | Datum: 21.09.11 18:36 |
| Hallo!
... und ergänzend:
Du kannst über Reflection den aktuellen Wert einer
Eigenschaft/eines Feldes bei Objekt-Instanzen ermitteln.
Funktions-Parameter besitzen aber keinen "Wert", den man
abfragen könnte, ehe die Funktion tatsächlich aufgerufen
wird (abgesehen von einem möglichen Default-Wert).
MfG
Manfred | |
Re: Übergabeparameter einer Function abfragen | | | Autor: Maurice | Datum: 21.09.11 18:51 |
| Der Sinn ist, dass ich mir den Aufwand sparen will für ca. 100 Functions mit je bis zu 10 Übergabeparametern eine individuelle Überprüfung von HasValue zu schreiben.
Im Moment müsste ich zwar nur folgenden Code-Block an den Anfang jeder Function kopieren, aber die Übergabeparameter für CheckParameters muss ich für jede Function trotzdem individuell anpassen, was sehr mühsam ist bei bis zu 10 Übergabeparametern:
If CheckParameters(a,b,c) = False Then
Return Nothing
Exit Function
End If Wenn die Performance durch Reflection stark leidet, sollte ich mir vielleicht lieber ein kleines Skript schreiben, was mir die Übergabewerte aus dem Quellcode direkt extrahiert. Damit könnte ich mir den Code-Block für jede Function individuell erzeugen lassen. | |
Re: Übergabeparameter einer Function abfragen | | | Autor: Manfred X | Datum: 21.09.11 18:55 |
| Hallo!
Warum willst Du die Parameter IN JEDER Funktion überprüfen?
Check doch vor der Durchführung der Berechnungen
das Vorhandensein der erforderlichen Werte.
MfG
Manfred | |
Re: Übergabeparameter einer Function abfragen | | | Autor: Maurice | Datum: 21.09.11 19:21 |
| Hallo Manfred,
ich schreibe ein Programm für maschinenbautechnische Berechnungen. Das Problem ist, viele Parameter können eine Eingabe vom Nutzer sein, oder auch ein Ergebnis der Berechnung. D.h. nach jeder Eingabe des Nutzers wird automatisch die komplette Berechnung ausgelöst, wobei die Reihenfolge der Funktionsaufrufe teileweise von der zuletzt durch den Nutzer geänderten Variable abhängt. Dadurch kann es vorkommen, dass einzelne Werte noch nicht gesetzt sind.
Ein globale Analyse aller Eingabekonstellation wäre für meinem Anwendungsfall viel zu komplex und fehleranfällig. Deswegen ist es einfacher, aus den Funktionsaufrufen als Ergebnis nothing zurückzubekommen, wenn eine Berechnung nicht möglich ist. In meinem Functions wird häufig auf Funktionen aus System.math zugegriffen, und die mögen es leider nicht mit nothing "gefüttert" zu werden. | |
Re: Übergabeparameter einer Function abfragen | | | Autor: Manfred X | Datum: 21.09.11 19:44 |
| Hallo!
Und was hälst Du von strukturierter Fehlerbehandlung,
also einem Try-Catch-Finally-Konstrukt um den gesamten
Berechnungsblock?
Wie verarbeitest Du, dass der Double-Datentyp beim
Auftreten von "OverFlow" und "DivisionByZero" in den
Berechnungen keine Ausnahmen auslöst?
Die Analyse der Rückgabe (auf NaN, Infinity) liefert hier
keine zuverlässige Information.
Meines Erachtens solltest Du vor den Berechnungen die
verwendeten Werte (insbesondere User-Inputs) überprüfen.
MfG
Manfred
Beitrag wurde zuletzt am 21.09.11 um 19:47:02 editiert. | |
Re: Übergabeparameter einer Function abfragen | | | Autor: Maurice | Datum: 21.09.11 20:51 |
| Hallo Manfred,
ich setze try catch bereits ein, was bei der fertig kompilierten Software auch alle Probleme löst. Nur leider Informiert mich der Debugger von Visual Studio während der Entwicklung jedesmal wenn eine exception durch nicht gesetzte Werte auftritt, auch wenn dies durch try catch abgefangen wird. Und das ist eigentlich das Problem, was ich lösen möchte. Ich könnte den Debugger zwar auch deaktivieren, aber dadurch entgehen mir dann möglichweise auch exceptions von Interesse.
Solange alle Rechenoperationen nur mit dem Typ Nullable(Of Double)) ablaufen, gibt es keine Probleme. Wie bereits geschrieben, gibt es erst Probleme wenn ich z.B. auf Funktionen von system.math zugreife, da diese nur double entgegennehmen.
Deswegen bin ich jetzt auf die eigentlich naheliegende Idee gekommen, die Funktionen die ich aus system.math verwende zu kapseln. z.B. so
Private Function sin(ByVal Value As Nullable(Of Double)) As Nullable(Of Double)
If Value.HasValue = True Then
Try
Return Math.Sin(Value)
Catch ex As Exception
Return Nothing
End Try
Else
Return Nothing
End If
End Function Gruß
Maurice | |
Re: Übergabeparameter einer Function abfragen | | | Autor: Manfred X | Datum: 21.09.11 21:10 |
| Hallo!
Ich würde anders vorgehen.
Erstelle eine Klasse "DoubleEx", die die privaten Member
_Value (Double), _HasValue (Boolean),
_MinValue (Double), _MaxValue (Double) enthält.
Im Konstruktor wird per MinValue-,MaxValue-Parameter angegeben,
was der zulässige Wertebereich dieser Klasseninstanz ist.
Im Set der Property für _Value wird geprüft, ob der zugewiesene
Wert in diesem Intervall liegt (auch Check auf IEEE-Sonderwerte)
und ggf. wird eine Exception geworfen.
Bei erfolgreicher Zuweisung wird _HasValue true.
Im Get wird geprüft, ob ein Wert vorliegt und - falls nicht -
die Exception geworfen.
Bei strukturierter Fehlerbehandlung kannst Du festlegen, welche
Exceptions aufgefangen (übergangen) werden und welche nicht
(z.B. während der Testphase des Programms). Für die DoubleEx-Klasse
kannst Du spezifische Exceptions erstellen.
MfG
Manfred
Beitrag wurde zuletzt am 21.09.11 um 21:11:05 editiert. | |
Re: Übergabeparameter einer Function abfragen | | | Autor: Maurice | Datum: 22.09.11 16:14 |
| Hallo Manfred,
Nullable(Of Double) bringt schon alles mit was ich benötige.
Ich habe jetzt, wie vorher bereits beschrieben, alle Funktionen aus system.math die ich benutze nocheinmal gekapselt. Dadurch treten jetzt auch keine Exceptions mehr auf. ...Und der Änderungsaufwand für den bestehenden Code war minimal.
gruß Maurice | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevZIP40 Pro DLL
Zippen und Unzippen wie die Profis!
Mit nur wenigen Zeilen Code statten Sie Ihre Anwendungen ab sofort mit schnellen Zip- und Unzip-Funktionen aus. Hierbei lassen sich entweder einzelnen Dateien oder auch gesamte Ordner zippen bzw. entpacken. Weitere InfosTipp des Monats Access-Tools Vol.1
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|