Facebook
Twitter
Google+
Kommentare
9

Projektwerkstatt: PHPDoc @layer

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 …

Ü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

9 Comments

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

    Reply
  2. 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.

    Reply
  3. 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));
    }

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

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

    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