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/phpmetrics
brew install phpmetrics
composer require halleck45/phpmetrics

ou

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 Phar

Inté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