Une implémentation Python de la métrique du logiciel ABC:
La métrique du logiciel ABC a été introduite par Jerry Fitzpatrick en 1997 pour surmonter les inconvénients du LOC. La métrique définit un score ABC comme un triplet de valeurs qui représentent la taille d'un ensemble d'instructions de code source. Un score ABC est calculé en comptant le nombre d'affectations (a), le nombre de branches (b) et le nombre de conditions (c) dans un programme. Le score ABC peut être appliqué à des méthodes, des fonctions, des classes, des modules ou des fichiers individuels dans un programme.
Le papier original de Fitzpatrick est, au moment de la rédaction, uniquement disponible via la machine Wayback, donc une copie de celle-ci est également incluse dans ce repo.
Le document répertorie les règles de comptage pour C, C ++ et Java, alors voici les règles que ce repo utilise pour Python:
else
, elif
, except
.assert
sans opérateur conditionnel. Installez les exigences dans votre environnement virtuel de choix, puis vous pouvez voir les arguments de ligne de commande disponibles:
$ python -m python_abc --help
usage: python_abc [-h] [--debug DEBUG] [--sort SORT] [--verbose VERBOSE] path
A python implementation of the ABC Software metric: https://en.wikipedia.org/wiki/ABC_Software_Metric
positional arguments:
path path to directory or file
optional arguments:
-h, --help show this help message and exit
--debug DEBUG display AST output for each element in the parsed tree
--sort SORT sort files from highest to lowest magnitude
--verbose VERBOSE display marked-up file
file.py
donné qui contient le texte suivant:
if a and b :
print ( a )
else :
print ( b )
a = sum ( i for i in range ( 1000 ) if i % 3 == 0 and i % 5 == 0 )
def f ( n ):
def inner ( n ):
return n ** 2
if n == 0 :
return 1
elif n == 1 :
return n
elif n < 5 :
return ( n - 1 ) ** 2
return n * pow ( inner ( n ), f ( n - 1 ), n - 3 )
Vous pouvez obtenir la sortie Barebones comme suit:
$ python -m python_abc /path/to/file.py
/path/to/file.py < 1, 7, 10> (12.2)
Passer le drapeau verbose
donnera plus de détails:
$ python -m python_abc file.py --verbose=true
cc | if a and b:
b | print(a)
c | else:
b | print(b)
|
abbcc | a = sum(i for i in range(1000) if i % 3 == 0 and i % 5 == 0)
|
| def f(n):
| def inner(n):
| return n ** 2
c | if n == 0:
| return 1
cc | elif n == 1:
| return n
cc | elif n < 5:
| return (n - 1) ** 2
bbb | return n * pow(inner(n), f(n - 1), n - 3)
file.py < 1, 7, 10> (12.2)
Si vous souhaitez inspecter l'arborescence de syntaxe abstraite pour le fichier, vous pouvez passer l'indicateur debug
, qui imprimera chaque nœud de l'arborescence et le vecteur qui en résulte.
L'argument path
peut également être un chemin d'accès à un répertoire, auquel cas tous les fichiers Python de ce répertoire (et ses sous-répertoires) seront analysés, à quel point il peut être utile pour passer le drapeau sort
pour classer les fichiers par ABC ampleur:
$ python -m python_abc . --sort
./calculate.py < 18, 56, 23> (63.2)
./vector.py < 12, 23, 11> (28.2)
./main.py < 10, 23, 8> (26.3)
./tests/test_vector.py < 4, 19, 10> (21.8)
./tests/__init__.py < 4, 12, 1> (12.7)
./tests/test_radon_test_cases.py < 1, 2, 1> (2.4)
./tests/test_calculate_condition.py < 1, 2, 1> (2.4)
./tests/test_calculate_empty.py < 1, 2, 1> (2.4)
./tests/test_calculate_assignment.py < 1, 2, 1> (2.4)
./tests/test_calculate_branch.py < 1, 2, 1> (2.4)
Enfin, vous pouvez passer un argument cores
pour indiquer à la bibliothèque combien de cœurs de processeur à utiliser. Par défaut, la bibliothèque essaiera d'utiliser tous les noyaux disponibles sur votre machine.