optimization - Datenüberprüfungen in Getter / Setter oder anderswo?

Translate

Ich frage mich, ob es eine gute Idee istÜberprüfungenimGetterundSetteroder an anderer Stelle im Code.

Dies könnte Sie überraschen, wenn es darum gehtOptimierungenundBeschleunigenIch denke, Sie sollten keine Überprüfungen in Getter und Setter vornehmen, sondern in dem Code, in dem Sie sich befindenAktualisierungIhre Dateien oder Datenbank. Liege ich falsch?

This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

Nun, einer der Gründe, warum Klassen normalerweise private Mitglieder mit öffentlichen Gettern / Setzern enthalten, ist genau, weil sie Daten verifizieren können.

Wenn Sie eine Zahl haben, die zwischen 1 und 100 liegen kann, würde ich definitiv etwas in den Setter setzen, das dies bestätigt, und dann möglicherweise eine Ausnahme auslösen, die vom Code abgefangen wird. Der Grund ist einfach: Wenn Sie dies nicht im Setter tun, müssen Sie sich daran erinnern, dass jedes Mal, wenn Sie es einstellen, eine Beschränkung von 1 auf 100 vorliegt, was zu doppeltem Code führt oder wenn Sie ihn vergessen, zu einem ungültigen Zustand führt.

Was die Leistung betrifft, bin ich hier bei Knuth:

"Wir sollten kleine Wirkungsgrade vergessen, etwa in 97% der Fälle: Vorzeitige Optimierung ist die Wurzel allen Übels."

Quelle
Translate

@ Terrapin, re:

Wenn Sie nur eine Reihe von [einfachen öffentlichen Set / Get] -Eigenschaften haben, können dies auch Felder sein

Eigenschaften haben andere Vorteile gegenüber Feldern. Sie sind ein expliziterer Vertrag, sie sind serialisiert, sie können später debuggt werden, sie sind ein guter Ort für eine Erweiterung durch Vererbung. Die klobigere Syntax ist eine zufällige Komplexität - .net 3.5 überwindet dies beispielsweise.

Eine übliche (und fehlerhafte) Praxis besteht darin, mit öffentlichen Feldern zu beginnen und diese später nach Bedarf in Eigenschaften umzuwandeln. Dies bricht Ihren Vertrag mit jedem, der Ihre Klasse konsumiert. Beginnen Sie also am besten mit den Eigenschaften.

Quelle
Translate

Es hängt davon ab, ob.

Im Allgemeinen sollte Code schnell fehlschlagen. Wenn der Wert durch mehrere Punkte im Code festgelegt werden kann und Sie erst nach dem Abrufen des Werts validieren, scheint der Fehler im Code zu liegen, der die Aktualisierung durchführt. Wenn die Setter die Eingabe validieren, wissen Sie, welcher Code versucht, ungültige Werte festzulegen.

Quelle
Translate

Unter dem Gesichtspunkt, den am besten zu wartenden Code zu haben, sollten Sie im Setter einer Eigenschaft so viel Validierung wie möglich durchführen. Auf diese Weise werden Sie keine ungültigen Daten zwischenspeichern oder anderweitig verarbeiten.

Denn dafür sind Eigenschaften gedacht. Wenn alles, was Sie haben, eine Reihe von Eigenschaften wie ...

public string Name
{
    get
    {
        return _name;
    }
    set
    {
        _name = value;
    }
}

... sie könnten genauso gut Felder sein

Quelle
Translate

Vielleicht möchten Sie auscheckenDomain Driven Designvon Eric Evans. DDD hat diesen Begriff einer Spezifikation:

... explizite prädikatenähnliche WERTOBJEKTE für spezielle Zwecke. Eine SPEZIFIKATION ist ein Prädikat, das bestimmt, ob ein Objekt bestimmte Kriterien erfüllt oder nicht.

Ich denke, schnelles Scheitern ist eine Sache, die andere ist, wo die Logik für die Validierung aufbewahrt wird. Die Domäne ist der richtige Ort, um die Logik beizubehalten, und ich denke, ein Spezifikationsobjekt oder eine Validierungsmethode für Ihre Domänenobjekte wäre ein guter Ort.

Quelle
Translate

Die Validierung sollte in einer Validierungsmethode getrennt von Gettern oder Setzern erfasst werden. Auf diese Weise ist die Validierung verfügbar, wenn sie für mehrere Komponenten wiederverwendet werden muss.

Wenn der Setter aufgerufen wird, sollte ein solcher Validierungsdienst verwendet werden, um die Eingabe in das Objekt zu bereinigen. Auf diese Weise wissen Sie, dass alle in einem Objekt gespeicherten Informationen jederzeit gültig sind.

Sie benötigen keine Validierung für den Getter, da Informationen zum Objekt bereits als gültig eingestuft werden.

Speichern Sie Ihre Validierung erst nach einem Datenbank-Update! Es ist besser zuschnell scheitern.

Quelle
Translate

Ich implementiere gerneIDataErrorInfound setzen Sie meine Validierungslogik in die Eigenschaften Error und this [columnName]. Auf diese Weise können Sie, wenn Sie programmgesteuert prüfen möchten, ob ein Fehler vorliegt, einfach eine dieser Eigenschaften im Code testen oder die Validierung an die Datenbindung in Web Forms, Windows Forms oder WPF übergeben.

Die Bindungseigenschaft "ValidatesOnDataError" von WPF macht dies besonders einfach.

Quelle
Translate

Ich versuche, meine Objekte niemals in einen ungültigen Zustand zu versetzen, so dass Setter definitiv eine Validierung haben würden sowie alle Methoden, die den Zustand ändern. Auf diese Weise muss ich mir keine Sorgen machen, dass das Objekt, mit dem ich mich befasse, ungültig ist. Wenn Sie Ihre Methoden als Validierungsgrenzen beibehalten, müssen Sie sich nie um Validierungsframeworks und IsValid () -Methodenaufrufe kümmern, die überall verteilt sind.

Quelle