Bewährte Methode zum Zurückgeben zusätzlicher Informationen aus einer Validate-Funktion

8

Ich habe einen Klassenangestellten. Ich möchte es validieren (), bevor ich es speichere, um sicherzustellen, dass alle Felder mit gültigen Werten gefüllt sind. Der Benutzer der Klasse kann Validate () aufrufen, bevor sie Save () aufrufen, oder sie können Save () direkt aufrufen, und Save () ruft dann Validate () auf und löst wahrscheinlich eine Exception aus, wenn die Validierung fehlschlägt.

Nun, meine (Haupt-) Frage ist das;
Wenn meine Validate () - Funktion einen einfachen Bool zurückgibt, wie sage ich dann dem Benutzer der Klasse, was falsch ist, dh "Email nicht ausgefüllt", "ID nicht eindeutig" usw. Für die Zwecke von diesem möchte ich nur die Fehlerzeichenfolgen an den menschlichen Benutzer weitergeben, aber das Prinzip ist das gleiche, wenn ich eine Liste von Fehlercodes haben wollte (abgesehen davon, dass die Verwendung einer Bitmap logischer ist).

  • Ich könnte einen Out-Parameter in meiner Validate-Funktion verwenden, aber ich verstehe, dass das verpönt ist.
  • Anstatt ein bool zurückzugeben, könnte ich ein String-Array von meiner Funktion zurückgeben und nur testen, ob es leer war (dh keine Fehler) - aber das scheint chaotisch und nicht richtig.
  • Ich könnte ein Struct erstellen, nur um von dieser Methode zurückzukehren, einschließlich eines Bool und eines String-Arrays mit Fehlermeldungen, aber scheint nur klobig.
  • Ich könnte ein Bitmap von Fehlercodes anstelle von einem bool zurückgeben und es nachschlagen, aber das scheint ziemlich exzessiv.
  • Ich könnte eine öffentliche Eigenschaft "ValidationErrors" für das Objekt erstellen, das die Fehler enthält. Dies würde jedoch davon abhängen, dass ich Validate () aufruft, bevor ich es lese oder explizit Validate von der Property () aufruft, was ein wenig verschwenderisch ist.

Mein spezifisches Programm ist in C #, aber das sieht nach einer ziemlich generischen "Best Practice" -Frage aus und ich bin mir sicher, dass ich die Antwort darauf wissen sollte. Jeder Rat wurde dankbar angenommen.

    
Frans 25.06.2009, 12:11
quelle

8 Antworten

5

Ich würde wahrscheinlich für die Bitmap-Option gehen. Einfach

%Vor%

... und im aufrufenden Code einfach:

%Vor%

Scheint nett und kompakt zu mir.

    
Manne 25.06.2009, 12:17
quelle
6
  

Ich könnte ein Struct erzeugen, nur um von dieser Methode zurückzukommen, einschließlich eines Bool und eines String-Arrays mit Fehlermeldungen, aber es scheint einfach klobig.

Warum scheint es klobig? Das Erstellen eines geeigneten Typs zum Einkapseln der Informationen ist perfekt. Ich würde nicht unbedingt eine Zeichenfolge verwenden, um solche Informationen zu kodieren. Ein enum könnte besser geeignet sein.

Eine Alternative wäre die Unterklasse des Rückgabetyps und die Bereitstellung einer zusätzlichen untergeordneten Klasse für jeden Fall - falls dies angemessen ist. Wenn mehr als ein Fehler gemeldet werden kann, ist ein Array in Ordnung. Aber ich würde das auch in einen eigenen Typ einkapseln.

Das allgemeine Muster könnte so aussehen:

%Vor%     
Konrad Rudolph 25.06.2009 12:15
quelle
2

Klingt so, als ob Sie eine generische Klasse benötigen:

%Vor%     
Doug McClean 25.06.2009 12:28
quelle
1

Ich würde dem Muster der TryParse-Methoden folgen und eine Methode mit dieser Signatur verwenden:

%Vor%

Eine andere Option besteht darin, den Validierungscode aus dem Objekt in seine eigene Klasse zu ziehen, möglicherweise aufbauend auf dem Spezifikationsmuster.

%Vor%     
Jamie Ide 25.06.2009 12:17
quelle
1

Ich habe einen guten Ansatz gefunden, einfach eine Methode (oder eine Eigenschaft, da C # eine gute Unterstützung dafür hat) zu haben, die alle Validierungsfehlermeldungen in einer Art vernünftigem, einfach zu verwendendem Format, wie einer Liste von Saiten.

Auf diese Weise können Sie auch sicherstellen, dass Ihre Validierungsmethode bools zurückgibt.

    
Jani Hartikainen 25.06.2009 12:19
quelle
1

Sie können sich die CSLA von Rockford Lhotka ansehen, die eine umfassende Geschäftsregel / Validierungsverfolgung für Geschäftsobjekte enthält.

www.lhotka.net

    
Chris W 25.06.2009 12:30
quelle
1

Ich stimme Chris W. zu. Ich habe die gleichen Fragen gestellt, bevor ich Rockys Expert C # Business Objects gelesen habe.

Er hat eine hervorragende Möglichkeit, Geschäftsvalidierungsregeln zu handhaben. Die Validierung wird durchgeführt, nachdem jede Eigenschaft festgelegt wurde. Wenn eine Regel verletzt wird, wird der Status des Objekts InValid.

Ihre Business Class kann die IDataError-Schnittstelle implementieren. Wenn Sie Ihre UI-Steuerelemente mit den Eigenschaften Ihres Geschäftsobjekts verknüpfen, werden Sie Ihr ErrorProvider-Steuerelement über alle fehlerhaften Regeln für Ihr Objekt informieren.

Ich würde wirklich empfehlen, dass Sie sich die Zeit nehmen und den Validierungsabschnitt anschauen.

    
MegaByte 25.06.2009 12:34
quelle
0

Wir verwenden die Spring-Validierung zusammen mit einem Windows Forms-Fehleranbieter.

Also gibt unsere Validierungsfunktion ein Wörterbuch mit einer Kontroll-ID und einer Fehlermeldung (für jeden Validierungsfehler) zurück. Der Fehleranbieter zeigt die Fehlermeldung in einem Popup-Feld in der Nähe des Steuerelements an, das den Fehler verursacht hat.

Ich habe in der Vergangenheit einige andere Validierungsschemata verwendet - aber dieses funktioniert wirklich gut.

    
bernhardrusch 25.06.2009 12:18
quelle

Tags und Links