Stimmt es, dass ich Dinge in einem Property Accessor nicht lange ausführen sollte?

8

Und wenn ja, warum? und was macht "long running" aus?

Magie in einem Property Accessor zu wirken, scheint mir mein Vorrecht als Klassenkünstler zu sein. Ich dachte immer, das ist der Grund, warum die Designer von C # diese Dinge dort hineingelegt haben - damit ich machen konnte, was ich wollte.

Natürlich ist es eine gute Übung, die Überraschungen für die Benutzer einer Klasse zu minimieren, und so ist die Einbettung wirklich lang laufender Dinge - z. B. eine 10-minütige Monte Carlo-Analyse - sinnvoll.

Angenommen, ein Prop-Accessor benötigt einen DB-Read. Ich habe bereits die db Verbindung geöffnet. Wäre der Zugriffscode für db innerhalb der normalen Erwartungen in einem Property Accessor "akzeptabel"?

    
Cheeso 19.05.2009, 15:37
quelle

8 Antworten

22

Wie Sie bereits erwähnt haben, ist es eine Überraschung für den Benutzer der Klasse. Die Leute sind es gewohnt, Dinge wie diese mit Eigenschaften zu tun (konstruiertes Beispiel folgt:)

%Vor%

Das sieht sehr natürlich aus, aber wenn item.Value tatsächlich die Datenbank bei jedem Zugriff trifft, wäre das ein kleines Desaster und sollte in einer ähnlichen Weise geschrieben werden:

%Vor%

Bitte helfen Sie, Leute, die Ihren Code verwenden, von versteckten Gefahren wie diesem abzulenken und langsame Dinge in Methoden einzusetzen, damit die Leute wissen, dass sie langsam sind.

Es gibt natürlich einige Ausnahmen. Lazy-Loading ist in Ordnung, solange die Lazy Load nicht wahnsinnig lange dauern wird. Manchmal ist es auch aus Reflektions- und Datenbindungsgründen sinnvoll, Dinge zu erstellen verbiege diese Regel. Aber es macht wenig Sinn, die Konvention zu verletzen und die Erwartungen der Menschen zu verletzen, ohne einen bestimmten Grund dafür zu haben.

    
mquander 19.05.2009, 15:42
quelle
12

Zusätzlich zu den guten Antworten, die bereits gepostet wurden, füge ich hinzu, dass der Debugger automatisch die Werte von Eigenschaften anzeigt, wenn Sie eine Instanz einer Klasse untersuchen. Wollen Sie wirklich Ihren Code debuggen und Datenbankabruf im Debugger machen, wenn Sie Ihre Klasse überprüfen? Sei nett zu den zukünftigen Betreuern deines Codes und tu das nicht.

Auch diese Frage wird ausführlich in den Framework Design Guidelines diskutiert; erwäge, eine Kopie abzuholen.

    
Eric Lippert 19.05.2009 18:45
quelle
3

Ein db-Read in einem Property-Accessor wäre in Ordnung - das ist eigentlich der ganze Sinn von Lazy-Loading. Ich denke, das Wichtigste wäre, es gut zu dokumentieren, damit die Benutzer der Klasse verstehen, dass beim Zugriff auf diese Eigenschaft ein Leistungseinbruch eintreten könnte.

    
Eric Petroelje 19.05.2009 15:40
quelle
3

Sie können tun, was Sie wollen, aber Sie sollten die Konsumenten Ihrer API berücksichtigen. Es wird erwartet, dass Accessoren und Mutatoren (Getter und Setter) sehr leicht sind. Mit dieser Erwartung können Entwickler, die Ihre API konsumieren, häufige und gesprächige Aufrufe dieser Eigenschaften durchführen. Wenn Sie externe Ressourcen in Ihrer Implementierung verwenden, kann ein unerwarteter Engpass auftreten.

Aus Gründen der Konsistenz ist es gut, bei öffentlichen APIs nach Konvention zu bleiben. Wenn Ihre Implementierungen ausschließlich privat sind, dann gibt es wahrscheinlich keinen Schaden (außer einem inkonsistenten Ansatz, Probleme privat oder öffentlich zu lösen).

    
Michael Meadows 19.05.2009 15:41
quelle
3

Es ist nur eine "gute Übung", Eigenschaften-Accessoren nicht lange zur Ausführung zu bringen. Das liegt daran, dass Eigenschaften wie Felder für den Aufrufer aussehen und daher der Aufrufer (ein Benutzer Ihrer API) normalerweise davon ausgeht, dass es nur eine "return smth;"

gibt

Wenn Sie wirklich etwas "Aktion" hinter den Kulissen brauchen, können Sie eine Methode dafür erstellen ...

    
Max Galkin 19.05.2009 15:41
quelle
1

Ich sehe nicht, was das Problem damit ist, solange Sie eine XML-Dokumentation zur Verfügung stellen, so dass der Intellisense den Verbraucher des Objekts darüber informiert, in was er sich selbst versetzt.

Ich denke, das ist eine der Situationen, in denen es keine richtige Antwort gibt. Mein Motto lautet: "Sagen ist immer fast immer falsch." Sie sollten tun, was in jeder gegebenen Situation am sinnvollsten ist, ohne auf allgemeine Verallgemeinerungen Rücksicht zu nehmen.

    
David Boike 19.05.2009 15:40
quelle
1

Ein Datenbankzugriff in einem Eigenschaften-Getter ist in Ordnung, aber versuchen Sie, die Anzahl der Male zu begrenzen, die die Datenbank durch das Zwischenspeichern des Werts erreicht wird.

Es gibt viele Male, dass Leute Eigenschaften in Schleifen verwenden, ohne über die Leistung nachzudenken, also müssen Sie diese Verwendung antizipieren. Programmierer speichern nicht immer den Wert einer Eigenschaft, wenn sie sie mehrmals verwenden.

Cache den Wert von der Datenbank in einer privaten Variable, wenn es für diese Daten möglich ist. Auf diese Weise sind die Zugriffe in der Regel sehr schnell.

    
Kekoa 19.05.2009 15:50
quelle
0

Dies hängt nicht direkt mit Ihrer Frage zusammen, aber haben Sie darüber nachgedacht, mit einem Laden-Laden-Ansatz in Kombination mit einem Aktualisierungs-Parameter zu gehen?

%Vor%     
Oorang 26.05.2009 21:42
quelle

Tags und Links