Ich verstehe Access Modifiers in OOP nicht. Warum machen wir zum Beispiel in Java-Instanzvariablen private und verwenden dann öffentliche Getter- und Setter-Methoden, um auf sie zuzugreifen? Ich meine, was ist die Begründung / Logik dahinter?
Sie erreichen immer noch die Instanzvariable, aber warum verwenden Sie die Setter- und Getter-Methoden, wenn Sie Ihre Variablen einfach veröffentlichen können?
bitte entschuldigen Sie meine Ignoranz, während ich einfach versuche zu verstehen, warum?
Vielen Dank im Voraus. ; -)
Dies nennt man Daten oder das Ausblenden von Informationen .
Im Grunde wollen Sie nicht, dass ein Benutzer (lesen Sie: anderer Programmierer oder Sie selbst) in die Interna Ihrer Klasse stochert, weil es sehr schwierig ist, Dinge zu ändern.
Auf der anderen Seite macht eine saubere Trennung zwischen Schnittstelle und Implementierung (theoretisch) es leicht, etwas intern zu ändern, ohne die Benutzer Ihrer Klasse zu beeinflussen.
Nehmen wir zum Beispiel an, ich hätte ein Button
-Steuerelement mit einem public String text
-Feld. Jetzt beginnen alle meine Button
zu verwenden, aber ich merke, dass die Schaltfläche eigentlich immer auf dem Bildschirm neu gezeichnet werden sollte, wenn sich der Text ändert. Ich habe kein Glück, denn mein Objekt kann nicht erkennen, wenn text
zugewiesen ist. Hätte ich es private
gemacht und stattdessen ein setText()
angegeben, hätte ich einfach einen Repaint-Aufruf zu dieser Setter-Methode hinzufügen können.
Als ein anderes Beispiel nehme ich an, dass ich eine Klasse habe, die eine Datei in ihrem Konstruktor öffnet und sie einem public FileStream file
zuweist. Der Konstruktor löst eine Ausnahme aus, wenn die Datei nicht geöffnet werden konnte. Die anderen Methoden in der Klasse können daher davon ausgehen, dass dieses Feld immer gültig ist. Wenn jedoch jemand in meiner Klasse herumstochert und file
auf null
setzt, stürzen plötzlich alle Methoden in meiner Klasse ab.
Ein sehr wichtiger Punkt, der oft übersehen wird: Sie müssen nicht einen Getter und einen Setter für jedes Feld bereitstellen! Tatsächlich sollten die meisten Felder keinen oder nur einen Getter haben (so dass sie nur gelesen werden können).
Klassen, die nur aus privaten Eigenschaften und öffentlichen Gettern und Settern bestehen, sind genauso schlecht gestaltet wie öffentliche Felder. Es ist ein Anti-Pattern namens anämisches Domänenmodell . Der Punkt ist, dass Getter und Setter es Ihnen ermöglichen, dem Modell über das einfache Speichern von Daten hinaus Verhalten und Logik hinzuzufügen - und in vielen Fällen bedeutet dies, dass Sie keinen Getter oder Setter (oder beides) haben.
Der Unterschied besteht darin, dass Sie mit Gettern und Sätzen steuern, wie auf Instanzfelder zugegriffen wird. Sie können defensive Kopien, unveränderliche Ansichten oder sogar Konvertierungen Ihrer Instanzfelder bereitstellen. Sie haben versteckte Ihre tatsächlichen Implementierungsdetails von anderen. Das ist eine gute Sache!
Je mehr Sie sich verstecken, während Sie Ihre Benutzeroberfläche immer noch freundlich und nützlich gestalten, desto besser. Andere müssen nicht wissen, wie die Dinge funktionieren (weil sie versucht sein könnten, Dinge zu tun, die sie nicht tun sollten); Sie müssen nur wissen, dass die Dinge irgendwie funktionieren.
Ein weiterer Punkt ist Verkapselung - wenn Sie sich entscheiden, wie diese Variable behandelt wird, z. um immer eine Kopie zu speichern / speichern, können Sie es an einer Stelle (dem Getter / Setter) machen, ohne etwas zu brechen.
Wenn Ihre Klasse unveränderlich ist, ist es nicht falsch, Variablen als öffentliche Variablen offenzulegen. (alle werden öffentliche Finalspiele sein) und es gibt keine Regel, dass Getter die Variable immer so zurückgeben soll, wie sie ist. oder Setter sollte die Variable so einstellen, wie es ist. Sie können viele Regeln / Modifizierer usw. um den Zugriff Ihrer privaten Variablen herum einbinden (Datenkapselung)
Erstens sollten nicht alle Datenmitglieder Getter und Setter haben, und ich kann mir vorstellen, dass Sie den Vorteil sehen, diese Variablen privat zu halten.
Zweitens sind die meisten Klassen mehr als zufällige Datensammlungen. Sie repräsentieren Dinge, über die Sie selbstständig denken können. In der Regel bedeutet dies, dass sie bestimmte Eigenschaften haben, auf die ein Entwickler angewiesen ist (häufig als "Klasseninvarianten" bezeichnet). Zum Beispiel sollte eine Rectangle-Klasse die Eigenschaft haben, dass das Zeichnen von Linien zwischen den Eckpunkten Linien im rechten Winkel zueinander ergibt. Wenn es sich bei den Punkten um öffentliche Datenelemente handelt, ist es möglich, dass eine beliebige Anwendung einen Punkt ändert, und Sie haben dann ein Rechteck, das kein Rechteck ist. Wenn Sie eine Einstellfunktion haben, können Sie das richtig handhaben.
Betrachten Sie drittens die Wartung. An einem bestimmten Punkt möchten Sie möglicherweise eine Klassenimplementierung ändern, und Sie können sich fragen, wie viele Dinge Sie ändern müssen. Wenn die Datenelemente öffentlich sind, kann das Ändern von Details der Implementierung jedes der Programme, die diese Klasse verwenden, unterbrechen. Du steckst fest. Wenn es Getter und Setter gibt, können Sie das vielleicht kompensieren, so dass das Setzen eines Wertes etwas mehr oder weniger kompliziert in den Interna machen kann, um den gleichen Effekt wie vorher zu erzielen. Wenn Sie mehr abstrakte Elementfunktionen haben, werden Sie kaum Probleme haben, Änderungen vorzunehmen.
Sie machen Klassenmitgliedsvariablen privat, um zu steuern, wie anderer Code, den Sie möglicherweise nicht kontrollieren, auf sie zugreifen und sie manipulieren kann.
Wenn Sie nur Spielzeugcode schreiben, kann es schwierig sein, den Punkt zu sehen, aber wenn Sie Code schreiben, den andere Leute benutzen und von dem Sie abhängig sind, werden Sie es verstehen.
Als ein einfaches Beispiel ist es wichtig, dass eine Klassenmitgliedsvariable niemals auf null gesetzt wird - sagen wir, dass sie Ihre Klasse aufbrechen wird. Wenn Sie das Feld öffentlich machen, kann jeder andere Code diese Variable auf null setzen. Sie können nichts tun.
Wenn Sie es als privat definieren und stattdessen eine Setter-Methode bereitstellen, können Sie das Element davor schützen, auf null gesetzt zu werden, können Sie steuern, ob Sie eine eingecheckte / ungeprüfte Ausnahme auslösen oder den Versuch einfach ignorieren.
>Dies sind die Hauptvorteile der Verwendung von OOP, Polymorphismus, Vererbung und Kapselung.
MitEncapsulation können Sie die Implementierung oder die Daten Ihres Objekts ausblenden, indem Sie den privaten Zugriffsmodifikator verwenden.
Andererseits möchten Sie die Daten mutieren und somit die Setter-Methode erstellen. Hoffe, das hilft.
Sie sprechen über OOP-Grundlagen. Dieses Thema lohnt sich, ein schönes Buch zu lesen. Verschiedene Blogs und Foren (von denen eines SO ist) sind nicht der geeignete Ort, um grundlegendes Wissen zu erlangen.
Wenn Sie wirklich tief in diese Grundlagen eintauchen wollen, die für einen guten Entwickler wichtig sind, dann lesen Sie verwandte Bücher. "Code Complete" oder "Object Oriented Analysis" sind es wert, sie zu lesen.
Tags und Links java c++ programming-languages computer-science oop