Was ist der Sinn von Eigenschaften?

11

Hier sind einige Argumente für Eigenschaften und meine Gegenargumente:

Einfacher zu verwenden als Getter- und Setter-Methoden zu schreiben

Getter- und Setter-Methodenpaare sind ein Codegeruch. Wenn Sie es einfacher machen, diese zu schreiben, ist es einfacher, einen Mathe-Test nicht zu bestehen, indem Sie ein Scantron-Formular verwenden und alle Cs ausfüllen. Objekte, die aus Gründen der Persistenz nur den Status enthalten, sollten keine Getter / Setter verwenden und zum Zeitpunkt der Persistenz unveränderliche Objekte erstellen.

Was für einen Verbraucher eines Objekts wichtig ist, ist, was es tut, nicht wie es es tut. Sein Verhalten ist das, was es tut; sein Zustand ist, wie es es tut. Wenn Sie sich um den Zustand eines Objekts kümmern (mit Ausnahme der Persistenz, obwohl dies auch OO bricht), machen Sie einfach kein OOP und verlieren seine Vorteile.

Sie geben den Verbrauchern einen groben Hinweis auf die Leistung

Dies kann sich in Zukunft für jede Immobilie ändern. Angenommen, in Version 1.0 gibt der Zugriff auf PropertyX einfach ein Feld zurück. Wenn das Feld in Version 1.5 null ist, verwendet PropertyX das Nullobjektmuster, um ein neues Nullobjekt zu erstellen. In Release 2.0 wird das Feld durch die Getter-Methode in PropertyX weiter validiert.

Da die Eigenschaft immer komplexer wird, scheint die Leistungsangabe für die Verwendung einer Eigenschaft immer weniger wahr zu sein.

Sie sind besser als öffentliche Felder

Das ist wahr. Aber auch Methoden.

Sie stellen einen grundlegend anderen Aspekt eines Objekts dar als eine Methode, und alle Verbraucher des Objekts sollten sich darum kümmern

Sind Sie sicher, dass beide obigen Aussagen wahr sind?

Sie sind einfacher zu tippen, Mann

Sicher, das Tippen myObject.Lengthist einfacher als das Tippen myObject.Length(), aber konnte das nicht mit ein wenig syntaktischem Zucker behoben werden?


Warum Methoden anstelle von Eigenschaften verwenden?

  • Keine Leistungsgarantien. Die API bleibt auch dann wahr, wenn die Methode komplexer wird. Der Verbraucher muss seinen Code profilieren, wenn Leistungsprobleme auftreten, und darf sich nicht auf Word-of-API verlassen.

  • Weniger für den Verbraucher zu denken. Hat diese Eigenschaft einen Setter? Eine Methode sicher nicht.

  • Der Verbraucher denkt aus einer richtigen OOP-Denkweise. Als Konsument einer API bin ich daran interessiert, mit dem Verhalten eines Objekts zu interagieren. Wenn ich Eigenschaften in der API sehe, sieht es dem Status sehr ähnlich. Wenn die Eigenschaften zu viel bewirken, sollten sie nicht einmal Eigenschaften sein, also sind Eigenschaften in einem API-ARE-Status so, wie sie den Verbrauchern erscheinen.

  • Der Programmierer der API wird sich eingehender mit Methoden mit Rückgabewerten befassen und nach Möglichkeit vermeiden, den Status des Objekts in solchen Methoden zu ändern. Die Trennung von Befehlen von Abfragen sollte nach Möglichkeit erzwungen werden.


Ich frage Sie also, warum Sie Eigenschaften anstelle von Methoden verwenden sollten. Die meisten Punkte in MSDN sind Code-Gerüche an und für sich und gehören weder zu Eigenschaften noch zu Methoden.

(Diese Gedanken kamen mir, nachdem ich über CQS nachgedacht hatte.)

xofz
quelle
5
+1. Eigenschaften sind Methoden mit der Syntax von Feldern und das macht einfach keinen Sinn.
Nemanja Trifunovic
23
@Nemanja Trifunovic: Es ist absolut sinnvoll, wenn Sie type GetFoo() void SetFoo()zehntausend Mal geschrieben haben. Während meiner gesamten Zeit beim Schreiben von C # -Code war ich noch nie durch eine Eigenschaft verwirrt.
Ed S.
23
Klingt für mich so, als hätten Sie sich bereits entschieden. Was ist die Frage?
Dean Harding
9
@Nemanja Trifunovic: "Getter und Setter sind im Allgemeinen schlecht" Sie können das so oft wiederholen, wie Sie möchten , aber es wird es nicht wahr machen. Wie wäre es zu erklären, warum Sie denken, dass sie schlecht sind? Soweit SO aufgrund der Eingabe des Eigenschaftsnamens anstelle des zugrunde liegenden Variablennamens abstürzt, ist dies ein Fehler, der nicht übersehen werden kann, da Ihr Programm abstürzt, sobald Sie die Eigenschaft aufrufen, und dies ist ziemlich selten. Wenn es passiert, weiß ich genau, was ich getan habe, um es zu verursachen, und ich habe es in zwei Sekunden behoben. Ich sehe das Problem nicht.
Ed S.
3
Nur vorbeizukommen, um @NemanjaTrifunovic darauf hinzuweisen, dass der Grund, warum Getter- und Setter-Methoden böse sind, ziemlich alt ist , sich mit Java befasst und eine Java-Schwäche unterstreicht : die Schwäche, keine Eigenschaften zu haben . (zeigt also zu viele Implementierungsdetails)… beißt uns hier den Schwanz. (Es sollte Getter heißen und Setter sind schlecht in Java, weil wir keinen gottverdammten Standard über diese haben )
ZJR

Antworten:

44

Warum ist es "Methoden gegen Eigenschaften"? Eine Methode macht etwas. Eine Eigenschaft ist ein Mitglied eines Objekts. Sie sind völlig verschiedene Dinge, obwohl zwei Arten von Methoden, die üblicherweise geschrieben werden - Getter und Setter - Eigenschaften entsprechen. Da der Vergleich von Eigenschaften mit Methoden im Allgemeinen nicht sinnvoll ist, gehe ich davon aus, dass Sie über Getter / Setter sprechen wollten.

Getter- und Setter-Methodenpaare sind ein Codegeruch.

Nicht unbedingt, würde ich argumentieren, aber so oder so geht es nicht um Getter / Setter vs. Eigenschaften, sondern darum, ob beides verwendet werden sollte. Beachten Sie auch, dass Sie z. B. das setXTeil weglassen können, genauso wie Sie schreibgeschützte Eigenschaften erstellen können.

Was für einen Verbraucher eines Objekts wichtig ist, ist, was es tut, nicht wie es es tut. Sein Verhalten ist das, was es tut; sein Zustand ist, wie es es tut. Wenn Sie sich um den Zustand eines Objekts kümmern (mit Ausnahme der Persistenz, obwohl dies auch OO bricht), machen Sie einfach kein OOP und verlieren seine Vorteile.

Eine höchst fragwürdige Einstellung. Wenn die GUI Daten ausgeben möchte, die von a gehalten werden DataStuffManagerImpl, muss sie diese Nummer irgendwie abrufen (und nein, es ist keine Option, die Hälfte der Anwendung in die Widget-Klasse zu packen).

Da die Eigenschaft immer komplexer wird, scheint die Leistungsangabe für die Verwendung einer Eigenschaft immer weniger wahr zu sein.

[Methoden haben] Keine Leistungsgarantien. Die API bleibt auch dann wahr, wenn die Methode komplexer wird. Der Verbraucher muss seinen Code profilieren, wenn Leistungsprobleme auftreten, und darf sich nicht auf Word-of-API verlassen.

In fast allen Fällen ist die gesamte Validierungslogik usw. immer noch effektiv O (1) oder auf andere Weise kostengünstig. Wenn nicht, sind Sie vielleicht zu weit gegangen und es ist Zeit für eine Veränderung. Und eine getX()Methode wird normalerweise auch als billig behandelt!

Sicher, die Eingabe von myObject.Length ist einfacher als die Eingabe von myObject.Length (), aber konnte das nicht mit ein wenig syntaktischem Zucker behoben werden?

Eigenschaften sind dieser syntaktische Zucker.

Weniger für den Verbraucher zu denken. Hat diese Eigenschaft einen Setter? Eine Methode sicher nicht.

"Gibt es einen Setter für diesen Getter?" Gleicher Unterschied.

Der Programmierer der API wird sich eingehender mit Methoden mit Rückgabewerten befassen und nach Möglichkeit vermeiden, den Status des Objekts in solchen Methoden zu ändern. Die Trennung von Befehlen von Abfragen sollte nach Möglichkeit erzwungen werden.

Ich bin mir nicht sicher, was Sie uns hier sagen wollen. Für Immobilien gibt es ein noch stärkeres ungeschriebenes Gesetz, um keine Nebenwirkungen zu verursachen.

ChrisF
quelle
3
+1, und es ist kein ungeschriebenes Gesetz. Die Richtlinien zur Nutzung von Eigenschaften in MSDN wurden zusammen mit vielen anderen geschrieben. Ich denke, OP sollte sie durchgehen, um sich von vielen Zweifeln zu befreien. Und ich kann hier keinen Link posten, da ich dies von meinem Telefon aus schreibe, aber Richtlinien sollten leicht zu finden sein.
Decyclone
@delnan: Eigenschaften sind nicht dieser syntaktische Zucker. Eigenschaften können wie Felder behandelt werden (sie können als Zuweisungsziel verwendet werden, wenn sie einen Setter haben). Methoden können nicht.
Xofz
1
@ SamPearson: obj.x = yKarten zu obj.setX(y)und obj.xKarten zu obj.getX(). Wie ist das anders?
1
@SamPearson Sie können die Sichtbarkeit eines Eigenschaftssetzers und eines Getters unabhängig voneinander ändern. Ich verwende dies ständig mit meinen Entity Framework-Objekten: Meine Setter sind geschützt (daher kann nur das Framework einen Wert festlegen). Es ist also durchaus möglich, int length = myObject.Length zu sagen, ohne myObject.Length = 10 zuzulassen
Michael Brown
19

Getter- und Setter-Methodenpaare sind ein Codegeruch.

Das ist eine fehlerhafte Annahme und völlig falsch. Get / Set-Methoden sind eine Möglichkeit, ein Datenelement zu kapseln, und stellen in keiner Weise einen "Code-Geruch" dar. Ich hasse es wirklich, wie manche Leute den Begriff "Codegeruch" herumwerfen, aber trotzdem ...

Dies kann sich in Zukunft für jede Immobilie ändern. Angenommen, in Version 1.0 gibt der Zugriff auf PropertyX einfach ein Feld zurück. Wenn das Feld in Version 1.5 null ist, verwendet PropertyX das Nullobjektmuster, um ein neues Nullobjekt zu erstellen. In Release 2.0 wird das Feld durch die Getter-Methode in PropertyX weiter validiert.

Da die Eigenschaft immer komplexer wird, scheint die Leistungsangabe für die Verwendung einer Eigenschaft immer weniger wahr zu sein.

Klingt nach einer schlecht gestalteten API, ich verstehe nicht, wie das an der Eigenschaftssyntax liegt.

Eigenschaften in C # waren einfach syntaktischer Zucker für ein sehr verbreitetes Muster, das unser Leben als Programmierer ein bisschen einfacher machte. Wenn Sie heutzutage jedoch Datenbindungen verwenden möchten, müssen Sie Eigenschaften verwenden, sodass diese jetzt etwas mehr als syntaktischer Zucker sind. Ich glaube, ich stimme wirklich keinem Ihrer Punkte zu und verstehe nicht, warum Sie eine Sprachfunktion nicht mögen, die ein gemeinsames Muster direkt unterstützt.

Ed S.
quelle
1
Ich werde ein Kopfgeld geben, um einen besseren Begriff als Codegeruch zu finden. Lesen Sie einfach ein Buch über Refactoring, in dem es ungefähr tausend Mal verwendet wird. Es ist wie Fingernägel an einer Tafel.
JeffO
1
@ Jeff O: Ja, ich finde, dass die Leute, die diesen Begriff am häufigsten zu verwenden scheinen, nicht viel Erfahrung haben.
Ed S.
6
@ Jeff O und @ Ed S: IME, "Codegeruch" ist der Begriff geworden, den die Leute verwenden, wenn sie wirklich meinen "Ich mag es nicht, aber ich habe eigentlich keinen Grund"
Steven Evers
3
@SnOrfus: Ja, oder wenn sie "religiöse" Ansichten vertreten, die in der Praxis oft wenig Sinn machen, wie "eine Methode sollte niemals mehr als X Zeilen haben" , was wiederum normalerweise nur eine Wiederholung von etwas ist, das sie irgendwo lesen.
Ed S.
1
Die unangemessene Verwendung von Getter / Setter-Methoden ist ein Code-Geruch, sollte aber auch die unangemessene Verwendung von irgendetwas sein . Selbst wenn Dinge enge Anwendungsfälle haben, sollte die Verwendung solcher Dinge für diese Anwendungsfälle nicht als Codegeruch betrachtet werden. Die Schaffung von Setzern für alles sollte keine blinde Angewohnheit sein, aber man sollte keine Angst haben, sie gegebenenfalls einzubeziehen. Was notwendig ist, ist das Gleichgewicht zwischen der Nützlichkeit für Kunden, den Status ändern zu können, und der Möglichkeit, in Zukunft herauszufinden, was der Status früher war (einfach, wenn der Status unveränderlich ist). Beide sind nützlich, aber der Code muss einen auswählen.
Supercat
10

Ihre Prämisse ist falsch.

Eigenschaften sind in keiner Weise ein Vertrag zur Leistung oder internen Implementierung oder was auch immer.
Eigenschaften sind spezielle Methodenpaare, die, wenn Sie so wollen, semantisch ein Attribut darstellen. Der einzige Vertrag ist daher, dass sich eine Eigenschaft so verhält, wie Sie es von einem Attribut erwarten würden.
Wenn ich nach der Farbe eines Objekts frage, gehe ich nicht davon aus, ob es durch einen einfachen Feldzugriff erhalten wird oder ob es gerade rechtzeitig berechnet wird.
Der springende Punkt ist, die Möglichkeit zu haben, das Verhalten eines Attributs mithilfe von Methoden verfügbar zu machen, während es für den Benutzer der Schnittstelle transparent ist, unabhängig davon, ob Sie ein Feld oder Accessoren verwenden.

Das Vorhandensein von Attributen (und das tatsächliche Ausblenden ihrer Implementierung, da Eigenschaften im Gegensatz zu Feldern stehen) ist eine leistungsstarke deklarative Funktion, die die Grundlage für visuelle Objektinspektoren und andere automatische Ansichtsgenerierungen, für die Datenbindung und viele andere nützliche Dinge bildet. Und am wichtigsten ist, dass diese Informationen eindeutig auch für Ihre Programmierkollegen übertragen werden.

back2dos
quelle
6

Der Verbraucher denkt aus einer richtigen OOP-Denkweise. Als Konsument einer API bin ich daran interessiert, mit dem Verhalten eines Objekts zu interagieren. Wenn ich Eigenschaften in der API sehe, sieht es dem Status sehr ähnlich. Wenn die Eigenschaften zu viel bewirken, sollten sie nicht einmal Eigenschaften sein, also sind Eigenschaften in einem API-ARE-Status so, wie sie den Verbrauchern erscheinen.

