PhpMetrics
logiciel d'analyse statique pour PHP
www.phpmetrics.org - @Halleck45
Jean-François Lépine
@Halleck45
- Consultant en qualité logicielle et industrialisation
- Créateur de PhpMetrics, MutaTesting, BehatWizard...
- http://blog.lepine.pro
qualiboo.com
plate-forme de supervision de projet web

Analyse statique ?

Pourquoi un nouvel outil ?
phpdepend, phploc, messdetector...

Les outils sont supers !
Mais il faut savoir lire leurs rapports
Vision de PhpMetrics
Simple à utiliser
Facile à comprendre
Riche
Installation
wget https://github.com/Halleck45/PhpMetrics/raw/master/build/phpmetrics.phar
chmod +x phpmetrics.phar
mv phpmetrics.phar /usr/local/bin/phpmetricsbrew install phpmetricscomposer require halleck45/phpmetricsou
ou
Lancer l'analyse
phpmetrics \
report-html=report.html \
<dossier-des-sources>Format de sortie
- HTML
- JSON, CSV, XML
- Violations-XML
- SVG
Démo
Lire les rapports
Quelques métriques à surveiller
- Absence de cohésion des méthodes
- Couplage
- Complexité cyclomatique
- Indice de maintenabilité
- Complexité du système
Absence de cohésion des méthodes (LCOM)

Chemin 1
Chemin 2
La classe possède probablement 2 responsabilités
=violation du Single responsability principle
Couplage
-
Afferent coupling :
nombre de classes affectés par la classe
- Efferent coupling :
nombre de classes dont la classe reçoit les effet
Afferent coupling
Le PNEU est utilisé par plein de VOITURES
=La classe Pneu a un afferent coupling élévé
Pour être bénéfique aux voitures, le pneu doit être très très stable, résistant et solide
=la classe Pneu doit avoir un CRAP faible, une complexité faible et une couverture forte
Efferent coupling
La VOITURE utilise un chassis, un frein, des pneus, un moteur...
= la classe Voiture a un efferent coupling élevé
Pour éviter les problèmes de maintenance et d'évolutivité, il doit être possible de changer facilement le modèle du pneu.
=la classe voiture doit avoir une cohésion faible avec ses composants
Complexité cyclomatique et interval de Myer
function foo() {
$a = 1;
$b = array();
if($a == 1) {
foreach($b as $value) {}
}
switch($a) {
case 1:
break;
case 2:
break;
}
}Nombres de points de décisions dans le code
ccn = (1 + 4) = 5
directement lié aux cas de tests unitaires à réaliser
Interval de Myer
une distance supérieure à 10 est très mauvais signe
La complexité cyclomatique ne tient pas compte:
- du niveau d'imbrication (if dans des boucles)
- des opérateurs logiques
ccn:(ccn+nb opérateurs)
interval = 5:6
distance = 1
function foo() {
$a = 1;
$b = array();
if($a == 1 ||$a == 2) {
foreach($b as $value) {}
}
switch($a) {
case 1:
break;
case 2:
break;
}
}métriques d'Halstead
- basé sur la richesse (volume de variables) et la complexité logique (nombre d'opérateurs)
- formule basée sur un fondement empirique (valeur "en dur" pour un "développeur normal")
fournit une note sur :
- l'effort pour implémenter le code
- la difficulté d'accès du code
- le temps de lecture du code
Indice de maintenabilité
basée sur les métriques d'Halstead et la complexité cyclomatique
> 85
Très bon
> 65
code maintenable
< 65
code peu évolutif / maintenable
Complexité relative du système et des données
Basé sur:
- Les relations de la classe
- Le nombre de points d'entrées et de sortie de la classes (input / output variables)
Est ramenée au volume de code logique pour fournir un note relative
Fournit une vue générale de la complexité du projet
Tout doit être ponderé
Selon le rôle / la couche du composant
ccn(controlleur) != ccn(classe métier)

Se référer aux autres projets
http://blog.lepine.pro/industrialisation/bornes-pour-les-indicateurs-et-metriques/


Aller plus loin
Quelques options
--failure-condition="sum.loc > 8000 or avg.mi < 65"
# code 1 si plus de 8000 lignes de code au total ou si
# l'indice de maintenabilité moyen est inférieur à 65
--config=<fichier>
# utilisatin d'un fichier yaml
# recherche par défaut le fichier .phpmetrics[.dist].yml
--ignore-errors
# sera nécessaire si vous parsez du code PHP7 avec un moteur PHP5
--excluded-dirs="vendor|tests"
# par défaut les dépendances et les tests sont ignorés
self-update
# mettre à jour le PharIntégration continue

Graphique des violations

Vous aurez besoin du plugin Jenkins "Violations"
Évolutions des métriques
Vous aurez besoin du plugin Jenkins "Plot"


Au quotidien
Intégration à Symfony2, ZendServer, PhpStorm, npm, docker...
composer require halleck45/phpmetrics-collector-bundle 
Analyse continue des frameworks PHP
https://peteraba.com/blog/phpmetrics-of-popular-projects/

Le futur
"Plugins" ?
Détection de design patterns
https://github.com/Halleck45/DesignPatternDetector

Le futur de PhpMetrics
- Création d'une organisation sur Github
- Grande question: doit-on s'arrêter aux métriques ? (conseils, recommandations...)
- Question: faut-il des plugins ? (ex: plugin analyze-WordPress)
- Réécriture en Go ?
J'ai besoin d'aide
- Documentation
- Traduction en anglais
- Plus joli site
- Bugfixes...
Merci !
des questions ?
@Halleck45
https://goo.gl/l1Lkgk
Présentation de PhpMetrics
By Jean-François Lépine
Présentation de PhpMetrics
Logiciel d'analyse statique en PHP
- 1,855