Thread Datenvalidierung mit Transaktion - Wie am besten Ablauf verketten? (10 answers)
Opened by sid burn at 2009-05-29 14:17

sid burn
 2009-05-29 14:17
#122070 #122070
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Hi,
sry für die vielleicht etwas Dumme überschrift aber etwas besseres ist mir nicht eingefallen, aber es kommt schon so ähnlich in die Richtigung was ich machen möchte.

Ich habe mir vorgenommen ein CPAN Modul zu schreiben das Daten Validiert, hauptsächlich deswegen weil ich mit keiner Lösung die auf dem CPAN bereits existiert zu frieden bin. Ich habe mir Gestern dazu einige Konzepte überlegt. Primär soll die komplette Validierung Exception basiert sein. Daher fällt ein Check fehl wirft es Exception Objekte die dann später noch genauer Untersucht werden können. Das ganze wäre nicht weiter schwierig, allerdiengs möchte man ja auch öfters mal mehrere Checks hintereinander ausführen und zum schluß eine Zusammenfassung aller Fehler bekommen. Im Sinne von Exceptions wäre es aber Toll wenn trotzdem noch automatisiert bei einem fehler eben eine exception geworfen wird ohne zutun. Genau hier liegt mein Problem da ich nicht weiß ob soetwas überhaupt machbar wäre.

Nehmen wir folgenden Pseudo-Code an:

Code (perl): (dl )
1
2
3
4
5
$validate
  ->check(...)
  ->check(...)
  ->check(...)
  ->check(...);


Es wäre also Toll wenn alle checks ersteinmal durchlaufen und dann ganz zum schluß erst eine Exception geworfen wird wenn irgendeine Validierung fehlgeschlagen ist. Dafür müsste ich allerdiengs Wissen das hinter einem check() Aufruf ein weiterer kommt, und ich müste wissen ob ein check aufruf der letzte aufruf in der kette ist. Ist soetwas möglich?

Zum mitteilen das nun eine reihe von checks folgen könnte man ja eine zusätzliche routine setzen, also soetwas.

Code (perl): (dl )
1
2
3
4
$validate
  ->assemble()
  ->check(...)
  ->check(...);


So das er durch die assemble() funktion weiß das jetzt eine reihe von checks kommen, das wäre denke ich noch okay. Eine erweiterung das man es noch abschließen muss und dieses dann eine exception wirft oder nicht wäre natürlich die simpelste lösung.

Code (perl): (dl )
1
2
3
4
5
$validate
  ->assemble()
  ->check(...)
  ->check(...)
  ->result();


Allerdiengs hat man hier den nachteil das man das result() vergessen kann, und damit würde das ganze Exception Handling auser Kraft gesetzt werden.

Ich hatte mir schon eine andere Möglichkeit überlegt einen neuen Kontext zu erstellen.
Code (perl): (dl )
1
2
3
4
5
6
eval {
  my $context = $validate->assemble();
  $validate
    ->check(...)
    ->check(...);
};


So das wenn $context aus dem Scope läuft DESTROY() aufgerufen wird, dieser das Checking vornimmt, und dann DESTROY eine Exception wirft oder nicht. Daher auch dieser Thread hier: http://www.perl-community.de/bat/poard/thread/1358...

Aber anscheind geht dieser Weg auch nicht. Irgendjemand eine Idee ob das Möglich ist was ich mir vorstelle?

Wenn absolut gar nichts mehr geht werden ich wohl auf eine anonyme Subroutine zurück greifen, also soewtas in der art.

Code (perl): (dl )
1
2
3
4
5
6
$validate->assemble(sub{
  $validate
    ->check(...)
    ->check(...)
    ->check(...);
});


Allerdiengs bin ich darüber nicht ganz so Glücklich. Irgendjemand noch andere gut Ideen oder Einfälle?
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de

View full thread Datenvalidierung mit Transaktion - Wie am besten Ablauf verketten?