Eine Immobilie soll ein Staat sein. Wenn sich der zugrunde liegende Setter- oder Getter-Code ändert, um die zum Festlegen oder Abrufen des Status erforderliche Verarbeitung erheblich zu verbessern, ist dies keine Eigenschaft mehr und Sie sollten ihn durch Methoden ersetzen. Dies liegt bei Ihnen als Entwickler des Codes.

Zu viel Code (wie viel zu viel ist, hängt davon ab) in einen Setter oder Getter einzufügen ist falsch, aber nur weil es möglich ist, ist dies nicht in allen Fällen ein Grund, das Muster wegzuwerfen.

ChrisF
quelle
6

Eine Sache, die Sie vermissen, und ich weiß nicht, ob dies auf Unwissenheit zurückzuführen ist oder ob Sie dieses Detail absichtlich übersehen, ist, dass Eigenschaften Methoden sind.

Wenn Sie die Eigenschaftssyntax von C # verwenden, erstellt der Compiler leise Getter- und Setter-Methoden mit Metadaten, die Sprachen, die Eigenschaften als erstklassige syntaktische Funktion verstehen, mitteilen, dass sie als solche behandelt werden sollen. Das ist in der Tat der syntaktische Zucker, nach dem Sie fragen. Einige Sprachen, die auf der CLR ausgeführt werden können, verbergen dieses Detail nicht vollständig vor Ihnen (Boo, wenn der Speicher mir dient, und einige Lisp-Implementierungen), und Sie können die Getter und Setter explizit aufrufen.

Eigenschaften haben gelegentlich Nebenwirkungen, wie das Auslösen von Änderungsbenachrichtigungsereignissen (z. B. INotifyPropertyChanged) oder das Markieren einer Instanz einer Klasse als fehlerhaft. Hier haben sie ihren wahren Wert, obwohl das Erstellen etwas mehr Arbeit bedeutet (außer in Boo, das syntaxaffine Makros enthält).

Die umfassendere Frage ist nun, ob Getter- und Setter-Methoden tatsächlich eine gute Sache sind. Es gibt eindeutig Kompromisse; Wenn Sie Mutator-Methoden haben, ist Ihr Code von Natur aus weniger parallelisierbar, da Sie sich jetzt mit Problemen bei der Thread-Synchronisierung befassen müssen. Und es ist durchaus möglich, dass Sie das Risiko eingehen, das Gesetz von Demeter mit Mutator-Methoden zu verletzen (ob Eigenschaften oder Getter / Setter-Methoden; sie sind gleichwertig), weil es so verdammt bequem ist, dies zu tun.

Aber manchmal ist es das Richtige. Manchmal besteht Ihr Problem darin, Daten aus einer Quelle abzurufen, ein wenig zu ändern, die aktualisierten Daten dem Benutzer zu präsentieren und die Änderungen zu speichern. Diese Redewendung wird von Immobilien gut bedient. Wie Allen Holubs Artikel sagt, heißt das nicht, dass Sie sie niemals verwenden sollten, nur weil Getter und Setter Probleme haben. (Papagei abstrakt Guruspeak als schädlich angesehen). Selbst wenn Sie dem Ansatz "Klasse / Verantwortlichkeiten / Mitarbeiter" folgen, werden Sie am Ende entweder Informationen oder Präsentationen von Informationen jemandem zugänglich machen. Es geht darum, die Oberfläche der Verschränkung zu minimieren.

Der Vorteil von Eigenschaften ist, dass es sehr einfach ist, dass ein anderes Objekt sie ausnutzt. Der Nachteil von Eigenschaften ist, dass es sehr einfach ist, dass ein anderes Objekt sie ausnutzt, und das kann man nicht einfach verhindern.

