Facebook
Twitter
Google+
Kommentare
18

Adam-Klassen

Vor einem Jahr oder so kam ich mal auf die Idee eine PHPedia aufzubauen, ein paar Begriffe einfach erläutern und schön irgendwie „abheften“. Habe ich eigentlich ziemlich schnell wieder fallen gelassen, weil ich glaube, dass man damit die Leser ziemlich schnell langweilen kann. Heute ist das Thema aber wieder aufgepoppt. Ich habe da ein paar Begriffe, die ich neu gelernt habe und die vielleicht auch nicht zum Sprachgebrauch jeden Lesers gehören. Wie wäre es also, wenn ich diese für mich neuen Ausdrücke hier kurz beschreibe? Ich glaube das ist eine brillante Idee.

Der heutige Artikel soll sich also um Adam-Klassen drehen. Eigentlich sind sie auch ganz schnell erklärt. Fangen wir aber erst mal mit dem nächsten Verwandten dieser Spezies an, der Gott-Klasse. Eine Gott-Klasse ist eine Klasse, die von allen anderen Verwendet wird. Sozusagen das Schweizer-Armee-Messer der Softwareentwickler. Nur leider nicht in einem McGyver-Sinn. (Wer kann mir übrigens ohne nachzuschauen, den Vornamen von McGyver sagen?). Ganz klar baut man sich viel zu viele Abhängigkeiten mit so einer Klasse auf und schon haben wir einen fiesen Code-Smell in unserer Applikation, denn jede Änderung an der Klasse zieht viele Änderungen in den anderen nach.

Bei Gott-Klassen haben wir also eine nutzende Abhängigkeit. Bei Adam-Klassen ist das ein wenig anders. Dort haben wir nämlich eine ableitende Abhängigkeit. Jede mögliche Klasse leitet sich also von diesem Ursprungsobjekt ab. Meist steckt in so einem Objekt auch so viel nützliche Funktionalität, dass man ja doof wäre, wenn man nicht davon ableitet. Das ist aber meistens eine blöde Idee. Irgendwie gibt es ja den OOP-Leitspruch, dass man nur ableiten soll, wenn man die Elternklasse konkretisieren will und nicht, wenn es darum geht Funktionalitäten zu sammeln. Dafür sollte man die Delegation verwenden. Da können wir aber auch gerne mal wann anders drauf eingehen.

Wahrscheinlich kennt jeder diese Art sich seinen Code zu verbauen, für mich war nur der Name neu und deswegen wollte ich ihn teilen.

Über den Autor

Nils Langner

Nils Langner ist der Gründer von "the web hates me" und auch der Hauptautor. Im wahren Leben leitet er das Qualitätsmanagementteam im Gruner+Jahr-Digitalbereich und ist somit für Seiten wie stern.de, eltern.de und gala.de aus Qualitätssicht verantwortlich. Nils schreibt seit den Anfängen von phphatesme, welches er ebenfalls gegründet hat, nicht nur für diverse Blogs, sondern auch für Fachmagazine, wie das PHP Magazin, die t3n, die c't oder die iX. Nebenbei ist er noch ein gern gesehener Sprecher auf Konferenzen. Herr Langner schreibt die Texte über sich gerne in der dritten Form.
Kommentare

18 Comments

  1. Ach Nils, stell dein Licht doch nicht unter den Scheffel. Angus ist doch nur dein Deckname! 😉

    P.S. Sorry für das Kommentarrauschen, aber du hattest ja gefragt 🙂

    Reply
  2. Mal eine Frage zum Artikel…

    Warum genau sollte man denn solche Adam Klassen nicht verwenden?! Vielleicht habe ich es ja auch nicht richtig verstanden, aber wenn ich mir zum Beispiel das CakePHP-Framework anschaue, dann erben die Controller doch auch alle vom AppController und haben somit ein paar grundlegende Eigenschaften und Funktionen die ich sonst blöd nachprogrammieren müsste.

    Also so richtig sehe ich keinen Grund warum man solche Adam-Klassen nicht verwenden sollte.

    Reply
  3. @Alex: richtig, aber extenden deine models auch von der selben klasse ?

    Zitat „Jede mögliche Klasse leitet sich also von diesem Ursprungsobjekt ab.“

    Reply
  4. @Nils: da haben wir ja schon den Namen für den Nachwuchs gefunden. Angus Langner 😉 Übrigens wäre dir die Adam-Klasse nicht neu gewesen, wenn du den PHP Summit nicht geschwänzt hättest 😉

    @Alex: um bei CakePHP zu bleiben (ich möchte betonen, dass ich es NICHT verwende); eine Adamklasse wäre sowas wie Object.

    Reply
  5. Also ehrlich gesagt weiß ich jetzt nicht so konkret, was gegen Adam spricht.
    Wenn es um die „is-ein“-Formulierung geht: „Ist ein Objekt“ ist meines Erachtens eine genauso gültige Formulierung, wie jede tiefergehende Konkretisierung.
    Ich hab auch schon solche Vererbungen eingebaut, aber viel Funktionalität war da nicht drin. Ähnlich wie Adam selbst war die relativ nackt 😉

    Reply
  6. @Alex: Meistens sind Adam-Klassen verwendet, obwohl es mit Delegation besser gelöst wäre, denn so verbaust du dir nämlich nicht die Ableitungshierachie. Delegieren kannst du so oft wie du willst, ableiten nur ein mal.
    Mies ist es auch, wenn alle Klassen davon ableiten und du machst eine Änderung im Interface.

    Reply
  7. Also eine Adamsklasse wäre also zum Beispiel eine Helperklasse von der dann alle Klassen erben, die diese Helpermethoden benutzen wollen… Hier sollte man ja lieber diese Methoden an der Helperklasse direkt aufrufen anstatt sie sich „hineinzuerben“.

    Bei einem AbstraktController von dem konkrete Controller erben handelt es sich ja um saubere Vererbung. Weil die Methoden im AbstractController ja direkt für alle Controller gedacht sind. Böse wäre es, wenn sich ein Model von so einem AbstraktController erben würde um gewisse Funktionalitäten nutzen zu können.

    Reply
  8. Da ich gerade alle 7 Staffel MacGyver gucke, wollte ich nur anmerken, dass man den Menschen, der übrigens mit Angus mit Vornamen heißt (was ich als MacGyverexperte natürlich ohne nachzugucken wusste^^) M_a_cGyver heißt 😉

    Reply
  9. Also ich verwende, ähnlich wie Cake oder auch CodeIgniter, auch eine übergeordnete Klasse, die aber nur dazu dient um in der Laufzeit eine Sammlung aufzubauen und den Zugriff auf einzelne Objekte zu erleichtern.

    $this->load->module(‚input‘);
    $this->input->get();

    erscheint mir persönlich schöner als

    $input = load_module(‚input‘);
    $input->get();

    Zumal ich mir so eine ständige Neuinitialisierung erspare, wenn ich die selbe Klasse in untergeordneten Objekten verwenden möchte.

    Reply

Leave a Comment.

Link erfolgreich vorgeschlagen.

Vielen Dank, dass du einen Link vorgeschlagen hast. Wir werden ihn sobald wie möglich prüfen. Schließen