Was ist der Vorteil eines privaten Attributs mit Getter und Setter? [Duplikat]

8

In der objektorientierten Programmierung hatte ich diese Frage und tue es immer noch:

  

Was wäre der Vorteil, wenn wir ein Klassenmitglied als privat deklarieren würden   wird dafür einen public getter und einen public setter erstellen?

Ich sehe keinen Unterschied auf der Sicherheitsstufe zwischen dem obigen Fall und dem Fall, dass das Klassenmitglied als öffentlich deklariert wird.

Danke!

    
loulou 17.09.2013, 09:07
quelle

15 Antworten

12

Die Einkapselung bietet das Verstecken von Daten und mehr Kontrolle über die Elementvariablen. Wenn ein Attribut öffentlich ist, kann jeder darauf zugreifen und ihm einen beliebigen Wert zuweisen. Wenn Ihre Mitgliedsvariable jedoch privat ist und Sie einen Setter dafür bereitgestellt haben. Dann haben Sie immer die Möglichkeit, einige Einschränkungen in die Setter-Methode zu setzen, um zu vermeiden, dass ein unlogischer Wert eingestellt wird.

Zum Beispiel eine Klasse mit nur öffentlichem Mitglied:

%Vor%

Gleiche Klasse mit privatem Mitglied und einem Setter:

%Vor%     
Juned Ahsan 17.09.2013 09:10
quelle
8

Wenn Ihre Klasse keine zu wartenden Invarianten hat, dann ist es sinnlos, öffentliche Getter und Setter für ein privates Datenmitglied zu schreiben; Sie sollten nur ein öffentliches Datenelement verwenden.

Wenn Sie jedoch Invarianten pflegen möchten, können Sie mit einem Setter die Werte einschränken, die dem Datenelement zugewiesen werden können.

Beachten Sie, dass, nur weil Sie ein Datenelement haben, nicht bedeutet, dass Sie Getter oder Setter dafür schreiben müssen.

Ärgern Sie sich: "Was aber, wenn sich die Einbauten ändern?" Es ist egal. Sie hatten eine Funktion getName , die eine std::string const& zurückgegeben hat. Getter reduzieren die Kapselung, da sie Ihre Auswahl einschränken, wenn Sie später die Implementierung ändern.

    
Simple 17.09.2013 09:23
quelle
3

Ссылка

Sie könnten später die interne Repräsentation des Klassenmembers ändern, dem Getter und Setter Funktionen hinzufügen (z. B. einen Observer benachrichtigen), ohne die Schnittstelle zu ändern (der öffentliche Getter und Setter).

    
h.g. 17.09.2013 09:11
quelle
3

Ihre Frage ist in der Tat der Unterschied zwischen Feldern und Eigenschaften. Fileds sind normalerweise privat und Eigenschaften setzen sie aus. Bellow ist ein Zitat einer brillanten Antwort auf SO:

  

Eigenschaften setzen Felder frei. Felder sollten (fast immer) aufbewahrt werden   privat zu einer Klasse und über get und set Eigenschaften zugegriffen. Eigenschaften   Stellen Sie eine Abstraktionsebene zur Verfügung, mit der Sie die Felder währenddessen ändern können   nicht die äußere Art beeinflussen, auf die sie von den Dingen zugegriffen werden   Verwenden Sie Ihre Klasse.

Was ist der Unterschied zwischen ein Feld und eine Eigenschaft in C #?

In C # automatische Eigenschaften erstellen ein Feld für Sie, ohne es manuell deklarieren zu müssen:

%Vor%     
Moslem Ben Dhaou 17.09.2013 09:17
quelle
3

Schnell (und ein bisschen dumm) Beispiel:

%Vor%

Kurz gesagt: Sie gewinnen die Kontrolle und können sicherstellen, dass die Werte korrekt sind. Es heißt Einkapselung.

    
Pablo Lozano 17.09.2013 09:14
quelle
2
  

Ich sehe keinen Unterschied auf der Sicherheitsstufe zwischen dem obigen Fall und dem Fall, in dem das Klassenmitglied als öffentlich deklariert wird.

Sofortige Frage sind:

1) Was ist, wenn Sie einige Bedingungen überprüfen möchten, während Sie den Wert festlegen?

2) Was ist, wenn die Teilklassen etwas anderes zurückgeben oder setzen wollen, indem sie diese Methode übergehen?

Anderer Grund: Warum getter und Setter sind besser als öffentliche Felder in Java

    
quelle
2

Wenn Sie ein Datenübertragungsobjekt haben, mit begrenztem Umfang und von Entwurf sollte es keine Logik zugeordnet haben, ich sehe keinen Wert in Getter und Setter.

Wenn Sie jedoch eine Komponente haben, der möglicherweise eine Logik zugeordnet ist oder die nicht weit verbreitet ist, ist es sinnvoll, die Details der Datenspeicherung zu verbergen. Anfangs könnte es so aussehen, als ob alle Getter und Setter trivial sind und nur Ihre Klasse füllen, aber im Laufe der Zeit können Sie den Setter eine Validierung hinzufügen und sogar die Getter ändern. z.B. Sie könnten ein Feld löschen (und in Zukunft eine Konstante zurückgeben), die Daten in einem delegierten Objekt speichern oder den Wert aus anderen Feldern berechnen.

    
Peter Lawrey 17.09.2013 09:15
quelle
1

