Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Gültigkeit überprüfen (https://www.delphipraxis.net/143876-gueltigkeit-ueberpruefen.html)

jfheins 25. Nov 2009 10:15


Gültigkeit überprüfen
 
Hallo,
ich habe gerade ine kleines Grundsatzproblem:

Meine Graph-Klasse soll sich selbst validieren können. soweit so gut. Nun war meine erste Idee:

Okay, ich schreibe eine Methode, die einen bool zurckgibt ob der Graph valide ist. Problem: Wenn er nicht valide ist weiß man nicht warum. (es gibt 4 Kriterien die erfüllt werden müssen)

2. Versuch: Ich werfe einfach eine EInvalidGraphException wenn der Graaph ungültig ist. Vorteil: Man merkt direkt wenn er ungültig wird. Nachteil: man kann nicht einfach fragen ob der Graph gültig ist, man bekommt direkt eine Exception um die Ohren.

3. Versuch:
Code:

        public bool isValid()
        {
            try
            {
                Validate();
                return true;
            }
            catch (EInvalidGraphException)
            {
                return false;
            }
        }
Aber wenn man z.B. den Hintergrund rot färben möchte wenn der Graph (noch) ungültig ist (er wird vll. gerade bearbeitet) wird jedes mal eine Exception geworfen und dann in einen Boolean "konvertiert" - unnötig.

Was ist da die beste Vorgehensweise?

himitsu 25. Nov 2009 10:20

Re: Gültigkeit überprüfen
 
Siehe WinAPI

Result = Integer

0 = OK
1 = Fehler 1
2 = zweiter Fehler
...


Und wenn es verschiedene Exceptions gibt, dann kannst du diese leicht in verschiedene Werte/Zahlen umwandeln.

jfheins 25. Nov 2009 11:14

Re: Gültigkeit überprüfen
 
Überzeugt mich noch nicht so richtig :stupid:

Weil einen Rückgabewert kann man ja ignorieren - und es soll z.B. erschwert werden dass man einen ungültigen Graph in einer Datei speichert.

man könnte netürlich in der Speicherroutine ein
Code:
if(! isvalid())
throw new InvalidGraphException();
einbauen, aber das msdn schreibt:
Zitat:

Lösen Sie außerdem keine Ausnahme aus, wenn ein Rückgabecode ausreichen würde, konvertieren Sie keinen Rückgabecode in eine Ausnahme
Ich würde also entweder gegen das erste oder gegen das zweite verstoßen ...

ele 25. Nov 2009 11:20

Re: Gültigkeit überprüfen
 
Da musst du dich halt entscheiden.
Was msdn sagt ist nicht wirklich relevant, wenn ich mir ankucke was MS alles schon für Schrott produziert hat...

Die Lösung mit den Exceptions ist doch gar nicht so schlecht. Wenn es dir auf den Keks geht, dass der Debugger dann immer anhält, kannst du ja in den Debugger-Optionen eine Ausnahme für EInvalidGraphException hinzufügen.

Ansonsten halt mit Rückgabewerten, allerdings würde ich dann schon einen Enumerationstyp dem einfachen Integer vorziehen.

jfheins 25. Nov 2009 11:53

Re: Gültigkeit überprüfen
 
Ich habs jetzt mal so gelöst:
Code:
public bool Validate(out string Reason)
{
    if (HasCycles(...))
    {
        Reason = "Es darf keine Zyklen geben.";
        return false;
    }
    // Noch mehr Checks
    return true;
}
Ist vll. n icht das gelbe vom Ei, aber ich glaube damit kann ich leben ;)

Medium 25. Nov 2009 12:04

Re: Gültigkeit überprüfen
 
Mach es doch so, dass du wenn Operationen auf dem Graph statt finden zunächst auf Validität prüfst, und ggf. eine Exception der Art "OperationOnInvalidGraphException" wirfst. Operationen sollten ja eh in Methoden der Graph-Klasse gekapselt sein, so dass du da einfach die Abfrage reinwirfst.
Die Prüfungsfunktion selbst würde ich dann zusätzlich sichtbar machen, so dass der Benutzer der Klasse auch ohne OP auszuführen prüfen kann, und dann gibst du entweder ein Enum bzw. Set mit den Invaliditätskriterien zurück, oder du splittest das ganze in N Prüfungsmethoden, je eine pro Kriterium die dann nen bool zurückgeben.

Zudem könntest du deinen Graphoperationen noch einen (optionalen, default true) Parameter spendieren, der die Prüfung auf Wunsch deaktiviert. Dass das dann auf eigene Gefahr des Benutzers der Klasse geht sollte dann noch wo erwähnt werden ;) (evtl. sogar per Compilerwarnung).


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz