Frage

Ich frage mich, ob das eine gute Idee ist Überprüfungen In Getter Und Setter, oder anderswo im Code.

Das könnte Sie überraschen, wenn es darum geht Optimierungen Und Geschwindigkeitsüberschreitung Wenn Sie den Code hochfahren, sollten Sie meines Erachtens keine Überprüfungen in Gettern und Settern durchführen, sondern in dem Code, in dem Sie sich befinden Aktualisierung Ihre Dateien oder Datenbank.Liege ich falsch?

War es hilfreich?

Lösung

Nun, einer der Gründe, warum Klassen normalerweise private Mitglieder mit öffentlichen Getter/Setter enthalten, liegt genau darin, dass sie Daten überprüfen können.

Wenn Sie eine Zahl haben, die zwischen 1 und 100 liegen kann, würde ich auf jeden Fall etwas in den Setter einfügen, das das validiert, und dann vielleicht eine Ausnahme auslösen, die vom Code abgefangen wird.Der Grund ist einfach:Wenn Sie dies nicht im Setter tun, müssen Sie bei jedem Festlegen die Beschränkung von 1 bis 100 berücksichtigen, die zu doppeltem Code führt oder, wenn Sie ihn vergessen, zu einem ungültigen Status führt.

Was die Leistung angeht, stimme ich Knuth hier zu:

„Wir sollten kleine Effizienzgewinne vergessen, sagen wir etwa 97 % der Zeit:Vorzeitige Optimierung ist die Wurzel allen Übels.“

Andere Tipps

@Terrapin, zu:

Wenn Sie nur eine Reihe von [einfachen öffentlichen Set/Get] -Heurmen haben ...Sie könnten genauso gut Felder sein

Eigenschaften haben gegenüber Feldern weitere Vorteile.Es handelt sich um einen expliziteren Vertrag, sie sind serialisiert, sie können später debuggt werden, sie sind ein guter Ort für Erweiterungen durch Vererbung.Die klobigere Syntax ist eine zufällige Komplexität – .net 3.5 beispielsweise überwindet diese.

Eine gängige (und fehlerhafte) Praxis besteht darin, mit öffentlichen Feldern zu beginnen und diese später nach Bedarf in Grundstücke umzuwandeln.Dadurch wird Ihr Vertrag mit jedem gebrochen, der Ihre Klasse konsumiert. Daher ist es am besten, mit den Eigenschaften zu beginnen.

Es kommt darauf an.

Im Allgemeinen sollte Code schnell fehlschlagen.Wenn der Wert durch mehrere Punkte im Code festgelegt werden kann und Sie die Validierung erst nach dem Abrufen des Werts durchführen, 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.

Im Hinblick auf den am besten wartbaren Code denke ich, dass Sie im Setter einer Eigenschaft so viel Validierung wie möglich durchführen sollten.Auf diese Weise werden ungültige Daten nicht zwischengespeichert oder auf andere Weise verarbeitet.

Denn genau dafür sind Immobilien gedacht.Wenn Sie nur eine Reihe von Immobilien haben, wie ...

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

...es könnten genauso gut Felder sein

Vielleicht möchten Sie einen Blick darauf werfen Domänengesteuertes Design, von Eric Evans.DDD hat diese Vorstellung einer Spezifikation:

...Explizite Prädikat-ähnliche Wertobjekte für spezielle Zwecke.Eine Spezifikation ist ein Prädikat, das feststellt, ob ein Objekt einige Kriterien erfüllt oder nicht.

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

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

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

Sie benötigen keinerlei Validierung für den Getter, da die Informationen zum Objekt bereits als gültig gelten.

Speichern Sie Ihre Validierung nicht bis zu einem Datenbank-Update!!Es ist besser zu scheitern schnell.

Ich setze gerne um IDataErrorInfo und füge meine Validierungslogik in die Eigenschaften „Error“ und „this[columnName]“ ein.Wenn Sie auf diese Weise programmgesteuert prüfen möchten, ob ein Fehler vorliegt, können Sie 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.

Ich versuche, meine Objekte niemals in einen ungültigen Zustand zu versetzen, sodass Setter auf jeden Fall eine Validierung sowie alle Methoden haben, die den Zustand ändern.Auf diese Weise muss ich mir nie Sorgen machen, dass das Objekt, mit dem ich arbeite, ungültig ist.Wenn Sie Ihre Methoden als Validierungsgrenzen beibehalten, müssen Sie sich nie um überall verstreute Validierungs-Frameworks und IsValid()-Methodenaufrufe kümmern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top