AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Gültigkeit überprüfen

Ein Thema von jfheins · begonnen am 25. Nov 2009 · letzter Beitrag vom 25. Nov 2009
Antwort Antwort
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#1

Gültigkeit überprüfen

  Alt 25. Nov 2009, 11:15
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#2

Re: Gültigkeit überprüfen

  Alt 25. Nov 2009, 11:20
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#3

Re: Gültigkeit überprüfen

  Alt 25. Nov 2009, 12:14
Überzeugt mich noch nicht so richtig

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 ...
  Mit Zitat antworten Zitat
ele

Registriert seit: 18. Feb 2009
129 Beiträge
 
Delphi 2010 Professional
 
#4

Re: Gültigkeit überprüfen

  Alt 25. Nov 2009, 12:20
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.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#5

Re: Gültigkeit überprüfen

  Alt 25. Nov 2009, 12:53
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
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: Gültigkeit überprüfen

  Alt 25. Nov 2009, 13:04
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).
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz