Projektwerkstatt: PTI und phpDepends
Ich habe ja die letzte Zeit ein paar Worte über PTI verloren. Ist übrigens immer noch mein Tool Highlight des Jahres. Beruflich durfte ich auch die letzen zwei Wochen ein wenig rumspielen und ausprobieren. Da bis jetzt „nur“ eine Unterstützung für PHPUnit und den PHP_CodeSniffer integriert sind, würde ich doch gerne mal in einer Projektwerkstatt das System so erweitern, dass es fähig ist phpDepend zu nutzen.
Vielleicht noch mal kurz vorne Weg: phpDepend ist ein Tool von Manuel Pichler zur statischen Code-Analyse, das sich auf den Bereich Softwaremetriken konzentriert. Alle Metriken, die wir hier vorgestellt haben sind sogar dort abgedeckt. Ist aber auch keine große Leistung, denn es war auch nur eine. phpDepend unterstützt aber mehr, keine Sorge.
Die Idee mit der Integration ist also folgende. Sobald ich meine Datei in Eclipse speichere, läuft phpDepend los und berechnet mir meine Metriken. Eclipse nimmt sich diese Werte und markiert mir alle Methoden und Klassen, die von den berechneten Werten her, ein vorher definiertes Limit überschreiten (oder unterschreiten, je nach Metrik). Da phpDepend nur für die reine Berechnung zur Verfügung steht (und das auch gut so ist), müssen wir die Limits in einen eigenen Logger packen oder das ganze in Eclipse und damit in Java abbilden. Momentan würde ich die Java Alternative bevorzugen, denn somit habe ich alle Daten bereits in Eclipse und kann noch ein paar weitere „Schweinereien“ mit machen.
Ok, also was es macht ist jetzt klar. Jetzt gehen wir noch darauf ein, wie man das Tool konfigurieren können soll. phpDepend erstellt XML Dateien. Es gibt Element, die Methoden repräsentieren. Diese Elemente besitzen Attribute, die die Werte der Metrikfunktionen wiederspiegeln.
<?xml version="1.0" encoding="UTF-8"?>
<metrics ahh="0.19444444444444" andc="0.46268656716418" calls="1406" ccn="1203" ccn2="1237" cloc="11657" clsa="7" clsc="60" eloc="6528" fanout="571" leafs="59" loc="20078" maxDIT="2" ncloc="8421" noc="67" nof="0" noi="21" nom="578" nop="11" roots="5">
<files>
<file name="/usr/local/pear/PEAR/PHP/Depend/StorageRegistry.php" cloc="81" eloc="18" loc="103" ncloc="22"/>
</files>
<package name="PHP_Depend" cr="1.3005761647303" noc="3" nof="0" noi="4" nom="51" rcr="0.50515422957667">
<class name="PHP_Depend_Parser" cis="12" cloc="250" cr="0.15" csz="113" dit="0" eloc="526" impl="1" loc="913" ncloc="663" nom="20" rcr="0.1925" vars="6" varsi="6" varsnp="0" wmc="107" wmci="107" wmcnp="12">
<file name="/usr/local/pear/PEAR/PHP/Depend/Parser.php"/>
<method name="__construct" ccn="1" ccn2="1" cloc="0" eloc="4" loc="6" ncloc="6" npath="1"/>
<method name="_consumeComments" ccn="3" ccn2="3" cloc="0" eloc="10" loc="12" ncloc="12" npath="3"/> ...
</class>
</package>
</metrics>
Hier aber einfach mal ein Beispiel. phpDepend bringt Standard Metriken mit. Diese müssen im Tool hinterlegt werde. Eine Tabelle mit Shortcut und Name mit Beschreibung müsste im Tool hinterlegt sein (sollte pflegbar sein, denn wir haben phpDepend zum Beispiel um eigene Metriken erweitert). Des Weiteren muss der Anwender die Möglichkeit haben in einem anderen Konfigurationsfenster weiche und harte Grenzen zu definieren. Bei weichen Grenzen würde eine Warning angezeigt werden, bei übertritt über die harten Grenzen kommt ein Error zu Vorschein. Die Zweite Konfiguration muss natürlich projektspezifisch verwendet werden können.
Schon hätten wir eine wunderbare Erweiterung von Eclipse, die uns hilft noch „besseren“ Code zu schreiben. Ich könnte mir vorstellen, dass viel mehr Entwickler solche Metriken verwenden würden, wenn die IDE so etwas von Haus aus mitbringen würde.
Sehr interessante Idee, gefällt mir.
@Stephan: Dann habe ich eine gute Nachricht. Die Chancen stehen echt hervorragend, das dies in der nächsten Zeit auch umgesetzt wird.
Ich wüsste gerne, wie man PTI verwendet ohne den ganzen Workspace abzuschießen …
Oder liegt das an Zend Studio for Eclipse?
@Stephan: Kannst das „Abschießen“ genauer erklären? Welche Version benutzt du, die 1.0.0 oder die 1.1.0 dev? Wird heute auch ein neues Release geben, welches ggf. deine Probleme behebt.
@Sven: ich glaube du meinst mich 🙂 ALso ich hatte die 1.0.0 einmal ausprobiert, danach ist Eclipse eingefroren undi ch musste das Tool über einen anderen Workspace deinstallieren damit ich den eigentlichen WOrkspace wieder nutzen konnte.
@Dennis: Ähm ja, da war ich etwas zu schnell mit dem schreiben 🙂 Mit dem 1.1.0 Release hat sich einiges unter der Haube getan, so dass das ganze performanter läuft. Solltest du auch mit der neuen Version Probleme haben, kannst du dich gerne direkt an mich wenden.
@Dennis: Welche Sniffs lässt du denn laufen? Es gibt auch welche, die das System zum abstützen bringen können 🙂
Ich hatte mal was zum CodeSniffer eingestellt, allerdings fehlt mir ein „Wie stell ich das richtig ein?“ Hinweis irgendwo. Jeder schreibt nur, wie toll es doch ist aber nichtm wie man es sinnvoll konfiguriert …
Undk ann ich auch Ordner rausnehmen, die nicht geprüft werden sollen?
@ Dennis: ja, über Window -> Preferences -> PHP Tools -> PHP CodeSniffer Kannst Du unten bei „Ignore Directory and Files“ die entsprechenden Ordner eintragen. Z.B.: */ordner/* filter den Ordner „ordner“ inlusive Unterverzeichnisse und egal auf welcher Ebene er liegt.
I think you will find nWire for PHP a useful tool for analyzing dependencies as well. It does not have a reporting tool (well, not yet), but it does provide code navigation and visualization tools.