Datenprüfungen in Getter / Setter oder anderswo?

stimmen
9

Ich frage mich , ob es eine gute Idee , um Überprüfungen in Getter und Setter oder an anderer Stelle im Code.

Dies könnte Sie überraschen, wenn es darum geht , Optimierungen und beschleunigt den Code, ich glaube , Sie sollten nicht Prüfungen in Getter und Setter, aber in dem Code , in dem Sie die Aktualisierung Ihrer Dateien oder Datenbank. Liege ich falsch?

Veröffentlicht am 05/08/2008 um 20:51
quelle vom benutzer
In anderen Sprachen...                            


8 antworten

stimmen
13

Nun, eine der reaons warum Klassen in der Regel private Mitglieder mit öffentlichen Getter / Setter enthalten ist genau, weil sie Daten überprüfen können.

Wenn Sie eine Nummer haben, als zwischen 1 und 100 sein kann, würde ich auf jeden Fall etwas in dem Setter setzen, die das bestätigt und dann vielleicht eine Ausnahme, die durch den Code gefangen wird. Der Grund ist einfach: Wenn Sie es in dem Setter nicht tun, müssen Sie daran denken, dass 1 bis 100 Begrenzung jedes Mal, wenn es festgelegt, die duplizierten Code führt oder wenn Sie es vergessen hat, es führt zu einem ungültigen Zustand.

Was die Leistung, ich bin hier mit Knuth:

„Wir sollten über kleine Effizienz, sagen sie etwa 97% der Zeit vergessen. Vorzeitige Optimierung ist die Wurzel aller Übel“

Beantwortet am 05/08/2008 um 20:59
quelle vom benutzer

stimmen
4

@Terrapin, Re:

Wenn alles, was Sie haben ein Bündel von [einfachen öffentlichen set / get] Eigenschaften ist ... sie könnten auch Felder sein

Eigenschaften haben weitere Vorteile gegenüber Feldern. Sie sind ein deutlicher Auftrag, sie sind serialisiert, können sie später getestet werden, sind sie ein schöner Ort für die Erweiterung durch Vererbung. Die clunkier Syntax ist eine zufällige Komplexität - .net 3.5 zum Beispiel diese überwindet.

Eine gemeinsame (und fehlerhaft) Praxis ist mit dem öffentlichen Bereichen zu beginnen, und sie in Eigenschaften später auf einem ‚nach Bedarf‘ -Basis. Dies bricht Ihren Vertrag mit jedem, der Ihre Klasse verbraucht, so ist es am besten mit Eigenschaften zu starten.

Beantwortet am 08/08/2008 um 01:07
quelle vom benutzer

stimmen
3

Es kommt darauf an.

Im Allgemeinen sollte Code schnell scheitern. Wenn der Wert kann durch mehrere Punkte im Code festgelegt werden und Sie bestätigen nur auf, nachdem Sie den Wert abrufen, erscheint der Fehler im Code zu sein, die das Update tut. Wenn die Einrichter die Eingabe bestätigen, wissen Sie, was Code ungültige Werte zu setzen versucht.

Beantwortet am 05/08/2008 um 20:59
quelle vom benutzer

stimmen
3

Aus der Perspektive der die meisten wartbaren Code mit, ich glaube, Sie sollten so viel Validierung tun, wie Sie in der Setter einer Immobilie. Auf diese Weise werden Sie nicht sein das Caching oder anderweitig mit ungültigen Daten handeln.

Schließlich ist es das, was Eigenschaften für gemeint sind. Wenn alles, was Sie haben, ist eine Reihe von Eigenschaften wie ...

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

... sie könnten auch Felder sein

Beantwortet am 05/08/2008 um 20:59
quelle vom benutzer

stimmen
1

Ich versuche, nie einen ungültigen Zustand meiner Objekte geben zu lassen, so Setter definitiv Validierung sowie alle Methoden haben würde, die ihren Zustand ändern. Auf diese Weise habe ich nie Sorgen machen, dass das Objekt, das ich mit zu tun habe ist ungültig. Wenn Sie Ihre Methoden wie Validierung Grenzen halten, dann müssen Sie nie ganz über den Platz bestreut über Validierungsrahmen und IsValid () -Methode Anrufe kümmern.

Beantwortet am 23/09/2008 um 20:44
quelle vom benutzer

stimmen
1

Ich mag implementieren IDataErrorInfo und meine Validierungslogik in ihren Fehlern setzen und diese [column] Eigenschaften. Auf diese Weise , wenn Sie programmatisch überprüfen möchten , ob es ein Fehler , den Sie einfach eine dieser beiden Eigenschaften in Code testen, oder Sie die Validierung aus den Daten von Hand in Web Forms, Windows Forms oder WPF verbindlich.

WPF „ValidatesOnDataError“ Binding Eigenschaft macht dies besonders einfach.

Beantwortet am 07/08/2008 um 23:24
quelle vom benutzer

stimmen
1

Sie könnten überprüfen wollen Domain Driven 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, wenn ein Objekt bestimmt tut oder nicht, einige Kriterien erfüllen.

Ich denke, schnell Fehler ist eine Sache, die andere ist, wo für die Validierung, die Logik zu halten. Die Domain ist der richtige Ort, um die Logik zu halten, und ich denke, ein Information Objekt oder eine Validate-Methode auf Ihren Domain-Objekten ein guter Platz sein würde.

Beantwortet am 05/08/2008 um 21:03
quelle vom benutzer

stimmen
1

Die Validierung sollte getrennt von Getter oder Einrichter in einem Validierungsverfahren erfasst werden. Auf diese Weise, wenn die Validierung über mehrere Komponenten wiederverwendet werden muss, ist es verfügbar.

Wenn der Setter genannt wird, ein solcher Validierungsdienst sollte Eingang in das Objekt zu sanieren genutzt werden. So können Sie alle Informationen in einem Objekt gespeichert wissen, ist zu allen Zeiten gültig.

Sie brauchen keine Art von Bestätigung für den Getter, weil Informationen über das Objekt bereits gültig sein vertrauenswürdig ist.

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

Beantwortet am 05/08/2008 um 20:55
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more