User login |
Métriques et dépendancesPrésentationPhp_Depend est un outil d'analyse de code qui permet de cartographier les dépendances entre les différents packages de classes composant une application. Il calcule 4 métriques différentes :
Ces 4 métriques sont utilisées pour générer un grahique qui permet une lecture rapide du niveau d'instabilité et d'abstraction du code considéré. Les résultats de l'analyse sont également stockés dans un fichier xml. A noter que la définition de package au sens de php_depend n'est pas explicite, d'autant que cette notion n'existe pas en PHP. Installation et configurationL'installation se résume à effectuer un checkout sur le dépôt subversion du projet (svn.xplib.de/PHP_Depend/trunk/). L'analyse demandant apparament une grosse quantité de mémoire, il est conseillé d'augmenter la quantité de mémoire allouée aux scripts php lors de leur éxécution à 128M, dans le php.ini. La documentation est quasi nulle, Php_Depend étant un projet encore jeune. Cependant, sa configuration et sa mise en oeuvre sont très simples. En effet, il suffit d'éxécuter en ligne de commande un script php. UtilisationPhp_Depend s'utilise en ligne de commande et nécéssite apparament une quantité de mémoire importante. L'analyse d'opentime a par exemple nécéssité de passer la quantité de mémoire maximum utilisable par un script php à 128M via le php.ini. La syntaxe d'utilisation est la suivante : php pdepend.php Php_depend a été testé à l'aide des applications/scripts suivants : Les tests ont été effectués sur un ordinateur portable Acer Aspire 5720Z (Core Duo T2310 à 1.46 GHz, 2 Go de RAM DDR2 667 MHz) sous système d'exploitation FreeBSD 6.3 Release. JoomlaPhp_Depend s'est montré incapable de mener à bien l'analyse de joomla. Une exception est générée par le script, indiquant qu'il n'arrive pas à analyser une fonction, sans plus de détail. Aucun fichier concernant joomla n'a donc pu être généré par Php_Depend. DotclearL'éxécution de Php_Depend sur dotclear a nécéssité environs 4 secondes pour un volume de code de 2,4Mo. Le graphe généré est peu lisible, les noms de classes étant superposés. JelixL'éxécution de Php_Depend sur opentime a nécéssité environs 8 secondes pour un volume de code de 3,5Mo. Le graphe généré est peu lisible, les noms de classes étant superposés. Script php spécifiqueLe graphe généré par php_depend ne semble pas cohérent par rapport au script php spécifique. Il détecte bien les classes abstraites et les classes concretes, et donc la métrique Ca est correctement calculé, mais les dépendances entre les classes ne semblent pas prisent en compte dans le calcul du Ce. De plus, il ne semble pas capable de détecter les dépendences entre classe. ConclusionPhp_Depend, de part son concept, peut être un outil intéressant pour valider la conception d'une application, de par les métriques qu'il calcule. Cependant, le graphe qu'il génére, qui prend en compte l'intégralité des classes définies, est peu lisible. Un argument à passer au script pour lui demander de générer le graphe relatif à un package ou une classe de l'application serait intéressant. De plus, il manque un graphe de dépendance et malheureusement, le script xml généré par le script ne permet pas de générer un tel graphe. Les graphes peuvent également paraitre quelque peu incompréhensibles pour le non initié./ Enfin, il semble générer des résultats incohérents par rapport aux scripts qu'il analyse. Cependant, la documentation étant succinte, ce dernier constat doit être nuancé car nous ne disposons d'aucune définition d'une dépendance au sens de Php_Depend, et encore moins de la notion de package. L'interprétation des résultats que nous avons obtenus est donc sujette à caution. A noter également que Php_Depend est un analyseur pur qui se contente de calculer des métriques. Il ne propose aucune optimisation ou modification du code qui permettrait de s'approcher du ratio idéal entre l'abstration et l'instabilité. Script php spécifique
<?php
abstract class foo
{
public function __construct() {}
public function doFoo() {}
}
class bar extends foo
{
public function __construct()
{
parent::__construct();
}
public function doBar()
{
parent::doFoo();
}
}
class complexComposite
{
public $bar = null;
public function __construct()
{
$this->bar = new bar();
}
}
class simpleComposite
{
public function __construct()
{
$bar = new bar();
}
}
class strange extends bar
{
public $foo = null;
public function __construct($object)
{
$this->foo = new $object();
}
}
$strange = new strange('bar');
?>
Fiche technique
|