Détecter les anomalies de conception d'un code PHP
www.phpmetrics.org - @Halleck45
@Halleck45
Chemin 1
Chemin 2
La classe possède probablement 2 responsabilités
=violation du Single responsability principle
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
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
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
function foo() {
$a = 1;
$b = array();
if($a == 1 || $a == 2) {
foreach($b as $value) {}
}
switch($a) {
case 1:
break;
case 2:
break;
}
}La complexité cyclomatique ne tient pas compte:
ccn:(ccn+nb opérateurs)
interval = 5:6
distance = 1
une distance supérieure à 10 est très mauvais signe
fournit une note sur :
basée sur les métriques d'Halstead et la complexité cyclomatique
> 85
Très bon
> 65
code maintenable
< 65
code peu évolutif / maintenable
wget https://github.com/phpmetrics/PhpMetrics/releases/download/v2.0.0-rc/phpmetrics.deb
sudo dpkg -i phpmetrics.debbrew install phpmetricssudo yaourt install -S phpmetricsMac
Debian, Ubuntu
ArchLinux
composer require "phpmetrics/phpmetrics:v2.0.0-rc"partout
phpmetrics \
report-html=<dossier-du-rapport-html> \
<dossier-des-sources>phpmetrics --report-html=/tmp/report symfony-console/Taille & volume
Taille & volume
Orienté objet
Taille & volume
Orienté objet
Complexité
Taille & volume
Orienté objet
Complexité
Probabilité de bugs
Taille & volume
Orienté objet
Complexité
Probabilité de bugs
Défauts de conception
Grosse mais pas incohérente
Algorithmes complexes, durs à lire et à comprendre
Bugs probables (doit être testée)
Symfony\Component\Console\Application
Symfony\Component\Console\Helper\Table
Symfony\Component\Console\Input\ArgvInput
Symfony\Component\Console\Helper\QuestionHelper
Symfony\Component\Console\Input\InputDefinition
...
Selon le rôle / la couche du composant
ccn(controlleur) != ccn(classe métier)
http://blog.lepine.pro/industrialisation/bornes-pour-les-indicateurs-et-metriques/
@Halleck45
https://goo.gl/uuIcWR