Heute bei der Arbeit hat einer meiner Kollegen meinen Code überprüft und mir vorgeschlagen, eine Nur-Set-Eigenschaft zu entfernen und stattdessen eine Methode zu verwenden.
Da wir beide mit anderen Dingen beschäftigt waren, sagte er mir, ich solle mir den Property Design
Abschnitt aus dem Buch "Framework Design Guidelines" ansehen . In dem Buch sagte der Autor nur, um zu vermeiden:
Eigenschaften, bei denen der Setter eine breitere Zugänglichkeit als der Getter hat
Und jetzt frage ich mich, warum es nicht empfohlen wird, nur Set-Eigenschaften zu haben? Kann mir jemand das erklären?
design
code-quality
code-reviews
code-smell
Prashant Cholachagudda
quelle
quelle
Password
Eigenschaft einerUser
Klasse. Sie können es einstellen, aber Sie können es nicht bekommen. Sie könnten dann eine schreibgeschützteHashedPassword
Eigenschaft haben. Das Aufrufen des Sets würde den Hash ausführen und dieHashedPassword
Eigenschaft ändern . Ich würde dich nicht anschreien, wenn du das tust.Antworten:
Ich denke, das hat vielleicht mit den Erwartungen zu tun. Nur-Set-Eigenschaften sind ungewöhnlich und Eigenschaften werden normalerweise für "dumme" Sets verwendet, um einen Wert ohne viel Verarbeitung zu speichern. Wenn Sie viel in einem Setter arbeiten, ist es besser, eine Methode zu verwenden. Die Leute erwarten, dass die Ausführung von Methoden möglicherweise lange dauert und möglicherweise Nebenwirkungen hat. Das Implementieren eines ähnlichen Verhaltens in einer Eigenschaft kann zu Code führen, der die Erwartungen verletzt.
Hier ist ein relevanter Abschnitt der Microsoft-Richtlinien zur Verwendung von Eigenschaften :
quelle
Weil es in den meisten Fällen einfach keinen Sinn macht. Welche Eigenschaft könnten Sie haben, die Sie festlegen, aber nicht lesen können?
Wenn OO die reale Welt besser darstellen soll, deutet eine Eigenschaft nur auf eine Menge wahrscheinlich darauf hin, dass Ihre Modellierung ziemlich schlecht ist.
Bearbeiten : Siehe auch: /programming/4564928/are-set-only-properties-bad-practice, das im Wesentlichen besagt, dass es nicht intuitiv ist und eine Eigenschaft nur für Sets im Grunde eine Methode mit einem anderen Namen ist, daher sollten Sie eine verwenden Methode.
quelle
Foo Foo { private get; set; }
? Ich würde das nicht nur Schreiben nennenNun, ich stelle mir vor, dass Sie, wenn Sie eine Eigenschaft für etwas festlegen können, diese aber nie erhalten, nie wissen, ob etwas anderes den von Ihnen festgelegten Wert ändert / überschreibt. Dies kann ein Problem sein, wenn Sie sich auf den von Ihnen festgelegten Wert verlassen und (aus irgendeinem Grund) nicht in der Lage sind, ihn bis zu dem Zeitpunkt beizubehalten, an dem Sie ihn erhalten möchten.
Die Verwendung einer Methode anstelle einer Nur-Set-Eigenschaft ist für einen Benutzer etwas weniger verwirrend. Der Name der Methode zeigt in der Regel Set- oder get- , aber Eigenschaftsnamen angeben , normalerweise nicht , dass etwas kann nur und eingestellt wird nicht geholt werden. Ich nehme an, wenn die Eigenschaft so etwas wie "ReadOnlyBackgroundColour" wäre, wäre es für andere Codierer nicht verwirrend, aber das würde einfach komisch aussehen.
quelle
Dies ist ein sehr altes Thema, aber eines, das mir zu diesem späten Zeitpunkt in den Sinn gekommen ist, und ich hätte gerne einige Kommentare, wenn ich versuche, für schreibgeschützte Eigenschaften einzutreten ...
Ich habe eine Reihe von
ActiveReport
Klassen, die Teil einer Website sind, die instanziiert und nach einer Reihe von Benutzerauswahlen beim Postback ausgeführt werden.Der VB-Code sieht ungefähr so aus:
Diese Berichte verwenden generische Eingeweide, verwenden
CommonReader
eine gespeicherte Prozedur und ein Array von StandardwertenSqlParameter
, denen jeweils eine WriteOnly-Eigenschaft zugeordnet ist, die je nach Berichtsdesign als Parameter bei der Instanziierung übergeben oder vom Benutzer nach der vorherigen Instanziierung festgelegt werden kann Aufruf der BerichtsmethodeRun
.Also, wie ich es sehe, in diesem Fall nur schreibgeschützt
SqlParameter
s generisch sindSqlParameter
s um Klassen und nicht um primitive Werte handelt, ermöglichen die WriteOnly-Eigenschaften eine einfachere Schnittstelle zum Festlegen von ParameternDas sind also meine Gedanken.
Könnte ich es stattdessen in eine Methode konvertieren? sicher, aber die Schnittstelle scheint ... weniger schön
gegen
quelle