• Adam-Klassen

    von am 23. Juni 2010

    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.

    Nils Langner

    Auch wenn Ihr es mir nicht glauben werdet, aber ich habe nichts gegen PHP. Ich rege mich einfach nur gerne auf. Ok so schlimm ist es auch nicht. Eigentlich wollte ich schon immer einen Blog haben und da ...

    Zum Profil von Nils Langner

    18 Kommentare »


    • Ralf Eggert
      am 23. Juni 2010 um 07:58 Uhr

      > Wer kann mir übrigens ohne nachzuschauen, den Vornamen von McGyver sagen?

      Klare Antwort: Nils! ;-)


    • David Müller
      am 23. Juni 2010 um 08:13 Uhr

      Vererbung nur bei einer echten “ist-ein” Beziehung war da glaub ich der Lehrbuch-Leitspruch.


    • Nils Langner
      am 23. Juni 2010 um 08:14 Uhr

      @Ralf: Angus :)
      @David: Da da hast du Recht. Danke.


    • Fabian
      am 23. Juni 2010 um 08:14 Uhr

      > Wer kann mir übrigens ohne nachzuschauen, den Vornamen von McGyver sagen?

      *meld* Angus


    • Udo
      am 23. Juni 2010 um 08:28 Uhr

      Mist, dachte es wäre John … War mit Rambo durcheinander gekommen :-)


    • Christian
      am 23. Juni 2010 um 08:32 Uhr

      Spricht man nicht von Gott Klassen und Adam Objekten?
      http://work.tinou.com/2009/06/god-objects-versus-adam-objects.html


    • Ralf Eggert
      am 23. Juni 2010 um 08:34 Uhr

      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 :-)


    • Arvid Bergelmir
      am 23. Juni 2010 um 08:44 Uhr

      @Ralf: Solang es nur Kommentarrauschen ist und keine Vuvuzelas sind :-)


    • Alex
      am 23. Juni 2010 um 08:52 Uhr

      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.


    • LudwigR
      am 23. Juni 2010 um 09:04 Uhr

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

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


    • Sebastian
      am 23. Juni 2010 um 09:27 Uhr

      @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.


    • KingCrunch
      am 23. Juni 2010 um 09:43 Uhr

      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 ;)


    • Nils Langner
      am 23. Juni 2010 um 09:51 Uhr

      @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.


    • Sven
      am 23. Juni 2010 um 10:12 Uhr

      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.


    • Nils Langner
      am 23. Juni 2010 um 11:08 Uhr

      @Christian: Nein? Weiß auch gar nicht wirklich auf was du hinaus willst :)


    • stietze
      am 23. Juni 2010 um 21:09 Uhr

      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 ;)


    • Dominik Jungowski
      am 24. Juni 2010 um 00:45 Uhr

      Es heißt übrigens MacGyver, mit a!


    • Julius
      am 19. Juli 2010 um 12:25 Uhr

      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.

    RSS Feed für Kommentare zu diesem Artikel. TrackBack URL

    Hinterlasse einen Kommentar

    Werbung
    PHP Magazin
    Ausgabe 02/2010

    Dieses Mal mit Artikeln zu den Themen OpenSocial und Apache Shindig, Graphentheorie, Smarty3

    t3n
    Ausgabe 19

    Social Media (R)evolution. Weitere Themen sind noSQL, Crowdsourcing ...

    PHP Journal
    Ausgabe 2/2010

    PHP & Windows optimal nutzen, die besten PHP-CMS im Überblick, Google-API mit Zend Framework nutzen.

    Wir wurden schon öfters gefragt, ob man uns nicht irgendwie unterstützen kann. Die Antwort war immer einfach: Klar! Am einfachsten ist es eure nächsten Einkäufe bei Amazon über unsere Link abzuwickeln. Damit würdet ihr uns schon sehr helfen. Über Co-Autoren freuen wir uns aber noch mehr.