In Sprachen wie Java, die auf Getter und Setter angewiesen sind, wird von ihnen nicht erwartet, dass sie etwas anderes tun als das, was sie sagen. Es wäre erstaunlich, wenn x.getB()
sie etwas anderes tun würden, als den aktuellen Wert des logischen Attributs zurückzugeben b
, oder wenn x.setB(2)
sie etwas anderes tun würden Für die x.getB()
Rückgabe ist ein geringer interner Arbeitsaufwand erforderlich 2
.
Es gibt jedoch keine sprachlich auferlegten Garantien für dieses erwartete Verhalten, dh vom Compiler erzwungene Einschränkungen für den Methodenkörper, dessen Namen mit get
oder set
vielmehr dem gesunden Menschenverstand, den sozialen Konventionen, "Styleguides" und dem Testen überlassen bleiben .
Das Verhalten von x.b
Zugriffen und Zuweisungen wie x.b = 2
in Sprachen, die Eigenschaften haben (eine Reihe von Sprachen, die Python enthalten, aber nicht darauf beschränkt sind), ist genau das gleiche wie für Getter- und Setter-Methoden in z. B. Java: dieselben Erwartungen, der gleiche Mangel an sprachlich erzwungenen Garantien.
Der erste Gewinn für Eigenschaften ist die Syntax und Lesbarkeit. Schreiben müssen, z.
x.setB(x.getB() + 1)
anstelle des Offensichtlichen
x.b += 1
schreit nach Rache an den Göttern. In Sprachen, die Eigenschaften unterstützen, gibt es absolut keinen guten Grund, Benutzer der Klasse zu zwingen, die Drehungen einer solchen byzantinischen Boilerplate zu durchlaufen, was die Lesbarkeit ihres Codes ohne jeglichen Vorteil beeinträchtigt.
Insbesondere in Python gibt es einen weiteren großen Vorteil bei der Verwendung von Eigenschaften (oder anderen Deskriptoren) anstelle von Gettern und Setzern: Wenn Sie Ihre Klasse so reorganisieren, dass der zugrunde liegende Setter und Getter nicht mehr benötigt werden, können Sie dies (ohne die Klassen zu beschädigen) veröffentlichte API) eliminieren einfach diese Methoden und die Eigenschaft, die auf ihnen beruht, und machen b
ein normales "gespeichertes" Attribut der x
Klasse von 'anstatt eines "logischen" Attributs , das erhalten und rechnerisch festgelegt wird.
In Python ist es eine wichtige Optimierung, Dinge direkt (wenn möglich) statt über Methoden auszuführen. Durch die systematische Verwendung von Eigenschaften können Sie diese Optimierung durchführen, wann immer dies möglich ist (wobei "normale gespeicherte Attribute" immer direkt verfügbar gemacht werden und nur solche, die beim Zugriff berechnet werden müssen und / oder Einstellung über Methoden und Eigenschaften).
Wenn Sie also Getter und Setter anstelle von Eigenschaften verwenden, ohne die Lesbarkeit des Codes Ihrer Benutzer zu beeinträchtigen, verschwenden Sie auch unentgeltlich Maschinenzyklen (und die Energie, die während dieser Zyklen an ihren Computer fließt ;-), wiederum ohne guten Grund was auch immer.
Ihr einziges Argument gegen Eigenschaften ist z. B., dass "ein externer Benutzer normalerweise keine Nebenwirkungen aufgrund einer Zuweisung erwarten würde"; Sie vermissen jedoch die Tatsache, dass derselbe Benutzer (in einer Sprache wie Java, in der Getter und Setter allgegenwärtig sind) keine (beobachtbaren) "Nebenwirkungen" erwarten würde, wenn er einen Setter aufruft (und noch weniger für einen Getter) ;-). Es sind vernünftige Erwartungen, und es liegt an Ihnen als Klassenautor, zu versuchen, sie zu berücksichtigen - ob Ihr Setter und Getter direkt oder über eine Immobilie verwendet werden, spielt keine Rolle. Wenn Sie Methoden mit wichtigen beobachtbare Nebenwirkungen haben, sie nicht nennen sie getThis
, setThat
und sie nicht über Eigenschaften verwenden.
Die Beschwerde , dass die Eigenschaften „die Umsetzung verstecken“ ist völlig unberechtigt: Die meisten alle des OOP ist über Information Hiding Umsetzung - macht eine Klasse für eine logische Schnittstelle zur Außenwelt zu präsentieren und es intern als beste Umsetzung es kann. Getter und Setter sind genau wie Eigenschaften Werkzeuge für dieses Ziel. Eigenschaften machen es einfach besser (in Sprachen, die sie unterstützen ;-).