wake-up-neo.com

Eigenschaften vs. Methoden

Kurze Frage: Wann entscheiden Sie sich für Eigenschaften (in C #) und wann entscheiden Sie sich für Methoden?

Wir sind mit dieser Debatte beschäftigt und haben einige Bereiche gefunden, in denen es fraglich ist, ob wir eine Eigenschaft oder eine Methode verwenden sollen. Ein Beispiel ist dies:

public void SetLabel(string text)
{
    Label.Text = text;
}

In diesem Beispiel ist Label ein Steuerelement auf einer ASPX-Seite. Gibt es einen Grundsatz, der die Entscheidung (in diesem Fall) bestimmen kann, ob dies eine Methode oder eine Eigenschaft ist?.

Ich akzeptiere die Antwort, die am allgemeinsten und umfassendsten ist, aber auch das von mir gegebene Beispiel berührt.

116
Trumpi

Im Abschnitt Auswahl zwischen Eigenschaften und Methoden der Design-Richtlinien für die Entwicklung von Klassenbibliotheken:

Im Allgemeinen repräsentieren Methoden Aktionen und Eigenschaften repräsentieren Daten. Eigenschaften sollen wie Felder verwendet werden, was bedeutet, dass Eigenschaften nicht rechenintensiv sein sollten oder Nebeneffekte erzeugen sollten. Wenn die folgenden Richtlinien nicht verletzt werden, sollten Sie die Verwendung einer Eigenschaft und nicht einer Methode in Betracht ziehen, da weniger erfahrene Entwickler die Verwendung von Eigenschaften als einfacher empfinden.

120
Ken Browning

Ja, wenn Sie nur abrufen und einstellen möchten, verwenden Sie eine Eigenschaft.

Wenn Sie einen komplexen Vorgang ausführen, der mehrere Datenelemente betreffen kann, ist eine Methode besser geeignet. Oder wenn Ihr Getter Parameter übernimmt oder Ihr Setter mehr als einen Werteparameter benötigt.

In der Mitte befindet sich ein grauer Bereich, in dem die Linie etwas unscharf sein kann. Es gibt keine strenge und schnelle Regel, und verschiedene Personen werden sich manchmal nicht einig, ob etwas eine Eigenschaft oder eine Methode sein soll. Das Wichtigste ist nur, (relativ) konsistent zu sein, wie Sie es tun (oder wie es Ihr Team macht).

Sie sind weitgehend austauschbar, aber eine Eigenschaft signalisiert dem Benutzer, dass die Implementierung relativ "einfach" ist. Oh, und die Syntax ist ein bisschen sauberer.

Im Allgemeinen ist meine Philosophie, dass, wenn Sie mit dem Schreiben eines Methodennamens beginnen, der mit get oder set beginnt und null oder einen Parameter (jeweils) annimmt, dies ein Hauptkandidat für eine Eigenschaft ist.

51
cletus

Wenn Sie eine tatsächliche Eigenschaft Ihres Objekts festlegen, verwenden Sie eine Eigenschaft.

Wenn Sie eine Aufgabe/Funktionalität ausführen, verwenden Sie eine Methode.

In Ihrem Beispiel wird eine bestimmte Eigenschaft festgelegt.

Wenn Sie jedoch AppendToLabel verwenden, würden Sie eine Methode verwenden.

12
Robin Day

Eigenschaften sind eine Möglichkeit, Daten von einem Objekt einzufügen oder abzurufen. Sie erzeugen eine Abstraktion über Variablen oder Daten innerhalb einer Klasse. Sie sind analog zu Getter und Setter in Java. 

Methoden kapseln eine Operation. 

Im Allgemeinen verwende ich Eigenschaften, um einzelne Datenbits oder kleine Berechnungen für eine Klasse (z. B. Umsatzsteuer) anzuzeigen. Welches ist von der Anzahl der Artikel und deren Kosten in einem Einkaufswagen abgeleitet.

Ich verwende Methoden beim Erstellen einer Operation, z. B. das Abrufen von Daten aus der Datenbank. Jede Operation, die bewegliche Teile hat, ist ein Kandidat für eine Methode.

In Ihrem Codebeispiel würde ich es in eine Eigenschaft einschließen, wenn ich außerhalb der Klasse, in der es enthalten ist, darauf zugreifen muss:

public Label Title 
{
   get{ return titleLabel;}
   set{ titleLabel = value;}
}

Den Text einstellen:

Title.Text = "Properties vs Methods";

Wenn ich nur die Text-Eigenschaft des Labels setzen würde, würde ich dies folgendermaßen tun:

public string Title 
{
   get{ return titleLabel.Text;}
   set{ titleLabel.Text = value;}
}

Den Text einstellen:

Title = "Properties vs Methods";
12
Chuck Conway

Beim Durchsuchen von MSDN habe ich einen Verweis auf Properties vs Methods gefunden, der einige wichtige Richtlinien für das Erstellen von Methoden enthält:

  • Die Operation ist eine Konvertierung, z. B. Object.ToString.
  • Der Vorgang ist so teuer, dass Sie mit dem .__ kommunizieren möchten. Benutzer, der die Zwischenspeicherung in Betracht ziehen sollte das Ergebnis.
  • Das Erhalten eines Eigenschaftswerts mithilfe des Get-Accessors hätte eine beobachtbare Nebenwirkung.
  • Ein zweimaliges Aufrufen des Mitglieds führt zu unterschiedlichen Ergebnissen.
  • Die Reihenfolge der Ausführung ist wichtig. Beachten Sie, dass die Eigenschaften eines Typs .__ sein sollten. in der Lage sein, in einem beliebigen .__ eingestellt und abgerufen zu werden. Auftrag.
  • Das Member ist statisch, gibt jedoch einen Wert zurück, der geändert werden kann.
  • Das Mitglied gibt ein Array zurück. Eigenschaften, die Arrays zurückgeben, können .__ sein. sehr irreführend Normalerweise ist es notwendig, um eine Kopie des internes Array, so dass der Benutzer nicht internen Zustand ändern. Dies ist gekoppelt mit der Tatsache, dass ein Benutzer leicht Angenommen, es handelt sich um eine indizierte Eigenschaft führt zu ineffizientem Code.
9
Gavin Miller

Sie müssen nur auf den Namen schauen ... "Property". Was heißt das? Das Wörterbuch definiert es in vielerlei Hinsicht, aber in diesem Fall "passt ein" wesentliches oder unterscheidendes Attribut oder eine bestimmte Qualität einer Sache "am besten an.

Denken Sie über den Zweck der Aktion nach. Ändern oder abrufen Sie tatsächlich ein "wesentliches oder unterscheidendes Merkmal"? In Ihrem Beispiel verwenden Sie eine Funktion, um eine Eigenschaft eines Textfelds festzulegen. Das scheint irgendwie dumm zu sein, nicht wahr?

Eigenschaften sind wirklich Funktionen. Sie kompilieren alle zu getXXX () und setXXX (). Es verbirgt sie nur in syntaktischem Zucker, aber es ist Zucker, der dem Prozess eine semantische Bedeutung verleiht.

Denken Sie über Eigenschaften wie Attribute nach. Ein Auto hat viele Eigenschaften. Farbe, MPG, Modell usw. Nicht alle Eigenschaften sind einstellbar, einige sind berechenbar. 

Inzwischen ist eine Methode eine Aktion. GetColor sollte eine Eigenschaft sein. GetFile () sollte eine Funktion sein. Eine andere Faustregel lautet: Wenn der Zustand des Objekts nicht geändert wird, sollte es eine Funktion sein. Zum Beispiel sollte CalculatePiToNthDigit (n) eine Funktion sein, da der Status des Math-Objekts, an das es angehängt ist, nicht wirklich geändert wird. 

Das ist vielleicht ein bisschen wabbelig, aber es kommt wirklich darauf an zu entscheiden, was Ihre Objekte sind und was sie darstellen. Wenn Sie nicht herausfinden können, ob es sich um eine Eigenschaft oder Funktion handelt, spielt es keine Rolle, welche.

8

Symantisch Eigenschaften sind Attribute Ihrer Objekte . Methoden sind Verhalten Ihres Objekts.

Label ist ein Attribut und es macht mehr Sinn, es zu einer Eigenschaft zu machen.

Im Hinblick auf die objektorientierte Programmierung sollten Sie ein klares Verständnis dafür haben, was Teil des Verhaltens ist und was lediglich ein Attribut ist.

Auto {Farbe, Modell, Marke}

Ein Auto verfügt über die Attribute Farbe, Modell und Marke. Daher ist es nicht sinnvoll, eine Methode SetColor oder SetModel zu verwenden, da wir Car nicht dazu auffordern, eine eigene Farbe festzulegen.

Wenn Sie also den Fall der Eigenschaft/Methode auf das Objekt des realen Lebens abbilden oder es aus symantischer Sicht betrachten, wird Ihre Verwirrung wirklich verschwinden.

8

Ich bevorzuge die Verwendung von Eigenschaften für Add/Set-Methoden mit dem Parameter 1. Wenn Parameter mehr sind, verwenden Sie Methoden.

3
abatishchev

Eigenschaften sollten nur einfach gesetzt sein und einen Liner erhalten. Alles andere und es sollte wirklich zu einer Methode verschoben werden. Komplexer Code sollte immer in Methoden enthalten sein.

3
Duke of Muppets

Ich verwende nur Eigenschaften für den Zugriff auf Variablen, d. Sobald irgendeine Art von Datenmanipulation erforderlich ist/durchgeführt wird, verwende ich Methoden.

3
Marcus L

Ein großer Vorteil für Eigenschaften ist auch, dass der Wert der Eigenschaft während des Debugging in Visual Studio angezeigt wird.

3
David Karlaš

Eigenschaften sind wirklich schön, weil sie im visuellen Designer von Visual Studio verfügbar sind, sofern sie Zugriff haben.

Sie werden verwendet, wenn Sie lediglich Einstellungen vornehmen und erhalten und möglicherweise eine Überprüfung, die nicht auf eine erhebliche Menge an Code zugreift. Seien Sie vorsichtig, da das Erstellen komplexer Objekte während der Validierung nicht einfach ist.

Alle anderen Methoden sind der bevorzugte Weg.

Es geht nicht nur um Semantik. Die Verwendung ungeeigneter Eigenschaften führt dazu, dass im visuellen Studio-Visual-Designer Ungewöhnliches auftritt.

Zum Beispiel erhielt ich einen Konfigurationswert innerhalb einer Eigenschaft einer Klasse. Die Konfigurationsklasse öffnet tatsächlich eine Datei und führt eine SQL-Abfrage aus, um den Wert dieser Konfiguration abzurufen. Dies führte zu Problemen in meiner Anwendung, bei denen die Konfigurationsdatei von Visual Studio selbst geöffnet und gesperrt wurde (nicht von meiner Anwendung), da nicht nur der Konfigurationswert (über die Setter-Methode) gelesen, sondern auch geschrieben wurde. Um das zu beheben, musste ich es einfach in eine Methode ändern.

2
Jeremy Edwards

Konstruktionsbedingt repräsentieren Eigenschaften Daten oder Attribute von Klassenobjekten, während Methoden Aktionen oder Verhalten von Klassenobjekten sind.

In .Net gibt es andere Auswirkungen auf die Verwendung von Eigenschaften: 

  • Eigenschaften werden in der Datenbindung verwendet, get_/set_-Methoden jedoch nicht. 
  • XML-Serialisierungsbenutzereigenschaften als natürlicher Serilisierungsmechanismus. 
  • Auf Eigenschaften wird mit PropertyGrid control und intern ICustomTypeDescriptor zugegriffen, die effektiv verwendet werden können, wenn Sie eine benutzerdefinierte Bibliothek schreiben. 
  • Eigenschaften werden durch Attribute gesteuert. Sie können sie sinnvoll verwenden, um aspektorientierte Software zu entwerfen.

Missverständnisse (IMHO) bezüglich der Verwendung von Eigenschaften: 

  • Wird verwendet, um kleine Berechnungen sichtbar zu machen: ControlDesigner.SelectionRules 's Get Block Runs in 72 Zeilen !! 
  • Wird verwendet, um interne Datenstrukturen verfügbar zu machen: Selbst wenn eine Eigenschaft keinem internen Datenmitglied zugeordnet ist, kann sie als Eigenschaft verwendet werden, wenn es sich um ein Attribut Ihrer Klasse handelt. Umgekehrt, auch wenn es sich nicht um ein Attribut Ihrer Klasseneigenschaften handelt, ist es ratsam, Array-Datenelemente zurückzugeben (stattdessen werden Methoden verwendet, um eine tiefe Kopie der Elemente zurückzugeben.)

Im Beispiel hier könnte es geschrieben worden sein, mit mehr geschäftlicher Bedeutung als: 

public String Title
{
    set { Label.Text = text; }
}
2
NileshChauhan

Hier ist ein guter Satz von Richtlinien für die Verwendung von Eigenschaften und Methoden von Bill Wagner

  • Verwenden Sie eine Eigenschaft, wenn alle diese Werte zutreffen: Die Getter sollten einfach sein und es ist daher unwahrscheinlich, dass sie Ausnahmen auslösen. Beachten Sie, dass dies keinen Netzwerkzugriff (oder Datenbankzugriff) impliziert. Beides kann fehlschlagen und daher eine Ausnahme auslösen.
  • Sie sollten keine Abhängigkeiten voneinander haben. Beachten Sie, dass dies das Festlegen einer Eigenschaft und das Beeinflussen einer anderen Eigenschaft beinhaltet. (Wenn Sie beispielsweise die FirstName-Eigenschaft festlegen, wirkt sich dies auf eine schreibgeschützte FullName-Eigenschaft aus, aus der die Eigenschaften Vorname + Nachname zusammengesetzt sind. Dies impliziert eine solche Abhängigkeit.)
  • Sie sollten in beliebiger Reihenfolge einstellbar sein 
  • Der Getter hat keine beobachtbare Nebenwirkung. Beachten Sie, dass diese Richtlinie einige Formen der verzögerten Bewertung in einer Eigenschaft nicht ausschließt.
  • Die Methode muss immer sofort zurückkehren. (Beachten Sie, dass dies eine Eigenschaft ausschließt, die einen Datenbankzugriffsabruf, einen Webdienstaufruf oder einen anderen ähnlichen Vorgang ausführt.).
  • Verwenden Sie eine Methode, wenn der Member ein Array zurückgibt.
  • Wiederholte Aufrufe des Getters (ohne dazwischenliegenden Code) sollten denselben Wert zurückgeben. 
  • Wiederholte Aufrufe des Setters (mit demselben Wert) sollten keinen Unterschied zu einem einzelnen Anruf ergeben.

  • Der get sollte keine Referenz auf interne Datenstrukturen zurückgeben (siehe Punkt 23). Eine Methode könnte eine tiefe Kopie zurückgeben und dieses Problem vermeiden.

* Entspricht meiner Antwort auf eine doppelte Frage.

1
Chris Ballance

Das ist einfach.

1: use-Eigenschaft, wenn Ihre Daten vor dem Speichern in Feld überprüft werden sollen. Auf diese Weise stellt die Eigenschaft die Kapselung für Ihre Felder bereit. Wenn Sie Ihre Felder öffentlich hinterlassen, kann der Endbenutzer einen beliebigen Wert zuweisen, der gemäß Ihren geschäftlichen Anforderungen gültig sein kann oder nicht. Das Alter sollte größer als 18 sein. Bevor der Wert in das entsprechende Feld geschrieben wird, müssen wir seine Gültigkeit prüfen. Auf diese Weise repräsentieren Eigenschaften Daten.

2: Methode verwenden, wenn Sie eine Aktion ausführen möchten, bei der Sie Daten als Parameter angeben, und Ihre Methode führt eine Verarbeitung auf der Grundlage der bereitgestellten Werte durch und gibt den verarbeiteten Wert als Ausgabe zurück. Oder Sie möchten den Wert eines Feldes durch diese Berechnung ändern. "Auf diese Weise repräsentiert die Methode die Aktion".

0
Saurabh Mishra