• Projektwerkstatt: PHPDoc @layer

    von am 10. Februar 2010

    Diese Woche habe ich echt einen Lauf, was Kreativität angeht. Ich bin gerade dabei eine Applikation zu analysieren. Natürlich gibt es dort wie in jeder größeren Architektur Schichten. Das hilft ungemein wenn man sauber arbeiten will, aber wem sage ich das. Wir haben also Schichten in unserer Applikation und man darf nicht auf alle Schichten zugreifen, sondern nur auf ein paar erlaubt.

    layerCakeIch habe mal irgendein Schichtenmodell aus dem Internet genommen. Wichtig ist dabei nicht der Inhalt sondern nur der Aufbau. Das ISO/OSI Modell kennt wahrscheinlich jeder. Egal wieder zum Thema. Wir haben Schichten, die miteinander kommunizieren dürfen und andere, denen es eben nicht gestattet ist.

    Die meisten Klassen meiner Applikation kann ich sauber (genau) einer Schicht zuweisen. Wenn man jetzt einen PHPDoc Keyword hätte, dass einem anzeigt, zu welcher Schicht eine Klasse bzw. Methode gehört, könnte man ein paar schöne Dinge anstellen.

    Na gut vielleicht keine Dinge, aber ein schönes Ding würde mir sofort einfallen. Wenn ich alles markiert habe, kann ich einen CodeSniffer Sniff programmieren, der den Code durchstöbert und mir rausfindet, wo ich gegen die Zugriffsregeln verstoßen habe. Ich könnte dabei zum Beispiel eine direkt erstelle DB Verbindung finden, ohne dabei über meine DB Abstraktion zu gehen.

    Darstellen könnte man das über eine einfache binäre Matrix (darf/darf nicht). Vielleicht kann man auch einfach jedem Package eine Schicht in einem externen Dokument  zuweisen, dann ist der Aufwand geringer.

    Ich glaube es würde einem bei einem großen Projekt mir vielen Entwicklern auf jeden Fall helfen groben Unsinn zu vermeiden. Und außerdem würde es ein Tag geben, das ich erfunden habe. Auch wenn es sowas in Java bestimmt schon 100 Jahre gibt (nur geraten).

    Ich sehe übrigens schon Eclipse Plugins vor mir. Eine Vision entsteht …

    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

    9 Kommentare »


    • Christian
      am 10. Februar 2010 um 08:22 Uhr

      Ich höre schon ganz viele “aber hier muss ich doch..” und “hier kann ich doch nicht anders, als…” Aufschreie, wenn du das an einem lebenden Obkejt versuchst. Aber der Ansatz ist deshalb nicht weniger richtig. Sch***en viel Arbeit allerdings, die so herausgestellten Regeln dann im Nachinein zu befolgen..


    • Christian
      am 10. Februar 2010 um 08:25 Uhr

      Ich wäre übrigens wahrscheinlich für ein externes Dokument um @package und Schicht zu verknüpfen. Zum einen scheint, das weniger Aufwand zu sein, zum zweiten gönne ich dir keinen eigenen Tag! ;)

      Aber vielleicht ist auch @use/usedby was?
      http://manual.phpdoc.org/HTMLSmartyConverter/HandS/phpDocumentor/tutorial_tags.uses.pkg.html


    • Tom
      am 10. Februar 2010 um 09:45 Uhr

      Ich spar mir mal das übliche: “Eigentlich sollte es bei einem gut durchdachten Aufbau gar nicht möglich sein sich zu vertun”.

      Das suchen von “uses” sollte normalerweise kein Problem darstellen: irgendwo gibt es bestimmt schon einen Sniff der Abhängigkeiten zählt. Dieser müsste die Abhängigkeiten lediglich noch protokollieren. Auch die @package bzw. @subpackage Annotations hast du beide schon. Ordne, wie von Christian angedeutet, die Packages und Sub-Packages in einer Konfigurationsdatei einer Schicht zu. Wir benutzen übrigens @subpackage dafür.

      Man könnte es statt an einen Sniff zu schreiben auch an die Unit-Test anbinden: mit einem eigenen Autoloader. Dieser muss eigentlich nur protokollieren welche Datei er nachlädt und welche Klasse das verursacht hat. Dann sollte man sofort sehen, wann jemand aus seinem Layer (bzw. seinem Verzeichnis) heraus in ein fremdes Package springt.

      Normalerweise fallen solche Dinge beim Unit-Tests aber sowieso auf, weil dort jeweils nur eine einzelne Schicht getestet wird und die anderen Schichten gar nicht initialisiert sind (oder besser: sein sollten).

      Ein guter Unit-Test sollte dem Entwickler somit sowieso krachend um die Ohren fliegen, wenn er die Schichtgrenzen verletzt. Wenn das nicht passiert, sollte man sich eher die UnitTests nochmal zur Brust nehmen.


    • Oliver
      am 10. Februar 2010 um 09:48 Uhr

      Doxygen hat u.a. die Möglichkeit der Gruppierung. Das wäre vielleicht eine Alternative.

      http://www.doxygen.nl/grouping.html


    • Tom
      am 10. Februar 2010 um 09:51 Uhr

      Apropos UnitTests: der Nächste der mir so einen Testfall abliefert und behauptet er sei fertig, kriegt von MIR was krachend um dir Ohren!

      function testAdd() {
      $this->assertType(‘int’, add(1, 1));
      }


    • Nils Langner
      am 10. Februar 2010 um 11:24 Uhr

      @Tom: Arbeitest du wirklich in einer Firma, in der solche Probleme nicht existieren? Neue Mitarbeiter oder unter Zeitdruck stehen Kollegen übersehen nunmal oft die Hierarchie, in viele Fällen gibt es auch gar kein Schichtenschaubild, an das man sich halten kann. Würde mich echt interessieren, wie das bei euch ist.


    • Nils Langner
      am 10. Februar 2010 um 11:26 Uhr

      @Christian: Das was du hörst ist eine Workaround-Mentalität, die wohl ein größeres Problem als das durchbrechen der Schichten ist.


    • Tom
      am 12. Februar 2010 um 02:21 Uhr

      @Nils wir haben damit keine Probleme. Die Kollegen arbeiten mit Plugins. Sie können gar nichts falsch machen. An die anderen Schichten kommen sie rein technisch gar nicht erst heran.

      Da müssten Sie schon absichtlich die Template-Engine aushebeln und mit echo() arbeiten. Wer das macht kriegt dann aber wirklich was auf die Finger.

      Einen Controler gibt es nicht – alles virtualisiert. Was übrig bleibt sind quasi leichtgewichtige Services. Vielleicht 20-100 Zeilen Code pro Service.

      Eigentlich regeln die Annotations und Konfigurationsdateien fast alles und nehmen dem Entwickler einen Haufen Schreibarbeit ab.

      Der gesamte PHP-Quellcode zum Erzeugen, Befüllen und Anzeigen eines Formulars heißt.
      /**
      * @template edit
      * @type default
      */
      public function editFoo()
      {
      return true;
      }

      Und dazu ein Template in dem nichts steht außer:
      {create template=”edit” table=”foo” on_edit=”writeFoo”}

      Ernsthaft: that’s it!
      Nicht, dass man es nicht auch komplizierter machen könnte, falls man will.

      Wir haben eher Probleme damit, dass Leute Kopien von Code oder Dateien anfertigen statt sie wiederzuverwenden. Falscher Umgang mit Third-Party-Bibliotheken. Oder aber man macht es sich unnötig kompliziert.

      Und natürlich die Dauerthemen Sicherheit, Qualität von Dokumentation und UnitTests. Aber in diesem Punkt reden sich sicher so manche Entwickler den Mund fusselig.


    • Sind Restriktionen der richtige Weg? | PHP hates me - Der PHP Blog
      am 3. Dezember 2010 um 07:02 Uhr

      [...] irgendwo aufgepasst werden muss, was man damit anrichtet. Ich bin ja mal hingegangen und hatte eine Projektwerkstatt zusammengeklöppelt, in der ich so etwas wie ein Schichten-Model einführen und validieren [...]

    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.