Eine Objektmutation ist auf der Controller-Ebene beispielsweise in einer MVC-Architektur sinnvoll. Das ist dein Mitarbeiter. Ihre Ansicht ist auch ein Kollaborateur, sollte jedoch Ihre Objekte nicht direkt mutieren, da sie unterschiedliche Verantwortlichkeiten hat. Das Einrollen von Präsentationscode in Ihre Geschäftsobjekte ist nicht unbedingt der richtige Weg, um Getter / Setter zu vermeiden.

Die Gleichung ändert sich ein wenig, wenn Sie funktionale Abstraktionen anstelle von reinen OO-Abstraktionen verwenden, was das Erstellen von Kopien eines "Datensatz" -Objekts mit einigen Änderungen im Allgemeinen ziemlich trivial, wenn auch nicht kostenlos macht. Und hey, wenn Sie versuchen, Leistungsgarantien zu erhalten, sind Eigenschaften im Allgemeinen vorhersehbarer als der verzögerte Wiederaufbau einer unveränderlichen Sammlung.

JasonTrue
quelle
5

Ein weiterer wichtiger Grund in meinem Buch für die Verwendung von Eigenschaften ist, dass sie die Lesbarkeit erheblich verbessern können.

account.setBalance(Account.getBalance()+deposit);

ist eindeutig viel weniger lesbar als

account.Balance += deposit;
apoorv020
quelle
6
Mit der Ausnahme, dass Balance keine Eigenschaft sein sollte, da mit der Änderung sicher eine signifikante Geschäftslogik verbunden ist (Überprüfung auf Überziehungskredit; Gebühr für Servicegebühr; Aufzeichnungstransaktion usw.). Ihr Lesbarkeitspunkt ist vollständig gültig, wenn er auf ein anderes Beispiel angewendet wird ( Temperatur, Hintergrundfarbe usw.)
Kate Gregory
9
Warum nicht Konto. Einzahlung (Betrag)?
Xofz
4
@ Sam Pearson: +1. Ein perfektes Beispiel dafür, warum Getter / Setter häufig auf schlechtes Design hinweisen.
Nemanja Trifunovic
4

Du hast fast den entgegengesetzten religiösen Standpunkt zu mir :)

Als ich von Delphi nach Java wechselte, war der Mangel an Eigenschaften ein großer Affront gegen mich. Ich war es gewohnt, eine Eigenschaft zu deklarieren und sie entweder direkt auf eine private Variable zu verweisen oder einen (geschützten) Getter & Setter zu schreiben und sie dann auf die Eigenschaft zu "plumbieren". Dies kapselte die Eigenschaft und kontrollierte, wie auf sie eindeutig zugegriffen werden sollte. Sie könnten eine schreibgeschützte Eigenschaft haben, die die Summe beim Zugriff berechnet und sie als "Summe" und nicht als "_getTotal ()" oder ähnliche Ballochs bezeichnet. Dies bedeutete auch, dass Sie den Zugriff auf Eigenschaften einschränken konnten, indem Sie sie in der abstrakten Basisklasse schützen und dann in die Öffentlichkeit verschieben oder in Unterklassen veröffentlichen.

Eigenschaften sind für mich eine natürlichere und ausdrucksstärkere Möglichkeit, den Zustand des Objekts festzulegen und abzurufen. Sich auf nicht erzwungene Codierungskonventionen zu verlassen, ist eher ein "Codegeruch" als alles, wofür Sie Eigenschaften kritisieren. Wie andere bereits gesagt haben, ist es auch eine äußerst schlechte Form, eine schlecht gestaltete Nutzung von Eigenschaften zu finden und ihre Fehler zu nutzen, um das Konzept von Eigenschaften im Allgemeinen zu versuchen und zu verwerfen. Es ist möglich, dass Sie nur eine schlechte Nutzung von Eigenschaften gesehen haben und davon ausgehen, dass dies vermutlich der Fall ist, aber Sie sollten mehr Nachforschungen anstellen, bevor Sie zu dogmatisch werden.