Denken Sie neben der -Einkapselung an eine Situation, in der Ihr -Setter nicht einfach einen Wert festlegt.
Was ist, wenn Sie es in vielen Klassen verwenden? Und jetzt erkennen Sie, dass Sie die Funktionalität ändern wollen? Sie müssen es an ganzen Stellen ändern, an denen Sie es manuell einstellen. Wenn du einen Setter hättest, wäre das Leben einfacher gewesen.

    
Maroun 17.09.2013 09:12
quelle
0

Accessor-Methoden bieten einen einzigen Aktualisierungspunkt für ein bestimmtes Feld. Dies ist vorteilhaft, weil die Validierungslogik oder andere Änderungen am Feld über die einzige Methode gesteuert werden können, anstatt auf das Feld direkt innerhalb der Codebasis zuzugreifen.

Siehe dieses IBM Dokument, das weitere Vorteile aufzeigt: Ссылка

>     
Kevin Bowersox 17.09.2013 09:12
quelle
0

Wenn der öffentliche Getter und der öffentliche Setter nur den Wert des privaten Eigentums zurückgeben und seinen Wert ändern sollen, sehe ich keinen Unterschied.

Sie implementieren jedoch die Kapselung, sodass Sie zu einem späteren Zeitpunkt ein anderes Verhalten implementieren können, z. B. die Überprüfung von Argumenten für Setter oder schreibgeschützte / schreibgeschützte Eigenschaften.

    
elnigno 17.09.2013 09:13
quelle
0

Wenn Sie sich alleine in einem kleinen Projekt entwickeln und Ihren Code nicht wiederverwenden, ist das eigentlich nutzlos, aber es ist meistens ein guter Habit.

Aber in der Teamentwicklung müssen Sie möglicherweise etwas Kontrolle über Änderungen haben, und Sie können dies über die Getter und Setter tun.

Außerdem haben Sie in einigen Klassen nur Getter, da die Setter vom Konstruktor oder über andere Funktionen ausgeführt werden.

    
Clément Berthou 17.09.2013 09:14
quelle
0

Das Deklarieren von Variablen als private wird als Encapsulation in Java bezeichnet.
Hier sind einige Vorteile der Verwendung von Encapsulation beim Schreiben von Code in Java oder einer objektorientierten Programmiersprache:

  
  1. Gekapselter Code ist flexibler und kann mit neuen Anforderungen einfach geändert werden.
  2.   
  3. Die Einkapselung in Java erleichtert das Komponententesten.
  4.   
  5. Encapsulation in Java ermöglicht Ihnen zu kontrollieren, wer auf was zugreifen kann.
  6.   
  7. Encapsulation hilft auch, unveränderliche Klasse in Java zu schreiben, die eine gute Wahl in Multithreading sind   Umgebung.
  8.   
  9. Verkapselung reduziert die Kopplung von Modulen und erhöht die Kohäsion in einem Modul, weil alles ein Ding ist   sind an einer Stelle gekapselt.
  10.   
  11. Encapsulation ermöglicht es Ihnen, einen Teil des Codes zu ändern, ohne andere Teile des Codes zu beeinflussen.
  12.   

ein weiterer Vorteil ist

  

Indem Sie Variablen in Java privat machen und Getter und Setter für sie bereitstellen, wird Ihre Klasse kompatibel mit der Java-Bean-Namenskonvention

    
Prabhaker 17.09.2013 09:15
quelle
0

Wie bei jeder Kapselung: Es verbirgt die Implementierungsdetails. Auf diese Weise können Sie den Zugriff steuern und eine stabile Schnittstelle bereitstellen, selbst wenn sich die Interna ändern.

Setter steuert den Zugriff

%Vor%

Getter ist während der API-Entwicklung nützlich

%Vor%     
Angew 17.09.2013 09:22
quelle
0

Ich habe nur eine Sache zu den ausgezeichneten Antworten hinzuzufügen, die dieser Beitrag bisher hat.

Manchmal kann ein Klassenattribut mehr als einen Getter oder Setter haben, lassen Sie uns das mit einem dummen kurzen Beispiel illustrieren:

%Vor%

Es ist sinnlos, den Wert für jeden Einheitentyp, den Sie bearbeiten möchten, mehr als einmal zu speichern. Daher stellen die Getters und Setter eine Schnittstelle bereit, die die Klasse in die Lage versetzt, mit verschiedenen Einheiten zu arbeiten.

IMHO, wenn ein Objekt aktive Attribute enthält (Attribute, die nach oder vor der Zuweisung oder dem Zugriff arbeiten müssen), muss es ein class mit nur den wesentlichen Getters und Setter sein (die privaten Attribute, die nicht benötigt werden) Zugriff außerhalb der Klasse, benötigt offensichtlich keine öffentlichen Getters und Setter).

Wenn andererseits ein Objekt nur passive Attribute enthält (Attribute, die nicht zusätzliche Arbeit erfordern, wenn sie zugewiesen oder aufgerufen werden), muss es ein struct sein und daher sind alle seine Attribute öffentlich zugänglich ohne Getters und Setter.

Beachten Sie, dass diese Antwort aus den stammt Sicht der diese Frage für weitere Informationen.

    
Paula_plus_plus 17.09.2013 10:33
quelle
0

Eines der wichtigsten Konzepte objektorientierter Programmierung ist die Kapselung. Sie kapseln Daten und die Methoden zusammen, die auf diese Daten wirken. Idealerweise sollte auf Daten nur über die zugehörigen Methoden zugegriffen werden. Und der Zustand der Daten sollte von anderen Objekten über diese Methoden "abgefragt" werden. Wenn Sie eine Variable public machen, wird diese Variable direkt für alle anderen Objekte verfügbar, die die Kapselung aufheben.

    
TheLostMind 17.09.2013 10:40
quelle

Tags und Links