Sie würden das DRY-Prinzip brechen, indem Sie diese Validierungslogik überall dort einsetzen, wo eine Postleitzahl verwendet wird.
Wenn Sie jedoch mit vielen verschiedenen Ländern und deren unterschiedlichen Postleitzahlensystemen zu tun haben, können Sie eine Postleitzahl nur dann validieren, wenn Sie das betreffende Land kennen. Ihre ZipCode
Klasse muss also auch das Land speichern.
Aber speichern Sie das Land dann separat als Teil Address
der Postleitzahl (zu der auch die Postleitzahl gehört) und als Teil der Postleitzahl (zur Validierung)?
- Wenn Sie dies tun, verletzen Sie auch DRY. Selbst wenn Sie es nicht als DRY-Verletzung bezeichnen (weil jede Instanz einem anderen Zweck dient), verbraucht es unnötigerweise zusätzlichen Speicher, und es öffnet sich die Tür für Fehler, wenn die beiden Länderwerte unterschiedlich sind (was sie logischerweise niemals sollten) Sein).
- Oder alternativ müssen Sie die beiden Datenpunkte synchronisieren, um sicherzustellen, dass sie immer gleich sind. Dies legt nahe, dass Sie diese Daten wirklich an einem einzigen Punkt speichern sollten, um den Zweck zu umgehen.
- Wenn Sie dies nicht tun, dann ist es keine
ZipCode
Klasse, sondern eine Address
Klasse, die wieder eine enthält, string ZipCode
was bedeutet, dass wir den Kreis geschlossen haben.
Beispielsweise kann ich mit einem Geschäftsanalysten über eine Postleitzahl anstelle einer Zeichenfolge sprechen, die eine Postleitzahl enthält.
Der Vorteil ist, dass Sie bei der Beschreibung des Domänenmodells darüber sprechen können.
Ich verstehe Ihre zugrunde liegende Behauptung nicht, dass Sie, wenn eine Information einen bestimmten Variablentyp hat, irgendwie verpflichtet sind, diesen Typ zu erwähnen, wenn Sie mit einem Geschäftsanalysten sprechen.
Warum? Warum können Sie nicht einfach über "die Postleitzahl" sprechen und den bestimmten Typ komplett weglassen? Welche Art von Gesprächen führen Sie mit Ihrem (nicht technischen!) Geschäftsanalysten, bei denen die Art der Immobilie für das Gespräch ausschlaggebend ist?
Woher ich komme, sind Postleitzahlen immer numerisch. Wir haben also die Wahl, wir könnten es als int
oder als speichern string
. Wir neigen dazu, eine Zeichenfolge zu verwenden, da keine mathematischen Operationen für die Daten zu erwarten sind, aber noch nie von einem Geschäftsanalysten angegeben wurde, dass es sich um eine Zeichenfolge handeln muss. Diese Entscheidung ist dem Entwickler überlassen (oder wohl dem technischen Analysten, obwohl er sich meiner Erfahrung nach nicht direkt mit dem Problem auseinandersetzt).
Ein Geschäftsanalyst kümmert sich nicht um den Datentyp, solange die Anwendung das tut, was von ihr erwartet wird.
Validierung ist ein schwieriges Unterfangen, da es sich auf das stützt, was Menschen erwarten.
Zum einen stimme ich dem Validierungsargument nicht zu, um zu zeigen, warum primitive Besessenheit vermieden werden sollte, da ich nicht der Meinung bin, dass (als universelle Wahrheit) Daten immer zu jeder Zeit validiert werden müssen.
Was ist zum Beispiel, wenn dies eine kompliziertere Suche ist? Was passiert, wenn Sie bei der Validierung keine einfache Formatprüfung durchführen, sondern eine externe API kontaktieren und auf eine Antwort warten? Möchten Sie Ihre Anwendung wirklich dazu zwingen, diese externe API für jedes von ZipCode
Ihnen instanziierte Objekt aufzurufen ?
Vielleicht ist es eine strenge Geschäftsanforderung, und dann ist es natürlich gerechtfertigt. Dies ist jedoch keine universelle Wahrheit. Es wird viele Anwendungsfälle geben, in denen dies eher eine Belastung als eine Lösung darstellt.
Als zweites Beispiel, wenn Sie Ihre Adresse in ein Formular eingeben, ist es üblich, Ihre Postleitzahl vor Ihrem Land einzugeben. Es ist zwar schön, ein sofortiges Feedback zur Validierung in der Benutzeroberfläche zu haben, aber es würde mich (als Benutzer) tatsächlich behindern, wenn die Anwendung mich auf ein "falsches" Postleitzahlformat aufmerksam macht, da die eigentliche Ursache des Problems (z. B.) darin besteht Mein Land ist nicht das Land, das standardmäßig ausgewählt ist. Daher wurde die Validierung für das falsche Land durchgeführt.
Es ist die falsche Fehlermeldung, die den Benutzer ablenkt und unnötige Verwirrung stiftet.
Genauso wie die ständige Validierung keine universelle Wahrheit ist, sind es auch meine Beispiele. Es ist kontextabhängig . Einige Anwendungsdomänen erfordern vor allem eine Datenüberprüfung. In anderen Domänen steht die Validierung nicht so weit oben auf der Prioritätenliste, da der damit verbundene Aufwand im Widerspruch zu den tatsächlichen Prioritäten steht (z. B. Benutzererfahrung oder die Möglichkeit, fehlerhafte Daten zunächst zu speichern, damit sie korrigiert werden können, anstatt sie niemals zuzulassen) gelagert)
Geburtsdatum: Vergewissern Sie sich, dass das Geburtsdatum größer als der Mindate und kleiner als das heutige Datum ist.
Gehalt: Überprüfen Sie, dass größer oder gleich Null ist.
Das Problem bei diesen Validierungen ist, dass sie unvollständig, redundant sind oder auf ein viel größeres Problem hinweisen .
Das Überprüfen, ob ein Datum größer als der Mindate ist, ist überflüssig. Der Mindate bedeutet wörtlich, dass es das kleinstmögliche Datum ist. Und wo ziehen Sie die relevante Linie? Was bringt es, zu verhindern, DateTime.MinDate
aber zu erlauben DateTime.MinDate.AddSeconds(1)
? Sie wählen einen bestimmten Wert aus, der im Vergleich zu vielen anderen Werten nicht besonders falsch ist.
Mein Geburtstag ist der 2. Januar 1978 (ist es nicht, aber nehmen wir an, es ist es). Angenommen, die Daten in Ihrer Bewerbung sind falsch. Stattdessen heißt es, dass ich Geburtstag habe:
- 1. Januar 1978
- 1. Januar 1722
- 1. Januar 2355
Alle diese Daten sind falsch. Keiner von ihnen ist "richtiger" als der andere. Ihre Validierungsregel würde jedoch nur eines dieser drei Beispiele aufgreifen.
Sie haben auch den Kontext, wie Sie diese Daten verwenden, vollständig weggelassen. Wenn dies zB in einem Geburtstagserinnerungs-Bot verwendet wird, würde ich sagen, dass die Validierung sinnlos ist, da es keine besonders schlechten Konsequenzen gibt, wenn ein falsches Datum eingegeben wird.
Handelt es sich hingegen um Regierungsdaten und benötigen Sie das Geburtsdatum, um die Identität einer Person zu bestätigen (und wenn Sie dies nicht tun, hat dies schlimme Konsequenzen, z. B. die Verweigerung der sozialen Sicherheit einer Person), ist die Richtigkeit der Daten von größter Bedeutung und muss vollständig überprüft werden Überprüfen Sie die Daten. Die vorgeschlagene Validierung, die Sie jetzt haben, ist nicht ausreichend.
Für ein Gehalt gibt es einen gesunden Menschenverstand, der nicht negativ sein kann. Wenn Sie jedoch realistisch davon ausgehen, dass unsinnige Daten eingegeben werden, würde ich vorschlagen, dass Sie die Quelle dieser unsinnigen Daten untersuchen. Denn wenn Sie nicht vertrauen können, dass sie sensible Daten eingeben, können Sie auch nicht vertrauen, dass sie korrekte Daten eingeben .
Wenn stattdessen das Gehalt von Ihrer Bewerbung berechnet wird und es irgendwie möglich ist, eine negative (und korrekte) Zahl zu erhalten, ist es besser Math.Max(myValue, 0)
, negative Zahlen in 0 umzuwandeln, als die Validierung nicht zu bestehen. Denn wenn Ihre Logik entscheidet, dass das Ergebnis eine negative Zahl ist, bedeutet ein Fehlschlagen der Validierung, dass die Berechnung erneut durchgeführt werden muss, und es besteht kein Grund zu der Annahme, dass beim zweiten Mal eine andere Zahl erstellt wird.
Und wenn es zu einer anderen Zahl kommt, können Sie wiederum vermuten, dass die Berechnung nicht konsistent ist und daher nicht als vertrauenswürdig eingestuft werden kann.
Dies soll nicht heißen, dass die Validierung nicht nützlich ist. Aber sinnlose Validierung ist schlecht, weil sie Mühe kostet, während sie ein Problem nicht wirklich löst, und den Menschen ein falsches Sicherheitsgefühl vermittelt.