Was ist schlecht an public Properties?

Immer wieder kommt während der Entwicklung die Diskussion auf, ob die Sichtbarkeit der Objekteigenschaften public, protected oder private sein sollte.

Aber welche Vor- und Nachteile haben denn nun die einzelnen Einstellungen?


“Lass es uns doch einfach halten”, “Das macht doch viel mehr Arbeit” oder “Mehr soll dieses Objekt nie können” und “Unsere Designer kennen das doch nur so” sind oft die Argumente warum die Eigenschaften public sein sollten.

Persönlich bin ich immer für eine saubere Datenkapselung und Verwendung von Zugriffsmethoden.

Zunächst ist es richtig, dass die Programmierung der Zugriffsmethoden mehr Arbeit macht, als einfach eine öffentliche Variable zu verwenden. Viele IDEs, z.B. Eclipse können diese Methoden aber auch automatisch generieren, so dass wirklich nur noch wenige Mausklicks nötig sind.

Viele andere Sprachen bieten die Typisierung von Variablen standardmäßig an, so dass man sich dort schon weitestgehend darauf verlassen kann welcher Typ vorliegt. PHP zum Beispiel bietet das (bislang) nicht und wir müssen uns selber darum kümmern.

Das schützt uns aber auch noch nicht davor, dass statt dem geforderten Objekttyp ein NULL-Wert gesetzt ist und wir mit einem Methodenaufruf einen Laufzeitfehler auslösen. Solche Anforderungen können wir dann in unseren Zugriffsmethoden umsetzen.

Wird einer Set-Methode ein NULL-Wert übergeben, so können wir entsprechend darauf reagieren und eine Exception werfen.

Ebenso können wir auch der Get-Methode eine nützliche Logik implementieren. Ist die Eigenschaft beim Methodenaufruf noch nicht gesetzt, können wir an dieser Stelle z.B. ein (Null-)Objekt erzeugen, einen bestimmten Wert aus der Datenbank laden oder einfach einen Standardwert zurückgeben.

Oftmals ergibt sich auch die Anforderung, auf Veränderungen an einem Objekt reagieren zu müssen. Dafür bietet sich das Observer/Beobachter-Entwurfsmuster an.

Die Beobachter müssen über eine Veränderung benachrichtigt werden und auch das funktioniert über die Zugriffsmethoden. Würden wir zu einem späteren Zeitpunkt feststellen, dass wir das Objekt beobachten müssen und dafür eine nachträgliche Veränderung der Schnittstelle erforderlich ist, bringt das meist sehr viel Arbeit und potentielle Fehlerquellen mit sich, da alle Stellen im Programm überarbeitet werden müssen, an denen das Objekt verwendet wird.

Es gibt natürlich auch immer wieder Situationen, die öffentliche Eigenschaften verlangen oder in denen die Handhabung einfacher wird, z.B. weil schon 150 Templates damit arbeiten und nicht extra angepasst werden sollen.

Verschiedene Sprachen bieten dafür Möglichkeiten an, um direkte Zugriffe auf Objekteigenschaften an Zugriffsmethoden zu delegieren.

Bei PHP ab Version 5 sind das die sogenannten Magischen Methoden oder Interceptor-Methoden __get() und __set().

Alles in allem haben wir bei der Programmierung unserer Klassen etwas mehr Aufwand, aber dafür weniger Stress, wenn sich unsere Anwendung in eine Richtung weiterentwickelt, die wir heute noch nicht vorhersehen können.

Kommentare sind deaktiviert.

Schlagwörter: Adapter, Amazon, Animation, Annotations, Anonyme Klasse, Ant, Apache, API, Array, ArrayAccess, Attachment, AutoLoader, Bedienung, Bedingung, Benchmark, Bildbearbeitung, BOM, Bootstrap, Bot, Byte Order Mark, Callback, CamelCase, Canvas, Captcha, Cheatsheet, CLI, Closure, Cloud, CodeSniffer, Community, Comparator, Contest, Controller, Converter, CouchDB, Countable, Cronjob, CSV, CustomLibrary, Custom_Model, Data Mapper, Datei, Datenbank, Datenstruktur, Datentypen, Dating, Decorator, Dekorierer, Design Patterns, Dump, Duplikat, each, Eclipse, Entwicklung, Entwurfsmuster, Enum, Erweiterung, Eventhandling, Exception-Handling, Extension, Factory, Fehler, Flash, Foreach, Formatierung, Formular, Funktion, Futon, Header, HTML5, HTTP, IDE, If, Implementierung, InnoDB, Interceptor, Interface, isset, Iterator, Java, JavaScript, jQuery, Konfiguration, Konsole, Kontrollstruktur, kopieren, Late Static Binding, Layout, Linux, Listeners, Logging, Löschen, Magento, Magic Methods, Marketing, Methode, Model, MVC, MySQL, NetBeans, Objekt, Observable, Observer, OOP, Operator, Parameter, Partnersuche, Performance, PHP, phpMyAdmin, PHPUnit, Plugin, Proxy, Qualitätssicherung, Query, Reflection, Request, Response, Rest-API, Rockstar, Routing, S3, Samba, Scheifen, Schleife, Schutz, Secure Shell, Selbstreferenz, Shop, Sicherheit, Sicherung, Singleton Pattern, SOAP, Sortierung, Sourcecode, Spam, Speicherproblem, Spickzettel, SPL, SSH, Statement, Stellvertreter, Strategy Pattern, Stream, String, Sun VirtualBox, Support, Switch, Symfony, Symfony2, Symfony Live, Tag, Template, Template Method, Ternär Operator, Testing, Thumbnail, Tool, Tour, Twig, Type-Cast, Umwandlung, Underscore, unset, Vererbung, Verzweigung, Video, Videospiel, Virtualisierung, Visitor Pattern, Vorschaubild, walk, Webserver, Webservice, Weiterleitung, Wrapper, Youtube, Zeitsteuerung, Zend Framework, Zend_Cloud, Zend_CodeGenerator, Zend_Http_Client, Zend_Service, Zugriffsmethode