am 1. Januar 2009
Unglaublich, es ist 9:30 Uhr (zumindest als ich angefangen habe mit schreiben) und ich bin wach. Wäre ja nichts besonderes, wenn es nicht der Neujahresmorgen wäre und das schlimme ist, ich kann schon seit 7 nicht mehr pennen. Ein guter Grund also hier was zu schreiben.
Wie bereits angekündigt wollte ich ja mal was dazu schreiben, wann man private und wann man protected als Sichtbarkeit auf Klassenebene verwenden sollte. Auch wenn es wahrscheinlich eh jeder weiß, hier noch einmal schnell die Bedeutung dieser zwei Schlüsselwörter:
- private – Eine private Methode darf nur im Kontext der Klassen aufgerufen werden, in der sie definiert wurde. Das gleiche gilt für Attribute. Leitet man eine Klasse ab, so wird der Zugriff auf diese Methoden/Variablen verboten. Von “außen” kann man natürlich auch nicht darauf zugreifen.
- protected - Der Zugriff von “außen” ist hier natürlich auch gespannt, nur können diesmal abgeleitete Klassen diese Methoden aufrufen.
Ich weiß, ein alter Hut. Ich wollte aber sicher sein, dass es jetzt wirklich jeder weiß. Und außerdem ist ein wenig Buzzword- (aka. Bullshit-) Bingo ja auch eine feine Sache.
Ich kenne einige Projekte und auch Entwickler, die erst mal jede Methode als protected definieren, denn man könnte sie ja in einer Unterklasse überschreiben wollen. Klingt ja eigentlich gar nicht so dumm. Als zweites Argument hört man die Testbarkeit (hier Unit Tests). Protected Methoden kann man durch eine “Proxyklasse”, die man von der Superklasse ableitet und alle Methoden auf public setzt testen. Vielleicht schreibe ich da ja mal ein Beispiel, obwohl ich das gar nicht mal für eine saubere Sache halte.
Dabei vergisst man aber vielleicht, dass man nur öffentliche Methoden testet. Private und protected machen gar keinen Sinn, da man mit Unit Tests nur das Verhalten nach Außen testet. Eine Art Blackboxtest also. Das Argument, dass man die Methode vielleicht einmal überschreiben will, lasse ich auch nicht gelten. Denn wenn ich sie später überschreibe, dann kann ich sie da auch noch auf protected setzen. Nach dem Motto “You ain’t gonna need it” sollte man auch hier sparsamer sein. Viele Methoden sollten auch per Definition nicht überschreibbar sein. Setter und Getter eines Attribute sollten auf jeden Fall private oder protected sein, das Attribut aber selbst “nur” private. Vorteil hiervon ist eine aufgeräumtere Klasse. Man hat wirklich nur die Methoden zum Aufruf zur Auswahl, die auch Sinn machen.
In unserem aktuellen Projekt sind wir sogar noch einen Schritt weiter gegangen. Wir haben das komplette Model (MVC) “neu” geschrieben, da wir viel zu viele public Methoden gehabt haben, die gar nicht öffentlich sein sollten. Ok das Ding war auch so ziemlich Kacke und in PHP4 geschrieben, was natürlich auch die hohe Anzahl der öffentlichen Methoden erklärt. Dabei haben wir das Model von ca. 50, auf 10 öffentliche Methoden reduziert, was die Handhabung auf jeden Fall vereinfacht. Da lohnt sich auch ein Refactoring.
Als Fazit kann man also sagen, dass man nicht pauschal protected verwenden sollte, sondern vorher darüber nachdenken sollte, ob es wirklich nötig ist. In vielen Fällen is es garantiert eine gute Idee, aber in einigen wohl eher nicht.
Da fällt mir gerade ein, ich habe ja total vergessen euch ein gutes neues Jahr zu wünschen, was ich hiermit machen will.