mcottle
quelle
+1 Das ist in der Tat eine echte Nutzung einer Immobilie. Gute Antwort. " Es bedeutete auch, dass Sie den Zugriff auf Eigenschaften einschränken konnten, indem Sie sie in der abstrakten Basisklasse schützen und dann in die Öffentlichkeit verschieben oder in Unterklassen veröffentlichen. "
Karthik Sreenivasan
Delphi missbraucht Eigenschaften ad nauseam. Sie sortieren keine Liste, sondern setzen ihre sorted Eigenschaft auf true. Wenn Sie es also auf einstellen, erhalten falseSie die ursprüngliche Liste. : D Oder mischt es es zufällig? : D Oder was auch immer, es ist einfach dumm. Außerdem ist es im Vergleich zu einem richtig sortierten Set verdammt langsam. Die Eigenschaften sind nicht schlecht, aber ich habe gelernt, sie sehr sparsam zu verwenden (bis ich mit Getter und Setter ziemlich zufrieden bin; ich verwende hauptsächlich Java).
Maaartinus
1

Einer der Gründe, warum Eigenschaften in das Java Beans Framework eingeführt wurden, bestand darin, die Integration in eine IDE zu ermöglichen. Sie können diese Komponenten in die IDE ziehen und die Eigenschaften mithilfe von Eigenschafteneditoren bearbeiten.

(Damals waren sie nur normale Getter und Setter - und wurden nur durch die Namenskonvention definiert - und das roch tatsächlich)

Heutzutage gibt es noch mehr Fälle, in denen auf Eigenschaften zugegriffen und diese nicht über regulären Code geändert werden - beispielsweise beim Debuggen.

Ophir Yoktan
quelle
1

Ein weiterer Aspekt - sie kamen wirklich von VB. Denken Sie daran, dass in den dunklen Tagen des 20. Jahrhunderts, als .NET konzipiert wurde, ein Hauptaugenmerk darauf lag, dass es ein einfacher Ersatz für VB war, sodass Ihre VB-Programmierer Dinge einfach per Drag & Drop auf Webformulare ziehen konnten. VB hatte Eigenschaften, daher mussten Sie diese Funktion beibehalten, damit die Dinge richtig übersetzt werden konnten.

Wyatt Barnett
quelle
1
Anders Heljsberg entwarf C # (und einige der IL) und auch Delphi - das Eigenschaften hatte.
Jesse C. Slicer
1

Es gibt mindestens zwei Zwecke für Eigenschaften:

  • Sie sind konzeptionell identisch mit Feldern, auch wenn sie unterschiedlich implementiert sind . Ein Getter sollte den Zustand des Objekts nicht ändern und keine Nebenwirkungen haben. Ein Setter sollte den Status nur auf eine Weise ändern, die konzeptionell der Änderung eines Feldes ähnelt, und keine anderen Nebenwirkungen haben.

  • Sie sind syntaktisch identisch mit öffentlichen (möglicherweise schreibgeschützten) Feldern. Dies bedeutet, dass ein öffentliches Feld in eine Eigenschaft geändert werden kann, ohne dass Anrufer auf Quellenebene unterbrochen werden.

Dsimcha
quelle
Ja, aber beachten Sie das Wort "sollte". Es gibt nichts an Eigenschaften, das verhindert, dass Getter Nebenwirkungen haben, und tatsächlich habe ich zahlreiche Fälle gesehen, in denen dies der Fall war.
Nemanja Trifunovic
1
Das Ändern eines öffentlichen Feldes in eine Eigenschaft führt zu einer Unterbrechung der Binärkompatibilität. Der konsumierende Code muss neu kompiliert werden - obwohl er nicht geändert wurde. Ich
vermute,
@ MattDavey: Danke. Das habe ich gemeint. Bearbeitet.
Dsimcha