Was ist der Punkt des Zugriffs auf private Variablen durch Getter und Setter (Accessor) Funktionen?

8

In Klassen werden Variablen häufig für die Kapselung privat gemacht, und um die Variablen auf einen bestimmten Bereich zu begrenzen, ermöglichen sie eine bessere Fehlerkontrolle und weniger Fehler. Dies ist sinnvoll, da je weniger Stellen auf eine Variable zugegriffen werden kann, desto weniger Stellen mit dieser Variable auftreten können.

Ich sehe jedoch immer, dass Variablen privat gemacht werden, und dann wird eine Getter- und Setter-Funktion verwendet, um diesen Wert abzurufen (manchmal sogar einen Zeiger auf diese Variable!). Zum Beispiel int a ist privat, um den öffentlichen Zugriff zu verhindern, aber dann erlauben getA() und setA() direkten Zugriff auf sie.

Also versuchen Getter-Funktionen und Setter-Funktionen nicht, privat zu sein? Ich meine, private Variablen mit Accessor-Funktion sind die gleichen wie öffentliche Variablen, nur der Code für den Zugriff ändert sich. (object.variable vs object.getVariable ())

Gibt es einen Grund, warum Benutzer Variablen mit Accessor-Funktionen privat machen? Gibt es Vorteile gegenüber der Veröffentlichung?

Ich spreche über Programmierung im Allgemeinen, aber meistens in C-Sprachen (d. h. C, C ++, C #, Obj-C).

    
fdh 24.01.2012, 23:32
quelle

6 Antworten

11

Das Schlüsselwort und das Tag ist hier "Kapselung". Sie verbergen die Details von a und machen sie trotzdem nutzbar. Ich mag die bereits aufgeführten Gründe, es gibt viele mehr. Hier ist ein weiterer, Sie debuggen, und Sie finden a hat einen falschen Wert. Wenn a öffentlich ist, müssen Sie jeden Ort überprüfen, auf den a zugreift. Wenn a privat mit einer Setter-Methode ist, wissen Sie, dass die einzige Stelle, an der sich a geändert haben könnte, in einem Aufruf von setA() liegt - ein großartiger Ort, um einen Breakpoint zu setzen;)

    
Chris Nash 24.01.2012, 23:40
quelle
2

Wenn Sie die interne Repräsentation dieser Variablen ändern oder mehr tun möchten, wenn sie gesetzt oder abgerufen wird, werden alle anderen Klassen, die sie verwenden, nicht beschädigt (und wenn es sich um eine Bibliothek handelt, müssen Sie sie nicht ändern Ihre API).

Es bedeutet auch, dass Sie einfach einen Haltepunkt setzen können, um zu sehen, wann er verwendet wird (obwohl die meisten Sprachen / Debugger irgendwelche Datenhaltepunkte haben).

    
James McLaughlin 24.01.2012 23:36
quelle
2

Vielleicht möchten Sie der nächsten Version der Bibliothek einige Überprüfungen hinzufügen (oder etwas tun, wenn jemand den Wert liest), und wenn die Variable in der aktuellen Version öffentlich ist, kostet ein Upgrade der Bibliotheksversion sehr viel der Arbeit.

    
asaelr 24.01.2012 23:38
quelle
0

class definiert das Verhalten und die members sind der state des objekts ... also definieren ein setter und ein Getter das Kapselungsverhalten der Klasse, in der andere den Objektstatus finden / ändern können.

Mit anderen Worten: Der Unterschied ist, dass man seinen Nachbarn in sein Haus kommen lässt und nimmt, was er will (alles in der Klasse öffentlich machen) .... oder sicherstellen, dass der Nachbar kommt fragt mich, was er will und Ich gebe ihn (mit einem Getter / Setter ....)

    
Navin Ilavarasan 25.01.2012 00:55
quelle
0

Warum wurde die Kapselung benötigt? Warum wurde oop benötigt? Was ist die Programmiersprache C, die das macht, was wir heute tun? Frag das zu dir selbst. Oder wenn Sie an riesigen Systemen mit Millionen von Codezeilen gearbeitet haben. Und alles, was Sie verwendet haben, waren öffentliche Variablen einer entscheidenden Datenstruktur, auf die von jedem Modul des Programms aus zugegriffen werden kann.

    
alevi.dcosta 10.10.2016 03:01
quelle
0

Ich hatte dieselbe Frage, als ich anfing, Objektorientierte Programmierung zu lernen, weil sie in den meisten Büchern nur Variablen private und öffentliche Methoden (Getter / Setter) hinzufügt, um auf sie zuzugreifen. Also überlegte ich, ob ich darauf zugreifen kann Variable durch Methoden, die öffentlich sind, dann was ist Punkt, um diese Variable privat zu machen.

Ich bekomme Antwort Wenn ich beginne, die eigentliche Geschäftsanwendung zu implementieren.

Betrachten wir einen Klassenschüler, der den Kursteilnehmernamen, Roll-Nr., Noten von 3 Fächern

enthält %Vor%

Hier machen private Variablen aus 2 Gründen

  1. Validierung: Wenn ein Benutzer einen ungültigen Wert für Markierungen angibt, sollte das Schülerobjekt nicht mit ungültigen Daten erstellt werden und den entsprechenden Fehler / Exception auslösen. Im Fall von Markierungen als öffentliche Variablen kann der Benutzer einen beliebigen Wert für sie festlegen. Also habe ich Validierung / Sicherheit hinzugefügt, um sicherzustellen, dass jedes erstellte Schülerobjekt korrekte Daten hat.

  2. Sicherheit Im Fall von Prozent kann der Benutzer seinen eigenen Prozentsatz nicht festlegen. Prozentsatz wird berechnet und intern festgelegt. Hier biete ich nicht Setter-Methode für den Prozentsatz, so dass Benutzer Prozentwert nur durch Getter-Methode abrufen / lesen können.

Dies führt zu Sicherheit in der Abstraktion, die nur auf Lesezugriff auf die Klassenvariable beschränkt ist.

    
Prasad Parab 16.02.2017 08:51
quelle

Tags und Links